Android Proguard
为什么要用 Proguard
什么是 Proguard
如何使用 Proguard
来使用 Proguard 吧
Response 被 Proguard 混淆了!
s
当开发者好不容易写出一 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 不要被混淆