android 對代碼混淆

來源:互聯網
上載者:User

標籤:android

上一篇博文已經寫了有關apk的翻遍的方法,結果真的令人震驚,自己辛辛苦苦寫的代碼,結果就這麼輕而易舉被別有用心的人給竊取了,哭都沒地方哭。面對這個問題我們應該如何是好呢!本片博文告訴大家一個隊代碼進行混淆的方法。

混淆就是對發布出去的程式進行重新組織和處理,使得處理後的代碼與處理前程式碼完成相同的功能,而混淆後的代碼很難被反編譯,即使反編譯成功也很難得出程式的真正語義。被混淆過的程式碼,仍然遵照原來的檔案格式和指令集,執行結果也與混淆前一樣,只是混淆器將代碼中的所有變數、函數、類的名稱變為簡短的英文字母代號,在缺乏相應的函數名和程式注釋的況下,即使被反編譯,也將難以閱讀。同時混淆是無法復原的,在混淆的過程中一些不影響正常啟動並執行資訊將永久丟失,這些資訊的丟失使程式變得更加難以理解。

混淆器的作用不僅僅是保護代碼,它也有精簡編譯後程式大小的作用。由於以上介紹的縮短變數和函數名以及丟失部分資訊的原因, 編譯後 jar 檔案體積大約能減少25% ,這對當前費用較貴的無線網路傳輸是有一定意義的。

根據sdk版本的不同,混淆的方法也不同:

低版本的sdk,項目中同時包含 proguard.cfg 和 project.properties 檔案,則只需在 project.properties 檔案末尾添加 proguard.config=proguard.cfg 再將項目 Export 即可。這裡我就不多說了

現在常用版本的sdk,項目中同時包含 proguard-project.txt 和 project.properties 檔案,這時需要在 project.properties 檔案中進行如下資訊的配置,然後再將項目 Export 即可。

proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt

上面這句話eclipse是會自動產生的,只是前面會有#來注釋掉,你只需把它放開就行了,現在再來export,反編譯後的效果如下:


有很多的包名和類名都已經被修改了,而且很多包中都是空的了,這樣我們的目的就達到了。

有一個問題就是activity和view為什麼沒被改名呢??讓我們來看一下proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt到底是什麼意思吧。

找到..\android-sdk-windows\tools\proguard目錄你會發現一個proguard-android.txt,開啟它就是如下內容:

-optimizationpasses 5                                                           # 指定代碼的壓縮層級
-dontusemixedcaseclassnames                                                     # 是否使用大小寫混合
-dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar
-dontpreverify                                                                  # 混淆時是否做預校正
-verbose                                                                        # 混淆時是否記錄日誌
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆時所採用的演算法


-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 com.android.vending.licensing.ILicensingService              # 保持哪些類不被混淆


-keepclasseswithmembernames class * {                                           # 保持 native 方法不被混淆
    native <methods>;
}


-keepclasseswithmembers class * {                                               # 保持自訂控制項類不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
}


-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);     # 保持自訂控制項類不被混淆
}


-keepclassmembers class * extends android.app.Activity {                        # 保持自訂控制項類不被混淆
   public void *(android.view.View);
}


-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 *;
}


-keep class MyClass;                                                            # 保持自己定義的類不被混淆

這些設定大部分是不能改動的,否則會造成apk無法運行。

如果你不想混淆某個包只需在proguard-project.txt中添加如下代碼就可

-dontwarn com.wangpeng.libs.utills.** 
-keep class com.wangpeng.libs.utills.** { *; }

對於第三方jar的處理

#不混淆第三方jar包中的類
-keep class com.baidu.mapapi.** {*;}
-keep class com.tencent.tauth.** {*;}
-keep class org.apache.http.entity.mime.** {*;}
-keep class android.support.v4.** {*;}
-keep class android.net.http.** {*;}
-keep class com.weibo.sdk.android.** {*;}
-keep class com.sina.sso.** {*;}

#聲明第三方jar包,不用管第三方jar包中的.so檔案(如果有)
-libraryjars libs/baidumapapi.jar
-libraryjars libs/tencent_openapi.jar
-libraryjars libs/httpmime-4.1.3.jar
-libraryjars libs/weibo.sdk.android.sso.jar
-libraryjars libs/android-support-v4.jar


android 對代碼混淆

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.