android的Proguard混淆

本文记录了在Android Proguard混淆过程中遇到的问题,包括Butterknife的混淆注意事项,实体bean不混淆的原因,内部类混淆处理,以及友盟SDK的混淆警告。并推荐了《app研发录》一书和相关混淆配置资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天在混淆代码过程中遇到好几个坑,所幸堵了《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.**


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值