您的位置:首页 > 移动开发 > Android开发

android的Proguard混淆

2016-07-13 17:11 405 查看
这几天在混淆代码过程中遇到好几个坑,所幸堵了《app研发录》这本书,帮了我的大忙。

现记录先后遇到的几个坑:

1. butterknife,在混淆时注意是6.0还是7.0,混淆方式不一样;

2. 实体bean不要混淆,这会影响到JSON的使用;

3. 内部类尽量独立出来,无法独立单独的class,要标记不要混淆;

4. 友盟sdk,打包时一直提醒几千个警告,目前不知怎么解决

其他方面,下面这篇博客也有很大帮助:

Android Proguard原理

第三方库的混淆可以参考:

各框架库混淆

另外,记录下我的proguard内容,很多部分是拜《App研发录》的帮助,有兴趣的可以看看这本书(非广告):

#---------------------------------------------基本设置-----------------------------------------------
-optimizationpasses 5   #代码混淆压缩比,0-7之间,默认5
-dontusemixedcaseclassnames   #混淆时不使用大小写混合,混淆后类名小写
-dontskipnonpubliclibraryclasses   #指定不去忽略非公共的类
-dontskipnonpubliclibraryclassmembers   #指定不去忽略非公共的类的成员
-dontpreverify   #不做预校验,android一般不用,加快速度
-verbose   #生成映射文件
-printmapping proguardMapping.txt   #映射文件名称
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*   #混淆算法,一般不变
-keepattributes *Annotation*   #Annotation不混淆,对于JSON实体映射重要,例如FastJson/Gson
-keepattributes Signature   #避免混淆泛型,对于JSON实体映射重要
-keepattributes SourceFile,LineNumberTable   #抛出异常时保留代码行号
#保留所有本地native方法
-keepclasseswithmembernames class * {
native <methods>;
}
#保留继承自Activity、Application类的子类,可能被外部调用
-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.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
#-------------------------------------------v4/v7/Fragment------------------------------------------
-dontwarn android.support.v7.**
-keep class android.support.v7.**{*;}
-keep interface android.support.v7.app.**{*;}
-keep public class * extends android.support.v7.**
-keep public class * extends android.app.Fragment
#保留Activity中方法参数是view的方法,使onClick不受影响
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
#枚举类不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#自定义控件(继承自View)不被混淆
-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);
}
#Parcelable序列化类不混淆
-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.ObjextStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#R类及资源不混淆
-keep class **.R$*{
*;
}
#带有回调函数onXXXEvent的不混淆
-keepclassmembers class * {
void *(**On*Event);
}
#保留实体类和成员不被混淆
-keep public class com.qtest.journal.bean.**{
#    public void set*(***);
#    public *** get*();
#    public *** is*();
*;
}
#WebView处理
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.webView, java.lang.String);
}
#内嵌类
#Javascript处理
#反射处理
#release包去除敏感verbose/debug的log日志信息
-dontobfuscate   #prevent from changing class name and method name etc...
-assumenosideeffects class android.util.Log{
public static int d(...);
public static int v(...);
}

#第三方jar:
#----------------------------------------------Gson混淆---------------------------------------------
-keep class sun.misc.Unsafe { *; }

#-------------------------------------------butterknife---------------------------------------------
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }   #butterknife6.0
#-keep class **$$ViewBinder { *; }   #butterknife7.0
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}

#---------------------------------------------Volley------------------------------------------------
-keep class com.android.volley.** {*;}
-keep class com.android.volley.toolbox.** {*;}
-keep class com.android.volley.Response$* { *; }
-keep class com.android.volley.Request$* { *; }
-keep class com.android.volley.RequestQueue$* { *; }
-keep class com.android.volley.toolbox.HurlStack$* { *; }
-keep class com.android.volley.toolbox.ImageLoader$* { *; }

#---------------------------------------------友盟sdk-----------------------------------------------
# -dontshrink
# -dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-dontwarn android.support.v4.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable

-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**

-keep public class com.umeng.socialize.* {*;}

-keep class com.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}

-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}

-dontwarn twitter4j.**
-keep class twitter4j.** { *; }

-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep public class com.umeng.soexample.R$*{
public static final int *;
}
-keep public class com.umeng.soexample.R$*{
public static final int *;
}
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}

-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class  com.alipay.share.sdk.** {
*;
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}

-keep class com.linkedin.** { *; }
-keepattributes Signature
-dontwarn com.linkedin.platform.internals.**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: