Android程式碼混淆官方實現方法
首先檢視一下 “project.properties” 這個檔案:
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-18
簡單翻譯一下:
這個檔案又android工具自動生成,不要修改這個檔案 —— 你的更改將會被刪除!(這句有點不懂)
這個檔案必須在版本控制系統中。
需要修改Ant構建系統的自定義屬性的話,編輯"ant.properties"這個檔案,重寫一些值來適應你的工程結構。(翻譯的很水,不要當真)
如果需要使用ProGuard來壓縮和混淆程式碼,將下面這句解除註釋(可用的屬性有:sdk.dir, user.home)
翻譯完畢...
到這裡應該明白了,下面這行配置就是程式碼混淆的開關。
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard-android.txt 這個檔案在SDK的 tools/proguard
繼續檢視 proguard-project.txt這個檔案:
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in .properties.
#
# For more details, see
# http://developer..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..interface.for.webview
{
# public *;
#}
再次秀一下我蹩腳的英語,簡單翻譯一下:
如果需要使用ProGuard,編輯.properties檔案,根據描述定義proguard.config。
可以在這兒新增具體的程式碼混淆規則。
預設情況下,這個檔案中的標誌附加到${sdk.dir}/tools/proguard/proguard-android.txt指定的標誌。
你可以通過改變 project.properties 中的 ProGuard的include屬性來編輯路徑和指令。
...
更多的資訊,請檢視http://developer..com/guide/developing/tools/proguard.html。
在這兒新增工程的具體的keep options:
...
如果你的工程使用了WebView中的JS,解除下面的註釋,並且指定JavaScript介面類的全名。(也就是是忽略js部分,不進行混淆,方法是解除註釋,將fqcn.of..interface.for.webview替換為與JS繫結的類名。)
#-keepclassmembers class fqcn.of..interface.for.webview
{
# public *;
#}
翻譯完畢...
通過這兩個檔案的註釋可以得出結論:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 有了這一句就啟用的程式碼混淆。當然,預設的設定是不帶優化功能的,可以用以下設定來加上程式碼優化功能(上圖藍色文字部分):
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
proguard-android.txt 是基礎的Android程式碼混淆規則,如果需要新增規則,新增到proguard-.txt 中。
如果沒有引入第三方的庫,一般情況下 proguard-android.txt 的規則是夠用的,但是如果有第三方的庫,在混淆的時候要把第三方的庫忽略掉,這是就需要在 proguard-project.txt 檔案中新增規則。(android.support.** 已經在proguard-android.txt做了處理,所以如果使用了android.support.v4,就不用新增程式碼混淆的規則了)。
對第三分庫的處理,參考:http://blog.csdn.net/u_xtian/article/details/7495023
具體做法,在 proguard-project.txt 新增:
-libraryjars **.jar (宣告lib檔案)
-dontwarn com.xx.bbb.** (不提示警告)
-keep class com.xx.bbb.** { *;} (不進行混淆)
例如百度地圖:
-libraryjars libs/baidumapapi_v2_1_3.jar
-dontwarn com.baidu.mapapi.**
-dontwarn com.baidu.platform.**
-dontwarn com.baidu.location.**
-dontwarn com.baidu.vi.**
-dontwarn vi.com.gdi.bgl.android.**
-keep class com.baidu.mapapi.** {*; }
-keep class com.baidu.platform.** {*; }
-keep class com.baidu.location.** {*; }
-keep class com.baidu.vi.** {*; }
-keep class vi.com.gdi.bgl.android.** {*; }
可能有人很疑惑,不進行程式碼混淆的方法我知道,但這些包名去那裡找啊,其實很簡單。開啟Android Private Libraries就能看到。
轉載地址:http://www.th7.cn/Program/Android/201309/150445.shtml