大家好,我是你的好朋友思创斯。今天说一说android混淆工具_android框架有哪些,希望您对编程的造诣更进一步.
- 1、日常开发debug包时不用混淆,正式发布release包前开启代码混淆;
- 2、混淆好处① → 类、方法、变量名变成短且无意义的名字,提高反编译后代码的阅读成本;
- 3、混淆好处② → 删除无用的类、方法与属性,缩减了apk包的大小;
- 4、混淆好处③ → 对字节码进行优化,移除无用指令,应用运行更快;
- 5、怎么混淆 → 主项目的
build.gradle
设置minifyenabled true
,proguard-rules.pro
加入混淆规则; - 6、混淆规则哪里来 → 网上搜索通用混淆模板复制粘贴,项目依赖到的第三方库官方文档复制粘贴;
app层级的build.gradle加下release的签名和编译配置:
signingconfigs {
release {
storefile file('../test.jks')
storepassword '123456'
keyalias 'test'
keypassword '123456'
}
}
buildtypes {
release {
// 启用代码压缩、优化及混淆
minifyenabled true
// 启用资源压缩,需配合 minifyenabled=true 使用
shrinkresources true
// 指定混淆保留规则
proguardfiles getdefaultproguardfile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// 包签名
signingconfig signingconfigs.release
}
}
是否还在为ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!
【正版授权,激活自己账号】:
【官方授权 正版激活】:
1. 混淆设置参数
-optimizationpasses 5 # 代码混淆的压缩比例,值介于0-7,默认5
-verbose # 混淆时记录日志
-dontoptimize # 不优化输入的类文件
-dontshrink # 关闭压缩
-dontpreverify # 关闭预校验(作用于java平台,android不需要,去掉可加快混淆)
-dontoptimize # 关闭代码优化
-dontobfuscate # 关闭混淆
-ignorewarnings # 忽略警告
-dontwarn com.squareup.okhttp.** # 指定类不输出警告信息
-dontusemixedcaseclassnames # 混淆后类型都为小写
-dontskipnonpubliclibraryclasses # 不跳过非公共的库的类
-printmapping mapping.txt # 生成原类名与混淆后类名的映射文件mapping.txt
-useuniqueclassmembernames # 把混淆类中的方法名也混淆
-allowaccessmodification # 优化时允许访问并修改有修饰符的类及类的成员
-renamesourcefileattribute sourcefile # 将源码中有意义的类名转换成sourcefile,用于混淆具体崩溃代码
-keepattributes sourcefile,linenumbertable # 保留行号
-keepattributes *annotation*,innerclasses,signature,enclosingmethod # 避免混淆注解、内部类、泛型、匿名类
-optimizations !code/simplification/cast,!field/ ,!class/merging/ # 指定混淆时采用的算法
复制代码
2. 保持不被混淆的设置
语法组成:
[保持命令] [类] {
[成员]
}
复制代码
保持命令:
-keep # 防止类和类成员被移除或被混淆;
-keepnames # 防止类和类成员被混淆;
-keepclassmembers # 防止类成员被移除或被混淆;
-keepclassmembernames # 防止类成员被混淆;
-keepclasseswithmembers # 防止拥有该成员的类和类成员被移除或被混淆;
-keepclasseswithmembernames # 防止拥有该成员的类和类成员被混淆;
复制代码
类:
具体的类
访问修饰符
→ public、private、protected通配符(*)
→ 匹配任意长度字符,但不包含包名分隔符(.)通配符(**)
→ 匹配任意长度字符,且包含包名分隔符(.)extends
→ 匹配实现了某个父类的子类implements
→ 匹配实现了某接口的类$
→ 内部类
成员:
- 匹配所有构造器 →
- 匹配所有域 →
- 匹配所有方法 →
访问修饰符
→ public、private、protected- 除了
*
和**
通配符外,还支持***
通配符,匹配任意参数类型 ...
→ 匹配任意长度的任意类型参数,如void test(…)可以匹配不同参数个数的test方法
常用自定义混淆规则范例:
# 不混淆某个类的类名,及类中的内容
-keep class cn.coderpig.myapp.example.test { *; }
# 不混淆指定包名下的类名,不包括子包下的类名
-keep class cn.coderpig.myapp*
# 不混淆指定包名下的类名,及类里的内容
-keep class cn.coderpig.myapp* {*;}
# 不混淆指定包名下的类名,包括子包下的类名
-keep class cn.coderpig.myapp**
# 不混淆某个类的子类
-keep public class * extends cn.coderpig.myapp.base.basefragment
# 不混淆实现了某个接口的类
-keep class * implements cn.coderpig.myapp.dao.daoimp
# 不混淆类名中包含了"entity"的类,及类中内容
-keep class **.*entity*.** {*;}
# 不混淆内部类中的所有public内容
-keep class cn.coderpig.myapp.widget.customview$onclickinterface {
public *;
}
# 不混淆指定类的所有方法
-keep cn.coderpig.myapp.example.test {
public ;
}
# 不混淆指定类的所有字段
-keep cn.coderpig.myapp.example.test {
public ;
}
# 不混淆指定类的所有构造方法
-keep cn.coderpig.myapp.example.test {
public ;
}
# 不混淆指定参数作为形参的方法
-keep cn.coderpig.myapp.example.test {
public (java.lang.string);
}
# 不混淆类的特定方法
-keep cn.coderpig.myapp.example.test {
public test(java.lang.string);
}
# 不混淆native方法
-keepclasseswithmembernames class * {
native ;
}
# 不混淆枚举类
-keepclassmembers enum * {
public static **[] values();
public static ** valueof(java.lang.string);
}
#不混淆资源类
-keepclassmembers class **.r$* {
public static ;
}
# 不混淆自定义控件
-keep public class * entends android.view.view {
*** get*();
void set*(***);
public ;
}
# 不混淆实现了serializable接口的类成员,此处只是演示,也可以直接 *;
-keepclassmembers class * implements java.io.serializable {
static final long serialversionuid;
private static final java.io.objectstreamfield[] serialpersistentfields;
private void writeobject(java.io.objectoutputstream);
private void readobject(java.io.objectinputstream);
java.lang.object writereplace();
java.lang.object readresolve();
}
# 不混淆实现了parcelable接口的类成员
-keep class * implements android.os.parcelable {
public static final android.os.parcelable$creator *;
}
# 注意事项:
#
# ① jni方法不可混淆,方法名需与native方法保持一致;
# ② 反射用到的类不混淆,否则反射可能出问题;
# ③ 四大组件、application子类、framework层下的类、自定义的view默认不会被混淆,无需另外配置;
# ④ webview的js调用接口方法不可混淆;
# ⑤ 注解相关的类不混淆;
# ⑥ gson、fastjson等解析的bean数据类不可混淆;
# ⑦ 枚举enum类中的values和valuesof这两个方法不可混淆(反射调用);
# ⑧ 继承parceable和serializable等可序列化的类不可混淆;
# ⑨ 第三方库或sdk,请参考第三方提供的混淆规则,没提供的话,建议第三方包全部不混淆;
来源: https://juejin.cn/post/6966526844552085512
文章由思创斯整理,转载请注明出处:https://ispacesoft.com/141424.html