Android常用代码混淆模板
2018-03-14 21:48
387 查看
Ⅰ.简述
混淆的概念:将Android项目进行打包之时,可以将项目里的包名、类名、变量名进行更改,使得代码不容易泄露,类似于对其apk中的文件加密.混淆的作用:1.增加Apk反编译之后代码泄露的困难性2.生成的apk体积会缩小什么是混淆?Android SDK 本身就提供混淆的功能,将混淆开关进行开启后,开发者需要做的是对Android Studio工程项目中的proguard-rules.pro文件进行混淆白名单的配置.那么什么是混淆白名单呢?其实就是指定一些包名、类名、变量等不可以被混淆。假设没指定白名单就进行混淆打包,而某某类的类名被混淆了(假设变成了a),那么可能其他引用或使用该类的类就找不到该类,说不定应用就会因此崩溃或是导致相应的功能无法使用.那么所谓的混淆也就是配置混淆白名单,那么下面看看混淆之后的apk的内部结构.可以看到红圈圈出来的部分都是进行混淆的,而有部分是没有进行混淆的,比如黑圈圈出来的属性动画兼容库nineoldandroids,其包名类名就没有变成abc这样的代替符,比如我们经常看见一些第三方的sdk中的jar,很多类都是a,b,c,d...等方式展示的结构,这就混淆后的结果。如下图,是本人反编译过后的APP的目录结构,就是被混淆过。Ⅱ.开始混淆
1.开启混淆开关
混淆的开关在项目/app/build.gradle文件里,看下面的截图,将minifyEnabled设置为true就是开启混淆,关于下面的配置代码可以直接写在build.gradle文件的android节点下代码混淆一般是在上线前的apk打包才会去配置混淆开启,要是忘记配置的代码,那怎么办呢?直接进去Project Structrue,然后根据下面截图所标识的进行设置,如此这般,只要打release包就是开启混淆进行打包的.2.设置混淆白名单
基于Android Studio创建的项目里有一文件名称为”proguard-rules.pro”的文件,路径是”项目/app/proguard-rules.pro”,没经过编辑之前,里面只有一些注释的代码,如下图Ⅲ.实际混淆指令
在应用中,大多数的混淆指令是已经确定的了,比如下面的基本指令部分,基本不用修改的。而其他的混淆指令,比如第三方的SDK/框架的混淆指令一般在其官方文档都可以找到,所以相对来说还是比较方便的,下面将这几天归类的混淆指令总结下.基本指令:# 设置混淆的压缩比率 0 ~ 7 -optimizationpasses 5 # 混淆后类名都为小写 Aa aA -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses #不做预校验的操作 -dontpreverify # 混淆时不记录日志 -verbose # 混淆采用的算法. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #保留代码行号,方便异常信息的追踪 -keepattributes SourceFile,LineNumberTable #dump文件列出apk包内所有class的内部结构 -dump class_files.txt #seeds.txt文件列出未混淆的类和成员 -printseeds seeds.txt #usage.txt文件列出从apk中删除的代码 -printusage unused.txt #mapping文件列出混淆前后的映射 -printmapping mapping.txt避免混淆Android基本组件,下面是兼容性比较高的规则:
-keep public class * extends android.app.Activity -keep public class * extends android f46c .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 * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService #不提示V4包下错误警告 -dontwarn android.support.v4.** #保持下面的V4兼容包的类不被混淆 -keep class android.support.v4.**{*;}避免混淆所有native的方法,涉及到C、C++
-keepclasseswithmembernames class * { native <methods>; }避免混淆自定义控件类的get/set方法和构造函数
-keep public class * extends android.view.View{ *** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet,int); }避免混淆枚举类
-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }避免混淆序列化类
#不混淆Parcelable和它的实现子类,还有Creator成员变量 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } #不混淆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(); }避免混淆JSON类的构造函数
#使用GSON、fastjson等框架时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象 -keepclassmembers class * { public <init>(org.json.JSONObject); }避免混淆第三方SDK
# ==================环信混淆start================= -keep class com.hyphenate.** {*;} -dontwarn com.hyphenate.** # ==================环信end====================== # ==================bugly start================== -dontwarn com.tencent.bugly.** -keep public interface com.tencent.** -keep public class com.tencent.** {*;} -keep public class com.tencent.bugly.**{*;} # ==================bugly end==================== # ===============百度定位 start==================== -keep class vi.com.gdi.** { *; } -keep public class com.baidu.** {*;} -keep public class com.mobclick.** {*;} -dontwarn com.baidu.mapapi.utils.* -dontwarn com.baidu.platform.comapi.b.* -dontwarn com.baidu.platform.comapi.map.* # ===============百度定位 end====================== //备注:其他的第三方包的混淆指令可以到其官方文档去拷贝避免混淆第三方框架
# ==================picasso框架 start===============-keep class com.parse.*{ *; }-dontwarn com.parse.**-dontwarn com.squareup.picasso.**-keepclasseswithmembernames class * { native <methods>; }# ==================picasso end====================# ==================EventBus start=================-keep class org.greenrobot.** {*;}-keep class de.greenrobot.** {*;}-keepclassmembers class ** {public void onEvent*(**);void onEvent*(**);}# ==================EventBus end===================# ==================okhttp start===================-dontwarn com.squareup.okhttp.**-keep class com.squareup.okhttp.** { *;}-dontwarn okio.**-keep class okio.**{*;}-keep interface okio.**{*;}# ==================okhttp end=====================//备注:其它框架的混淆指令可以到其官方文档去拷贝其它混淆指令
#避免混淆属性动画兼容库-dontwarn com.nineoldandroids.*-keep class com.nineoldandroids.** { *;}#不混淆泛型-keepattributes Signature#避免混淆注解类-dontwarn android.annotation-keepattributes *Annotation*#避免混淆内部类-keepattributes InnerClasses#避免混淆实体类,修改成你对应的包名-keep class com.wyk.test.bean.** { *; }-keep class com.wyk.test.event.** { *; }-keep public class com.wyk.test.utils.eventbus.** { *;}#避免混淆Rxjava/RxAndroid-dontwarn sun.misc.**-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {long producerIndex;long consumerIndex;}-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {rx.internal.util.atomic.LinkedQueueNode producerNode;}-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {rx.internal.util.atomic.LinkedQueueNode consumerNode;}#避免混淆js相关的接口-keepattributes *JavascriptInterface*-keep class com.wyk.test.js.** { *; }
Ⅳ.混淆配置注意点
1.假设当配置 “-libraryjars libs/jpush-android-2.1.6.jar” 对jar包进行混淆白名单化,如果gradle报错的话,可以考虑注释掉(格式:-libraryjars [jar包名])这样的配置信息.采用下面的配置信息进行替换
-dontwarn cn.jpush.**-keep class cn.jpush.** { *; }
2.下面是对属性动画兼容库的混淆白名单配置信息,刚开始觉得只是保持com.nineoldandroids包下的类不被混淆,后来经过反编译混淆后的apk包,发现效果是”不混淆该class com.nineoldandroids包下的类、子包和子包的类,也不混淆其中类的成员变量.
-keep class com.nineoldandroids.** { *;}更多常考:https://www.jianshu.com/p/f3455ecaa56e
相关文章推荐
- Android 代码混淆语法讲解及常用模板
- Android代码混淆的一个常用的简单例子
- AndroidStudio代码混淆应用加固模板
- android 代码混淆模板
- Android常用代码混淆的简单解释
- android 常用第三方包的代码混淆
- Android常用框架混淆代码
- Android 常用代码混淆语法
- Android常用框架混淆代码
- Android 代码混淆(常用框架混淆配置)
- Android常用框架混淆代码
- Android常用框架混淆代码
- 收集一些Android常用混淆代码
- 一些Android常用的代码模板,留着拷贝使用
- Android代码混淆常用设置
- Android混淆代码proguard,内存溢出
- Android代码混淆的实践
- Android 代码混淆
- Android 开发常用代码片段
- android 常用代码片段