1、反编译工具
(1)apktool
主要用于资源文件的获取
java -jar apktool_2.4.0.jar d app-debug.apk -o dir
在反编译之后,生成一个文件夹,文件夹中包含assets、res等等资源文件。
(2)dex2jar
将apk中的dex文件编译成jar文件
d2j-dex2jar.bat app-debug.apk -o app-debug.jar
(3)jd-jui
查看反编译后jar文件中的class
(4)jadx
直接查看apk
通过jadx可以直接查看apk中的源码,但是是已经被混淆过的了。
2、混淆配置 proguard
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
在进行混淆的时候,有一个默认混淆规则proguard-android-optimize.txt
,还有一个文件proguard-rules.pro
,可以自定义混淆规则。
在build—intermediates—proguard_files目录下,有默认的混淆规则。
(1)-keep
指定类和成员不能被混淆
-keep @android.support.annotation.Keep class * {
*;}
-keep @androidx.annotation.Keep class * {
*;}
如果在默认的混淆规则中,没有对该类进行设置,那么就需要在proguard-rules.pro
文件中声明。
在项目中添加一个User类,并没有去引用,那么混淆之后,该类就会被移除。
引用之后,就会参与混淆,但是如果不想让某个类参与混淆,有两种方式。
1—在实体类添加@Keep注解
@Keep
public class User {
String name;
int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
2-----在自定义proguard-rules.pro
中声明这个类不能被混淆
//-keep关键字 加上该类的全类名
-keep class com.example.myapplication.User
(2)-keepclassmembers
指定类成员不被混淆
//类中的native方法不参与混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
//继承自View的类中的set和get方法不能被混淆
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.