Proguard

James Lin
4 min readJul 2, 2019

--

  1. 為什麼要用 Proguard
  2. 什麼是 Proguard
  3. 如何使用 Proguard
  4. 來使用 Proguard 吧
  5. 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 不要被混淆

--

--

James Lin
James Lin

No responses yet