一、反编译
- 反编译代码工具
- 将需要反编译的代码片段移动至dex2jar的目录下,如下图红色框中所示
- 打开命令行,快捷方式 win+R,输入cmd,移动到dex2jar的目录下,输入命令d2j-dex2jar.bat classes.dex
- 操作执行后,可以看见目录下多了一个jar包,如下图所示
- 将jar包复制到jd-gui-window目录下,并打开jd-gui.exe,查看jar包的内容
- 反编译资源文件工具
- 将要反编译资源的apk放在与工具同样的目录下,打开命令行,跳转至工具目录下,并执行反编译指令
- 反编译成功后,可以看见多了一个app-release文件夹,里面的资源已经被反编译过的了
二、混淆
- java 代码混淆,proguard-rules.pro
#微信
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
#网易云信
-dontwarn com.netease.**
-keep class com.netease.** {*;}
# okhttp3
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
# eventbus
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
# glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-keepclasseswithmembers class com.activity.** {*;}
-keepclasseswithmembers class com.model.** { *; }
-keepclasseswithmembers class com.util.** {public *** *(***);}
- 常用自定义混淆规则
#不混淆某个类
-keep public class com.example.Test { *; }
#不混淆某个包所有的类
-keep class com.test.** { *; }
#不混淆某个类的子类
-keep public class * extends com.example.Test { *; }
#不混淆所有类名中包含了“model”的类及其成员
-keep public class com.** {*;}
#不混淆某个接口的实现
-keep class * implements com.example.Interface { *; }
#不混淆某个类的构造方法
-keepclassmembers class com.example.Test {
public <init>(); -> 匹配被public修饰的构造方法
}
#不混淆某个类的特定的方法
-keepclassmembers class com.example.Test {
public void test(java.lang.String); -> 匹配传参为String类型的方法
}
#保留某些类及某些成员方法
-keepclassmembers public class * extends android.view.View {
public void *(android.view.View); ->匹配传参为View的任意方法
public static <fields>; -> 匹配被static修饰的区域
public *** <methods>; -> 匹配被public修饰的任意类型的方法
public *** *(***); -> 核心
void set*(***);
*** get*();
}
-
常用不混淆类
Android四大组件、Application、自定义View、数据模型Model、第三方开源库、反射方法、枚举Enum、序列化Parcelable、WebView的JS调用接口 - 资源文件混淆,使用微信开源工具AndResGuard,进入tool_output目录
- 将需要混淆的apk和与之对应的签名密钥准备好
- 配置config.xml文件,其中value是key的密码
- 切换到tool_output目录下,并执行混淆语句
- 混淆成功后,可以发现目录下多了一个app的文件夹
- 进入app文件夹,其中app_signed.apk就是我们所需要的apk
-
混淆关键字详解
-keep 指定需要保留的类和类成员
-keepclassmembers 指定需要保留的类成员:变量或者方法
-keepclasseswithmembers 指定保留的类和类成员,条件是所指定的类成员都存在
-keepnames 指定要保留名称的类和类成员,仅用于模糊处理
-keepclassmembernames 指定要保留名称的类成员,仅用于模糊处理
-keepclasseswithmembernames 指定要保留名称的类成员,仅用于模糊处理
-keepattributes SourceFile,LineNumberTable 保留行号
-keepdirectories 指定要保持的目录结构
-keepattributes Signature 保持泛型
-dontwarn 压缩,如果有警告也不终止
-ignorewarnings 忽略警告,避免打包时某些警告出现
-optimizationpasses 指定压缩级别
-dontusemixedcaseclassnames 包名不混合大小写
-dontskipnonpubliclibraryclassmembers 不跳过非公共的库的类成员
<field> 匹配类中的所有字段
<method> 匹配类中的所有方法
<init> 匹配类中的所有构造函数
* 匹配任意长度字符,但不含包名分隔符(.)
** 匹配任意长度字符,并且包含包名分隔符(.)
*** 匹配任意参数类型
… 匹配任意长度的任意类型参数
三、真机调试
1、更改(app)build.grade文件,Tip:手机通过USB安装的Apk属于Debug版本
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.singApk"
minSdkVersion 21 -> 以免真机不能安装apk
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs { //配置apk签名信息,二选一
debug { //生成调试版的apk
storeFile file("../debug.keystore")
}
release { //生成正式版的apk
keyAlias 'keyAlias'
keyPassword 'keyPassword '
storeFile file('../debug.keystore')
storePassword 'storePassword '
}
}
2、更改AndroidStudio的配置,选择 File -> setting -> Build,Execution,Deployment -> Instant Run
取消勾选框里的选项
3、真机的权限允许
不同的厂商有不同的权限配置,需根据不同的手机,自行搜索需要允许的权限
四、资源目录分类
当资源文件数量足够庞大的时候,为方便日后开发及维护,建议将资源文件分包管理
android { -> app.build
sourceSets{
main{
res.srcDirs=
[
'src/main/res/layout/activity',
'src/main/res/layout/fragment',
'src/main/res/layout/adapter',
'src/main/res/layout/popwindow',
'src/main/res/layout/dialog',
'src/main/res/layout',
'src/main/res'
]
}
}
}
将layout文件分类
网友评论