1. 程式人生 > >Android程式碼混淆官方實現方法

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

資料夾中,是Google事先寫好的一個程式碼混淆配置檔案,是一個基礎的程式碼混淆配置檔案。

繼續檢視 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