android 程序反编译、通过添加proguard.cfg文件实现代码混淆防止反编译

1.对android apk进行反编译查看源代码

准备一个apk,并对其进行解压缩

解压后得到以下目录

在这里可以查看程序中用到的所有图片资源,但看不到所有的代码,都是乱码。这里需要用到dex2jar,这个工具进行反编译,下载这个工具后,存到本地,比如我的地址是D:apk2javadex2jar-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  添加后重试。

原文地址:https://www.cnblogs.com/dcxz/p/3718581.html