赞
踩
-keep class per.amon.module.lib.** { *; }
buildTypes { release { // 1、是否进行混淆 minifyEnabled true // 2、开启zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗 zipAlignEnabled true // 3、移除无用的resource文件:当ProGuard 把部分无用代码移除的时候, // 这些代码所引用的资源也会被标记为无用资源,然后系统通过资源压缩功能将它们移除。 // 需要注意的是目前资源压缩器目前不会移除values/文件夹中定义的资源(例如字符串、尺寸、样式和颜色) // 目前项目中用不到,设置成false 或不添加下方属性,仅做了解 // shrinkResources false // 4、混淆文件的位置,其中 proguard-android.txt 为sdk默认的混淆配置, // 它的位置位于android-sdk/tools/proguard/proguard-android.txt, // 此外,proguard-android-optimize.txt 也为sdk默认的混淆配置, // 但是它默认打开了优化开关。并且,我们可在配置混淆文件将android.util.Log置为无效代码, // 以去除apk中打印日志的代码。而 proguard-rules.pro 是该模块下的混淆配置。 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
选择release版本
Android studio 左侧工具栏 -》Build Variants -》 主模块的 Active Build Variant 选择 release
构建APK或AAR
Android studio 顶部工具栏 -》Build -》 Build Bundle(s)/APK(s) -> Build APK
或
Android studio 右侧工具栏 -》Gradle -》双击运行 项目名/模块名/Tasks/build/assemble
在app/build/outputs/mapping/release/目录下
mapping.txt提供混淆前后类、方法、类成员等的对照表
seeds.txt列出没有被混淆的类和成员
usage.txt列出被移除的代码
混淆结果查看方式
代码混淆是包含了代码压缩、优化、混淆等一系列行为的过程。如上图所示,混淆过程会有如下几个功能:
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
这行代码定义了混淆规则由两部分构成:位于 SDK 的 tools/proguard/ 文件夹中的 proguard-android.txt 的内容以及默认放置于模块根目录的 proguard-rules.pro 的内容。前者是 SDK 提供的默认混淆文件(内容见附录1),后者是开发者自定义混淆规则的地方。
-keep public class name.huihui.test.** extends Android.app.Activity {<init>} 常用的自定义混淆规则 - 不混淆某个类 -keep public class name.huihui.example.Test { *; } - 不混淆某个包所有的类 -keep class name.huihui.test.** { *; } - 不混淆某个类的子类 -keep public class * extends name.huihui.example.Test { *; } - 不混淆所有类名中包含了“model”的类及其成员 -keep public class .*model*. {*;} - 不混淆某个接口的实现 -keep class * implements name.huihui.example.TestInterface { *; } - 不混淆某个类的构造方法 -keepclassmembers class name.huihui.example.Test { public <init>(); } - 不混淆某个类的特定的方法 -keepclassmembers class name.huihui.example.Test { public void test(java.lang.String); } # 保持所有类和成员的名称不被混淆 -keep class * { public protected private *; } # 忽略所有警告 -dontwarn * # 防止删除未直接使用的类和成员 -dontshrink # 禁用优化 #-dontoptimize # 不进行混淆 #-dontobfuscate
在 app module 下默认生成了项目的自定义混淆规则文件 proguard-rules.pro,多方调研后,一份适用于大部分项目的混淆规则最佳实践如下:
#指定压缩级别
-optimizationp
asses 5 #不跳过非公共的库的类成员 -dontskipnonpubliclibraryclassmembers #混淆时采用的算法 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #把混淆类中的方法名也混淆了 -useuniqueclassmembernames #优化时允许访问并修改有修饰符的类和类的成员 -allowaccessmodification #将文件来源重命名为“SourceFile”字符串 -renamesourcefileattribute SourceFile #保留行号 -keepattributes SourceFile,LineNumberTable #保持所有实现 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();} #Fragment不需要在AndroidManifest.xml中注册,需要额外保护下 -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment # 保持测试相关的代码 -dontnote junit.framework.** -dontnote junit.runner.** -dontwarn android.test.** -dontwarn android.support.test.** -dontwarn org.junit.**
1,jni方法不可混淆,因为这个方法需要和native方法保持一致;
-keepclasseswithmembernames class * { # 保持native方法不被混淆
native ;}
2,反射用到的类不混淆(否则反射可能出现问题);
3,AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的;
4,与服务端交互时,使用GSON、fastjson等框架解析服务端数据时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象;
5,使用第三方开源库或者引用其他第三方的SDK包时,如果有特别要求,也需要在混淆文件中加入对应的混淆规则;
6,有用到WebView的JS调用也需要保证写的接口方法不混淆,原因和第一条一样;
7,Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常;
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆 public static final Android.os.Parcelable$Creator *;}
8,使用enum类型时需要注意避免以下两个方法混淆,因为enum类的特殊性,以下两个方法会被反射调用,见第二条规则。
-keepclassmembers enum * {
public static [] values();
public static valueOf(java.lang.String);
}
参考文档 https://www.jianshu.com/p/cba8ca7fc36d
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。