首页天道酬勤Android混淆打包和APK反编译

Android混淆打包和APK反编译

admin 09-27 17:10 96次浏览
作为一名Android 开发人员,应用的安全性至关重要,其中,混淆打包是很有效的一种手段,这在一定程度上提高了APK反编译后的代码理解难度,相对而言,APK反编译也可以为开发者提供更好地源码学习资源,这些往往都是相互作用的。


一、混淆打包


1、在Android 工程的app目录下,新建一个proguard-rules.cfg文件,内容如下,我在网上找到一个混淆的配置


#指定代码的压缩级别-optimizationpasses 5#包明不混合大小写-dontusemixedcaseclassnames#不去忽略非公共的库类-dontskipnonpubliclibraryclasses #优化 不优化输入的类文件-dontoptimize #预校验-dontpreverify #混淆时是否记录日志-verbose # 混淆时所采用的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#保护注解-keepattributes *Annotation*# 保持哪些类不被混淆-keep public class * extends android.app.Fragment-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keep public class com.android.vending.licensing.ILicensingService#如果有引用v4包可以添加下面这行-keep public class * extends android.support.v4.app.Fragment#忽略警告-ignorewarning#####################记录生成的日志数据,gradle build时在本项目根目录输出#################apk 包内所有 class 的内部结构-dump class_files.txt#未混淆的类和成员-printseeds seeds.txt#列出从 apk 中删除的代码-printusage unused.txt#混淆前后的映射-printmapping mapping.txt#####################记录生成的日志数据,gradle build时 在本项目根目录输出-end################################混淆保护自己项目的部分代码以及引用的第三方jar包library##########################-libraryjars libs/umeng-analytics-v5.2.4.jar#-libraryjars libs/alipaysdk.jar#-libraryjars libs/alipaysecsdk.jar#-libraryjars libs/alipayutdid.jar#-libraryjars libs/wup-1.0.0-SNAPSHOT.jar#-libraryjars libs/weibosdkcore.jar#三星应用市场需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar#-libraryjars libs/sdk-v1.0.0.jar#-libraryjars libs/look-v1.0.1.jar#我是以libaray的形式引用了一个图片加载框架,如果不想混淆 keep 掉-keep class com.nostra13.universalimageloader.** { *; }#友盟-keep class com.umeng.**{*;}#支付宝-keep class com.alipay.android.app.IAliPay{*;}-keep class com.alipay.android.app.IAlixPay{*;}-keep class com.alipay.android.app.IRemoteServiceCallback{*;}-keep class com.alipay.android.app.lib.ResourceMap{*;}#信鸽推送-keep class com.tencent.android.tpush.** {* ;}-keep class com.tencent.mid.** {* ;}#自己项目特殊处理代码#忽略警告-dontwarn com.veidy.mobile.common.**#保留一个完整的包-keep class com.veidy.mobile.common.** { *; }-keep class com.veidy.activity.login.WebLoginActivity{*;}-keep class com.veidy.activity.UserInfoFragment{*;}-keep class com.veidy.activity.HomeFragmentActivity{*;}-keep class com.veidy.activity.CityActivity{*;}-keep class com.veidy.activity.ClinikActivity{*;}#如果引用了v4或者v7包-dontwarn android.support.**############混淆保护自己项目的部分代码以及引用的第三方jar包library-end##################-keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...);}#保持 native 方法不被混淆-keepclasseswithmembernames class * { native <methods>;}#保持自定义控件类不被混淆-keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet);}#保持自定义控件类不被混淆-keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int);}#保持自定义控件类不被混淆-keepclassmembers class * extends android.app.Activity { public void *(android.view.View);}#保持 Parcelable 不被混淆-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;}#保持 Serializable 不被混淆-keepnames class * implements java.io.Serializable#保持 Serializable 不被混淆并且enum 类也不被混淆-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; !private <fields>; !private <methods>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可#-keepclassmembers enum * {# public static **[] values();# public static ** valueOf(java.lang.String);#}-keepclassmembers class * { public void *ButtonClicked(android.view.View);}#不混淆资源类-keepclassmembers class **.R$* { public static <fields>;}#避免混淆泛型 如果混淆报错建议关掉#–keepattributes Signature#移除log 测试了下没有用还是建议自己定义一个开关控制是否输出日志#-assumenosideeffects class android.util.Log {# public static boolean isLoggable(java.lang.String, int);# public static int v(...);# public static int i(...);# public static int w(...);# public static int d(...);# public static int e(...);#}# webview + js-keepattributes *JavascriptInterface*# keep 使用 webview 的类-keepclassmembers class com.veidy.activity.WebViewActivity { public *;}# keep 使用 webview 的类的所有的内部类-keepclassmembers class com.veidy.activity.WebViewActivity$*{ *;}


2、打开 app 目录下的 build.gradle 文件,把 minifyEnabled 设为 true,并把混淆的配置文件改为 proguard-rules.cfg


android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.zyq.testapp3" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { // 是否混淆打包 minifyEnabled true // 混淆打包的配置文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.cfg' } }}


3、以上工作完成,我们开始混淆打包,点击菜单栏 Build ->> Generate Signed APK,如果有 Key Store 和 key alias,则直接配置,然后输入密码,否则自己创建一个,接着点击 next



4、选择要生成 APk 的目录,选择版本,这里我选择 release 版本,最后点击 finish




5、等待一会,看到在 app 目录下生成了一个 app-release.apk 文件,这就证明成功了




为了查看混淆打包后的具体结果,下面进行APK的反编译


二、APK反编译


 1、下载反编译工具 dex2jar 、jd-gui

1)dex2jar :CSDN的资源下载链接

2)jd-gui :CSDN的资源 jd-gui 下载链接

  2、把 app-release.apk 的后缀改为 rar 或者 zip,进行解压后,得到 classes.dex 文件,把它放到dex2jar的解压文件夹下






3、win+R 进入命令行,切换到dex2jar.bat所在目录下,执行命令 dex2jar.bat  classes.dex,成功,会在当前目录下生成 classes_dex2jar.jar 这个文件




4、执行 jd-gui.exe 程序,进入后,点击 file ->> open file ,找到 classes_dex2jar.jar 这个文件打开,我们就能看到反编译后的Java代码,如果里面有 a、b、c、d、e、f... 这些,就说明我们混淆打包是有效的




以上就是混淆打包和APK反编译的具体内容,谢谢!


如何从数据角度为人工智能部署做好数据准备 双绞线网线线序及制作方法