Android Proguard 混淆詳解(APK,library,bintray倉庫)
今天這個Proguard 混淆單拿出來,是因為確實被噁心到了。本來混淆這塊挺簡單的,沒太注意,但卻出現了好多奇奇怪怪的問題,所以我這塊系統的整理一下混淆的集中方式和遇到的問題。
一、什麼是ProGuard技術?
廢話不多說,直接去官網看去ProGuard官網
概括一下就是:
- 壓縮(shrinks) :檢查並移除程式碼中無用的類,欄位,方法,屬性。
- 優化(optimizes):對位元組碼進行優化,移除無用的指令。
- 混淆(obfuscates):使用a,b,c,d等簡短而無意義的名稱,對類,欄位和方法進行重名,這樣即使程式碼被逆向工程,對方也比較難以讀懂。
- 預檢測(Preveirfy):在Java平臺上對處理後的程式碼進行再次檢測。
總結一下就是:防止反編譯拿到核心程式碼。 注: 混淆是不可逆的,注意保護好原碼。
二、Android 混淆的幾種方式
1. ProGuard之配置混淆
-
App混淆(統一配置混淆規則)
app混淆較為簡單 在 build.grade (Module:app)的配置檔案中開啟配置如下
buildTypes { release { minifyEnabled true //是否啟動混淆 ture:開啟false:關閉 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }
接下來編輯proguard-rules.pro檔案即可 編輯規則請看
Android studio生成arr包並混淆 中 混淆 ProGuard常用語法
-
module單獨配置混淆規則 (推薦)
在 build.grade (Module:library)的配置檔案中使用如下配置:
buildTypes { release { consumerProguardFiles 'proguard-rules.pro' }
然後編輯目錄下的proguard-rules.pro檔案即可
注意
:
- 主模組的混淆開關配置會直接影響到子模組 ,也就是說如果你的主模組開啟的混淆,就算你的子模組關閉混淆開關,最終子模組還是會被混淆的。
- 子模組混淆檔案的指定是通過 consumerProguardFiles 這個屬性來指定的,並不是proguardFiles 屬性,無需配置其他的選項,只需要配置consumerProguardFiles屬性即可。該屬性表示在打包的時候會自動尋找該module下我們指定的混淆檔案對程式碼進行混淆。
2. ProGuard之@Keep註解混淆
proguard配置混淆的方式太麻煩了,而且不直觀,可能會出錯。所以Google有了官方的註解混淆的方法@keep
@keep註解是 com.android.support:support-annotationsn 內的一個方法,所以我們要在
dependencies 匯入如下程式碼
dependencies { implementation 'com.android.support:support-annotations:28.0.0' }
編輯專案目錄下的 proguard-rules.pro 檔案 新增如下程式碼
#列印混淆資訊 -verbose #程式碼優化選項,不加該行會將沒有用到的類刪除,這裡為了驗證時間結果而使用,在實際生產環境中可根據實際需要選擇是否使用 -dontshrink -dontwarn android.support.annotation.Keep #保留註解,如果不新增改行會導致我們的@Keep註解失效 -keepattributes *Annotation* -keep @android.support.annotation.Keep class **{ @android.support.annotation.Keep <fields>;#不混淆變數 @android.support.annotation.Keep <methods>; #不混淆方法 }
然後你就可以這樣進行設定哪些方法和變數 不進行混淆
了
@Keep public class Sample { @Keep public String TAG = "Sample"; @Keep public String getTAG() { return TAG; } }
三、Android proguardFiles混淆檔案配置方式
1. proguard-android.txt
通常我們配置混淆檔案都是如下這種方式
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
proguard-android.txt中沒有開啟optimizes(優化)和一些預設配置選項。
2. proguard-android-optimize.txt
開啟optimize一些預設配置選項如下
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
對於釋出的release版本應使用proguard-android-optimize.txt,此檔案主要配置的是一些預設的proguard配置
四、混淆問題整理
1. 關於Android Library上傳到bintray混淆原始碼問題
關於上傳bintray雲倉庫請檢視文章 Android Library上傳到JCenter倉庫最佳實踐姿勢
我在上傳混淆後的包的時候 遇到了 引用aidi介面的class檔案 在本地build的arr混淆沒有問題,但是用程式碼直接上傳到雲倉庫,引入到專案中卻部分類沒有混淆,導致引用錯誤。
查了好久 發現是 proguard-rules.pro 中的一個配置檔案導致的錯誤。
#保留註解引數 -keepattributes SourceFile
這個在官方文件中找到了解釋

-keepattributes
但是我看了還是不明白為什麼會導致同步到bintray的時候會報錯,線下build卻沒有問題。
相關文件地址-keepattributes
如果大神知道其中原理,下方留言解惑,感激不盡。2. 關於proguard 與 @keep共用問題
proguard 與 @keep可以共用,但是在使用@keep註解時,一定要在 proguard-rules.pro 檔案中填寫@keep規則,否則會出現 // $FF: Couldn't be decompiled
問題。