之前为项目集成微信热更新平台Tinker之前,应用并没有进行代码混淆,仅仅做了三方的APK加固。后来发现Tinker需要添加相关的混淆文件 tinkerMultiKeep.pro。所以就把之前欠的账补上,也在此进行总结记录一下。
项目混淆文件主要包含三部分:
1,基本指定
2,依赖引用资源混淆
3,三方集成资源混淆
具体混淆配置请按照注释查询
# Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in E:\AndroidSdk/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} #---------------------------------基本指令区---------------------------------- #代码混淆的压缩比例,值在0-7之间 -optimizationpasses 5 #混淆后类名都为小写 -dontusemixedcaseclassnames #指定不去忽略非公共的库的类 -dontskipnonpubliclibraryclasses #指定不去忽略非公共的库的类的成员 -dontskipnonpubliclibraryclassmembers #不做预校验的操作 -dontpreverify #生成原类名和混淆后的类名的映射文件 -verbose -printmapping proguardMapping.txt #指定混淆是采用的算法 -optimizations !code/simplification/cast,!field/*,!class/merging/* #不混淆Annotation -keepattributes *Annotation*,InnerClasses #不混淆泛型 -keepattributes Signature #抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable #---------------------------------默认保留区--------------------------------- -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 #解决com.google.common**问题 -dontwarn javax.annotation.** -dontwarn javax.inject.** -dontwarn sun.misc.Unsafe #如果有引用v4包可以添加下面这行 -keep class android.support.v4.** { *; } -keep public class * extends android.support.v4.** -keep public class * extends android.app.Fragment #如果引用了v4或者v7包,可以忽略警告,因为用不到android.support -dontwarn android.support.** # 保持 native 方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } # 保持自定义控件类不被混淆 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # 保持枚举 enum 类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } #保持自定义组件不被混淆 -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); } # 保持自定义控件类不被混淆 -keepclasseswithmembers class * { 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 不被混淆并且enum 类也不被混淆 -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(); } #不混淆资源类 -keep class **.R$* { *; } -keep public class [com.rongjing.zwdai].R$*{ public static final int *; } -keepclassmembers class * { void *(**On*Event); } #---------------------------------webview------------------------------------ -keepclassmembers class fqcn.of.javascript.interface.for.Webview { public *; } -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, jav.lang.String); } #---------------------------------JS调用------------------------------------ -keepclassmembers class com.just.library.agentweb.AndroidInterface{ *; } -keepclasseswithmembers class com.rongjing.zwdai.activity.BaseWebActivity$AndroidInterfaces { <methods>; } #---------------------------------实体类------------------------------------ -keep class com.rongjing.zwdai.entity.** { *; } #---------------------------------第三方jar包------------------------------------ #百度OCR #-libraryjars libs/ocr-sdk.jar -dontwarn com.app.camera.** -keep class com.app.camera.** { *; } #---------------------------------第三方依赖库------------------------------------ #eventBus -keepattributes *Annotation* -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable); } #glide -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } #umeng - 统计 -keepclassmembers class * { public <init> (org.json.JSONObject); } #umeng - 分享 -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.umeng.weixin.handler.** -keep class com.umeng.weixin.handler.* -keep class com.umeng.qq.handler.** -keep class com.umeng.qq.handler.* -keep class UMMoreHandler{*;} -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{*;} -keep class com.tencent.mm.sdk.** { *; } -keep class com.tencent.mm.opensdk.** { *; } -keep class com.tencent.wxop.** { *; } -keep class com.tencent.mm.sdk.** { *; } -dontwarn twitter4j.** -keep class twitter4j.** { *; } -keep class com.tencent.** {*;} -dontwarn com.tencent.** -keep class com.kakao.** {*;} -dontwarn com.kakao.** -keep public class com.umeng.com.umeng.soexample.R$*{ public static final int *; } -keep public class com.linkedin.android.mobilesdk.R$*{ public static final int *; } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -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.umeng.socialize.impl.ImageImpl {*;} -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.** { *; } -keep class com.android.dingtalk.share.ddsharemodule.** { *; } #-keepattributes Signature #okhttp -dontwarn com.squareup.okhttp.** -keep class com.squareup.okhttp.** { *;} -dontwarn okio.** #Retrofit -dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions #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; } #Gson -keep class com.google.gson.stream.** { *; } -keepattributes EnclosingMethod #butterknife -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewInjector{ *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; } # Dagger ProGuard rules. # https://github.com/square/dagger -dontwarn dagger.internal.codegen.** -keepclassmembers,allowobfuscation class * { @javax.inject.* *; @dagger.* *; <init>(); } -keep class dagger.* { *; } -keep class javax.inject.* { *; } -keep class * extends dagger.internal.Binding -keep class * extends dagger.internal.ModuleAdapter -keep class * extends dagger.internal.StaticInjection #AgentWeb -keep class com.just.library.** {*; } -dontwarn com.just.library.** #tinker热更新 # help us to debug -renamesourcefileattribute SourceFile -keepattributes Exceptions -keepattributes SourceFile,LineNumberTable,keepattributes -keepattributes InnerClasses -keepattributes EnclosingMethod -keepattributes Signature -keepattributes *Annotation* -dontshrink # Config need by TinkerPatch -keep class com.tinkerpatch.sdk.TinkerPatch { *; } -keep class com.tinkerpatch.sdk.BuildConfig { *; } -keep class com.tinkerpatch.sdk.TinkerPatch$Builder { *; } -keep class com.tinkerpatch.sdk.server.RequestLoader { *; } -keep class com.tinkerpatch.sdk.util.ContentLengthInputStream { *; } -keep interface com.tinkerpatch.sdk.server.model.DataFetcher { *; } -keep interface com.tinkerpatch.sdk.server.model.DataFetcher$DataCallback { *; } -keep class com.tinkerpatch.sdk.server.model.TinkerClientUrl { *; } -keep class com.tinkerpatch.sdk.server.callback.** { *; } -keep class com.tinkerpatch.sdk.tinker.callback.** { *; } -keep public class * extends android.app.Application -keep class com.tinkerpatch.sdk.loader.TinkerPatchApplicationLike { *; } -keep class com.tencent.tinker.** { *; } # Config from tinker -dontwarn com.tencent.tinker.anno.AnnotationProcessor -keep @com.tencent.tinker.anno.DefaultLifeCycle public class * -keep public class * extends android.app.Application { *; } -keep public class com.tencent.tinker.loader.app.ApplicationLifeCycle { *; } -keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle { *; } -keep public class com.tencent.tinker.loader.TinkerLoader { *; } -keep public class * extends com.tencent.tinker.loader.TinkerLoader { *; } -keep public class com.tencent.tinker.loader.TinkerTestDexLoad { *; } -keep public class com.tencent.tinker.loader.TinkerTestAndroidNClassLoader { *; } #your dex.loader patterns here -keep class tinker.sample.android.app.SampleApplication -keep class com.tencent.tinker.loader.** #神策数据统计 -dontwarn com.sensorsdata.analytics.android.** -keep class com.sensorsdata.analytics.android.** { *; } -keep class **.R$* { <fields>; } -keep public class * extends android.content.ContentProvider -keepnames class * extends android.view.View -keep class * extends android.app.Fragment { public void setUserVisibleHint(boolean); public void onHiddenChanged(boolean); public void onResume(); public void onPause(); } -keep class android.support.v4.app.Fragment { public void setUserVisibleHint(boolean); public void onHiddenChanged(boolean); public void onResume(); public void onPause(); } -keep class * extends android.support.v4.app.Fragment { public void setUserVisibleHint(boolean); public void onHiddenChanged(boolean); public void onResume(); public void onPause(); } #极光 -dontwarn cn.jpush.** -keep class cn.jpush.** { *; } -keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; } -dontwarn cn.jiguang.** -keep class cn.jiguang.** { *; }