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研发录》的帮助,有兴趣的可以看看这本书(非广告):
现记录先后遇到的几个坑:
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.**
相关文章推荐
- android中button点击两次才响应onclick方法
- 快速集成Android实现下拉刷新上拉加载更多
- Android 在 SDK 版本5.0,N(API23)阶段startActivity()出错
- [Android]自定义垂直滚动的广告区
- Android 定位系统(GPS)开发详解
- android之自定义View和ViewGroup(二)(此篇不讲述代码,只讲述原理和结构,带你走进自定义的世界)
- Android异步处理四:AsyncTask的实现原理
- Android数据库更新并保留原来数据的实现
- android视频播放器Vitamio的使用
- android 流量的统计
- android之surfaceView详解--自定义surfaceView和用于视频surfaceview
- Android M 的动态权限解决方案
- Android权限表
- android之.9.png图片制作
- Android异步处理系列文章索引
- Android 蓝牙开发 博客链接
- android使用ViewPager实现引导页效果
- Android性能优化
- MVP模式在Android中的使用
- Android 定时器实现的几种方式和removeCallbacks失效问题详解