android 程序反编译、通过添加proguard.cfg文件实现代码混淆防止反编译
1.对android apk进行反编译查看源代码
准备一个apk,并对其进行解压缩
解压后得到以下目录
在这里可以查看程序中用到的所有图片资源,但看不到所有的代码,都是乱码。这里需要用到dex2jar,这个工具进行反编译,下载这个工具后,存到本地,比如我的地址是D:\apk2java\dex2jar-0.0.9.13
复制classes.dex这个文件到这个文件夹下
上图就是复制进去后dex2jar-0.0.9.13这个文件夹的目录,打开控制台,定位到该文件夹,并使用dex2jar.bat对classes.dex文件进行编译
最后输出done,说明编译完成,这个时候dex2jar-0.0.9.13这个文件夹中会多出一个文件classes_dex2jar.jar,现在需要第二个工具jd-gui
下载后,打开jd-gui这个程序
在这个工具中打开classes_dex2jar.jar这个文件File->Open File
这个时候就可以看到apk代码的目录,若未进行过防止反编译的操作,在这里就能看到项目源码,若已做过防止反编译的操作,这里所有的类名都会用字母代替,代码随不是乱码,带也看不懂其中的逻辑操作。
2.进行代码混淆,防止反编译
若项目中没有proguard.cfg文件,手动添加
新建文本,输入以下代码
-dontwarn //若项目中导入了第三方jar包,需要添加该行 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -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 com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
重命名文本为proguard.cfg
将该文件复制到项目中,与AndroidManifest.xml文件在同一层
打开project.properties文件,添加以下内容
proguard.config=proguard.cfg
保存,右击项目名->Android-Tools->Export Unsigned Application Package
生成项目apk,混淆完成
若该过程中报 java.io.IOException: Please correct the above warnings这个错误,可能是忘记在proguard.cfg中添加 -dontwarn 添加后重试。