赞
踩
最近研究了一下代码的混淆,总结如下:
1.build文件中minifyEnabled设置为true,然后开始配置proguard-rules.pro文件中的内容,分为三部分吧
1)可以直接复制粘贴的,不需要做任何修改的固定内容
- #压缩等级,一般选择中间级别5
- -optimizationpasses 5
- #包名不混合大小写
- -dontusemixedcaseclassnames
- #不去忽略非公共的库类
- -dontskipnonpubliclibraryclasses
- #优化 不优化输入的类文件
- -dontoptimize
- #预校验
- -dontpreverify
- #混淆时采用的算法
- -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
- #保护注解
- -keepattributes *Annotation*
- #保持下面的类不被混淆(没有用到的可以删除掉,比如没有用到service则可以把service行删除)
- -keep public class * extends android.app.Fragment
- -keep public class * extends android.app.Activity
- -keep public class * extends android.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.preference.Preference
- -keep public class * extends android.support.v4.app.FragmentActivity
- -keep public class * extends android.support.** { *;}
- #如果引用了v4或者v7包
- -dontwarn android.support.*
- #忽略警告(开始应该注释掉,让他报错误解决,最后再打开,警告要尽量少)
- -ignorewarnings
- #####################记录生成的日志数据,gradle build时在本项目根目录输出################
- #混淆时是否记录日志
- -verbose
- #apk 包内所有class 的内部结构
- -dump class_files.txt
- #为混淆的类和成员
- -printseeds seeds.txt
- #列粗从 apk 中删除的代码
- -printusage unused.txt
- #混淆前后的映射
- -printmapping mapping.txt
- #####################记录生成的日志数据,gradle build时在本项目根目录输出结束################
- #本地的R类不要被混淆,不然就找不到相应的资源
- -keep class **.R$*{ public static final int *; }
- #保持内部类,异常类
- -keepattributes Exceptions, InnerClasses
- #保持泛型、注解、源代码之类的不被混淆
- -keepattributes Signature, Deprecated, SourceFile
- -keepattributes LineNumberTable, *Annotation*, EnclosingMethod
- #保持自定义控件不被混淆(没有就不需要)
- -keepclasseswithmembers class * extends android.app.Activity{
- public void *(android.view.View);
- }
- -keepclasseswithmembers class * extends android.supprot.v4.app.Fragment{
- public void *(android.view.View);
- }
- #保持 Parcelable 不被混淆(没有就不需要)
- -keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
- }
- #保持 Serializable 不被混淆(没有就不需要)
- -keepnames class * implements java.io.Serializable
- -keepclassmembers class * {
- public void *ButtonClicked(android.view.View);
- }

- -keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
- }
2)第三方的jar包,需要去相应的官网查询混淆规则,举几个例子如下
- # gson工具不需要混淆
- -dontwarn com.google.gson**
- -keep class com.google.gson.**{*;}
-
-
- # volley
- -dontwarn com.android.volley.jar.**
- -keep class com.android.volley.**{*;}
-
- #友盟混淆配置start
- -keepclassmembers class * {
- public <init> (org.json.JSONObject);
- }
- -keep public class com.hawk.android.hicamera.R$*{
- *;
- }
- #友盟混淆配置end
-
-
- #极光推送混淆配置
- -dontoptimize
- -dontpreverify
- -dontwarn cn.jpush.**
- -keep class cn.jpush.** { *; }

- -dontwarn com.tencent.**
- -keep class com.tencent.**{*;}
-
- # apache
- -dontwarn org.apache.http.**
- -keep class org.apache.http.** { *;}
2.代码混淆成功了还有一个地方要配置一下,很有用的:
- buildTypes {
- release {
- // 如果没有提供混淆规则文件,则设置默认的混淆规则文件(SDK/tools/proguard/proguard-android.txt)
- pseudoLocalesEnabled true
- // 不显示Log
- buildConfigField "boolean", "LOG_DEBUG", "false"
- //混淆
- minifyEnabled true
- //Zipalign优化
- zipAlignEnabled true
- // 移除无用的resource文件
- shrinkResources true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。