Android 上線前的代碼混淆之(二)混淆

前一篇文章,分享了反編譯的簡單流程,那麼現在我繼續接着上一篇分享,我的混淆歷程!

剛開始的時候覺得混淆是很高級的東西,沒那麼容易學會,就像屌絲沒見過美女一樣,總覺的美女高冷!呵呵……例子或許不恰當!瞎侃了,接下來我們看些正經的。剛學混淆,不免會在度娘哪裏取經,那我們搜一把試試!


同樣是有很多的帖子和文章,我也就是這樣學習的,打開一個看看,再打開一個看看!我發先有兩種

一種是說有一個proguard.cfg文件 ,一個是說的proguard-project.txt 

我剛開始各種找proguard.cfg ,最後都沒有找到!心中各種草泥馬啊,最後又是各種搜才發現在新版本的ADT已經不用proguard.cfg了!當時都暈菜了,爲嘛不多看看呢!接着來看proguard-project.txt的方案吧

很簡單,只需一步:

將project.properties的中

“#  proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就可以了。

這樣做是不是有點太簡單了,是不是很吃驚!確實,我當時就興奮了!趕緊編譯一個版本試試 吧!

一起動就閃退了,於是從新編譯!總覺得是代碼問題嗎!後來才發現編譯後纔會出錯!於是我反編譯了我的代碼,看看到底又某有混淆,一看確實混淆成功了!不幸的是我的model類也被混淆了,各種get,set都變成了abcd!於是我發現了問題!那麼該如何處理呢!我們打開proguard-project.txt來看看

-keep public class com.kfb.** {*;} // com.kfb.包下無需混淆
-optimizationpasses 5      //
表示proguard對你的代碼進行迭代優化的次數,首先要明白optimization 會對代碼進行各種優化,每次優化後的代碼還可以再次優化,所以就產生了 優化次數的問題,這裏面的 passes 應該翻譯成 ‘次數’ 而不是 ‘通道’。樓上默認寫 5 ,應該是做Android的,關於Android裏面爲什麼寫 5 ,因爲作者本來寫 99 ,但是每次迭代時間都很長團隊成員天天抱怨,就改成 5 了,迭代會在最後一次無法優化的時候停止,也就是雖然你寫着 99 ,但是可能就優化了 幾次,一般情況下迭代10次左右的時候代碼已經不能再次優化了

-dontusemixedcaseclassnames  //混淆時不會產生形形色色的類名 
-dontskipnonpubliclibraryclasses //指定不去忽略非公共的庫類 
-dontpreverify      //預校驗
-verbose      //記錄信息
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  //混淆時所採用的算法  


-keep public class * extends android.app.Activity   //不混淆繼承 自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 com.android.vending.licensing.ILicensingService //同上


-keepclasseswithmembers class * {  //含有native 方法的類類和成員方法和屬性都不混淆
    native <methods>;
}


-keepclasseswithmembers class * { //不混淆含有 類似 (android.content.Context, android.util.AttributeSet)
    public <init>(android.content.Context, android.util.AttributeSet);
}


-keepclasseswithmembers class * { //不混淆含有類似 構造方法的(android.content.Context, android.util.AttributeSet, int); 方法的
    public <init>(android.content.Context, android.util.AttributeSet, int);
}


-keepclassmembers enum * {   //保持枚舉 enum
    public static **[] values();
    public static ** valueOf(java.lang.String);
}


-keep class * implements android.os.Parcelable { //不混淆實現parcelable 接口的類
  public static final android.os.Parcelable$Creator *;
}


看了一遍,才發現我的model類都沒有被排除,於是修改後添加

-keep class * implements java.io.Serializable{
}



-libraryjars libs/nbs.newlens.agent.jar //指明 -libraryjar 爲類庫
# ProGuard configurations for NetworkBench Lens
-keep class com.networkbench.** { *; } //指明com.networkbench.包下的不混淆 類名
-dontwarn com.networkbench.** //指明com.networkbench.包下的不混淆 類名
-keepattributes Exceptions, Signature, InnerClasses  //應該是 exception,singnature innerclasses 的屬性不混淆
# End NetworkBench Lens

另外送上一篇文章供參考:

http://blog.csdn.net/lovexjyong/article/details/24652085

總體就這些了!大家可以試試,學習一下!如果不成功的時候你可以將編譯好的apk反編譯回來打開看看,是不是你的model類被混淆了


發佈了37 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章