- 為什麼要用 Proguard
- 什麼是 Proguard
- 如何使用 Proguard
- 來使用 Proguard 吧
- Response 被 Proguard 混淆了!
為什麼要用 Proguard
當開發者好不容易寫出一個 APP,你不會想要有人拿到這個 APP 之後,使用一些手段將裡面的 “原始碼” 或者 “key” 看光光吧!
Proguard 可以幫你做到這點。
流程大致上長這樣:
Code -> Proguard -> APK
什麼是 Proguard
詳細的 Proguard 可以看官網: https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/introduction.html
Input jars:開發者寫的 code。
Library jars:開發者引用 Library 的 code ( Ex : okHttp …)。
Shrunk:會移除不必要的 reference ( ex : drawable 的圖片檔在 Java 會有一個 R class 去 mapping 這些 resource,如果沒用到這個 resource proguard 會移除這些 reference)。
Optim:移除沒有用到的 code 或者將一些 方法 變成 inline。
Obfuse:混淆程式碼,Ex:有一個 class Data,混淆後會變成 class a,此階段還會破壞 package 的階層架構。
如何使用 Proguard
其實 Android Studio 在 Module level 的 gradle 已經加入 proguard 了。
只不過這是在 release 才會使用到,如果想要測試可以在 buildType 加入 proguard。
minifyEnabled:設定要不要 混淆 code。
shrinkResources:設定要不要 Shrunk code,minifyEnabled 要設定 true,此 flag 才有效 ( 尚未驗證 )。
來使用 Proguard 吧
現在我有一個 MyResponse 的 class
印出此 class 的資訊
如果使用 proguard 則會混淆 名稱
如果沒有使用 Proguard 則會將名稱包括 package 的層級都印出來
Response 被 Proguard 混淆了!
有時後端回傳的是 Json 格式的 file,那麼要透過 Gson… 之類的第三方套件幫我們把 Json 轉換成 “物件”,但是因為 class 被 proguard 混淆了,導致 Gson 在轉換 Json 的過程中找不到 class,那該怎麼辦呢?
設定不要混淆特定 package 就好啦!
有兩種方式
第一種使用 annotation 的方式去宣告哪一個 class 不要被混淆
@Keep
class MyResponse{
.....
}
另一種方式 在 proguard-rules.pro 設定那些檔案不要被混淆
設定 com.jamesTech.rollDice 這個 package 底下的 class 不要被混淆