Proguard 混淆之乱谈 3 混淆模板
生活随笔
收集整理的這篇文章主要介紹了
Proguard 混淆之乱谈 3 混淆模板
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
之前的文章談了沒有混淆的壞處Proguard 混淆之胡談1和混淆的用法Proguard 混淆之亂談2,沒看的童鞋可以看下。
#基礎(chǔ)部分混淆
####基礎(chǔ)混淆#### #指定代碼的壓縮級別 -optimizationpasses 5# 混淆時不使用大小寫混合,混淆后的類名為小寫 # windows大小寫不敏感,linux下可以不用添加 -dontusemixedcaseclassnames# 指定不去忽略非公共的庫的類 # 默認(rèn)跳過,有些情況下編寫的代碼與類庫中的類在同一個包下,并且持有包中內(nèi)容的引用,此時就需要加入此條聲明 -dontskipnonpubliclibraryclasses# 指定不去忽略非公共的庫的類的成員 -dontskipnonpubliclibraryclassmembers# 不做預(yù)檢驗,preverify是proguard的四個步驟之一 # Android不需要preverify,去掉這一步可以加快混淆速度 -dontpreverify# 混淆后生成映射文件 # 包含有類名->混淆后類名的映射關(guān)系 # 然后使用printmapping指定映射文件的名稱 -verbose -printmapping priguardMapping.txt# 指定混淆時采用的算法,后面的參數(shù)是一個過濾器 # 這個過濾器是谷歌推薦的算法,一般不改變 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*# 保護代碼中的Annotation不被混淆 # 這在JSON實體映射時非常重要,比如fastJson -keepattributes *Annotation*# 避免混淆泛型 # 這在JSON實體映射時非常重要,比如fastJson -keepattributes Signature# 拋出異常時保留代碼行號 -keepattributes SourceFile,LineNumberTable####基礎(chǔ)混淆 完成#####應(yīng)用混淆部分
####針對應(yīng)用混淆##### 保留所有的本地native方法不被混淆 -keepclasseswithmembernames class * {native <methods>; }# 保留了繼承自Activity、Application這些類的子類 # 因為這些子類有可能被外部調(diào)用 # 比如第一行就保證了所有Activity的子類不要被混淆 -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# 如果有引用android-support-v4.jar包,可以添加下面這行 -keep interface android.support.v4.app.** { *; } -keep class android.support.v4.** { *; } -keep class android.support.v7.** { *; } -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.app.Fragment# 保留Activity中的方法參數(shù)是view的方法, # 從而我們在layout里面編寫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 {public <init>(android.content.Context);public <init>(android.content.Context, android.util.AttributeSet);public <init>(android.content.Context, android.util.AttributeSet, int);public void set*(***);*** get* (); }# 保留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.ObjectStreamField[] serialPersistentFields;!static !transient <fields>;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve(); } # 對R文件下的所有類及其方法,都不能被混淆-keepclassmembers class **.R$* {*;}#對于帶有回調(diào)函數(shù)onXXEvent的,不能混淆-keepclassmembers class * {void *(**On*Event);}#對實體類不進行混淆 -keep class com.clxchina.chelixiang.Model.** {public void set*(***);public *** get*();public *** is*(); }#對內(nèi)嵌類不進行混淆 -keep class com.clxchina.chelixiang.Adapter.*$* {*; }-keep class com.clxchina.chelixiang.lecheng.**{*; }#對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不進行混淆 -keepclassmembers class com.clxchina.chelixiang.jzh.JZHSignCard$InJavaScriptLocalObj {<methods>; } -keepclassmembers class com.clxchina.chelixiang.jzh.WebViewActivity$InJavaScriptLocalObj {<methods>; }-dontwarn####針對應(yīng)用混淆 完成#####對第三方j(luò)ar包不進行混淆
拿到第三方的jar包,有兩種情況,一種是已經(jīng)混淆過了,一種是開源的項目,所以基本上都是不需要混淆的,基本的思路就是找到j(luò)ar包的包名,然后-keep+dontwarn就行,常用的jar包不混淆的代碼如下供參考:
至此基本的混淆就完了,下一篇文章討論下混淆后出現(xiàn)的問題和如何進行debug.
點這里看混淆出現(xiàn)的問題和如何debug
總結(jié)
以上是生活随笔為你收集整理的Proguard 混淆之乱谈 3 混淆模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。