在 Android 中使用 Proguard 的简易模式
Easy mode for using Proguard in Android
在准备发布 Android 应用程序时,我们会使用 Proguard 混淆可能破坏应用程序的代码。
所以一旦出现错误,我们修改它并反复构建-发布-测试,有没有简单的方法可以做到这一点?
另外,在AndroidStuido中是否可以直接看到混淆后的代码?
回溯
通过将混淆名称替换为原始来源中使用的名称,回溯是混淆堆栈跟踪的原因 human-readable。为了能够回溯,请确保为您要测试或发送给某人的每个构建保存 mapping.txt
。每个构建过程的映射都是唯一的。
映射可以在
中找到
appModule/build/outputs/mapping/release/mapping.txt
为了回溯,有一个名为 proguardgui 的方便工具,可在
中找到
$ANDROID_HOME/tools/proguard/bin/proguardgui.sh
(*.sh
对于 UNIX 系统,对于其他平台期望不同的扩展名)。
选择 "ReTrace",添加 mapping.txt(确保使用为该 apk 构建生成的 mapping.txt)并将混淆的堆栈跟踪粘贴到 window。按右下角的 "ReTrace",您应该会得到带有去混淆名称的堆栈跟踪。
这是我在 Internet 上找到的带有示例输入的屏幕截图
正在反编译
Also, is it possible to see the obfuscated code directly in Android Stuido?
没有,但你可能会通过将 dex 转换为 jar 并反编译它来看到代码。
dex2jar myapp.apk
jd-gui myapp-dex2jar.jar
dex2jar github 页。
jd-gui 来自 github 页。
我遵循的做法
对我有用的是,每当我添加一个库时,我都会为一个库添加一个 proguard 配置(通常由库开发人员提供)。
还有一个名为 android-proguard-snippets 的项目,认为它们大多已过时,因此请务必先与库开发人员联系。
为了便于管理,我习惯将每个库的 proguard 配置拆分到一个单独的文件中。下面是我的 build.gradle buildTypes 之一的片段,用于发布
proguardFile getDefaultProguardFile('proguard-android.txt')
proguardFile 'proguard-dart.pro'
proguardFile 'proguard-parceler.pro'
proguardFile 'proguard-retrolambda.pro'
proguardFile 'proguard-rules.pro'
proguardFile 'proguard-rx-java.pro'
proguardFile 'proguard-support-design.pro'
proguardFile 'proguard-support-v7-appcompat.pro'
对于Firebase
序列化中使用的对象,添加@Keep
注释。
对于 Gson
使用的字段,添加 @SerializedName
注释或在对象上使用 @Keep
。
每当我使用反射(或 Animators,它们在技术上是相同的)时,我都会确保添加混淆器规则以确保在我编写此类代码后立即通过反射访问代码。最后可能没有什么可以解决的。
在准备发布 Android 应用程序时,我们会使用 Proguard 混淆可能破坏应用程序的代码。
所以一旦出现错误,我们修改它并反复构建-发布-测试,有没有简单的方法可以做到这一点?
另外,在AndroidStuido中是否可以直接看到混淆后的代码?
回溯
通过将混淆名称替换为原始来源中使用的名称,回溯是混淆堆栈跟踪的原因 human-readable。为了能够回溯,请确保为您要测试或发送给某人的每个构建保存 mapping.txt
。每个构建过程的映射都是唯一的。
映射可以在
中找到appModule/build/outputs/mapping/release/mapping.txt
为了回溯,有一个名为 proguardgui 的方便工具,可在
中找到$ANDROID_HOME/tools/proguard/bin/proguardgui.sh
(*.sh
对于 UNIX 系统,对于其他平台期望不同的扩展名)。
选择 "ReTrace",添加 mapping.txt(确保使用为该 apk 构建生成的 mapping.txt)并将混淆的堆栈跟踪粘贴到 window。按右下角的 "ReTrace",您应该会得到带有去混淆名称的堆栈跟踪。
这是我在 Internet 上找到的带有示例输入的屏幕截图
正在反编译
Also, is it possible to see the obfuscated code directly in Android Stuido?
没有,但你可能会通过将 dex 转换为 jar 并反编译它来看到代码。
dex2jar myapp.apk
jd-gui myapp-dex2jar.jar
dex2jar github 页。
jd-gui 来自 github 页。
我遵循的做法
对我有用的是,每当我添加一个库时,我都会为一个库添加一个 proguard 配置(通常由库开发人员提供)。
还有一个名为 android-proguard-snippets 的项目,认为它们大多已过时,因此请务必先与库开发人员联系。
为了便于管理,我习惯将每个库的 proguard 配置拆分到一个单独的文件中。下面是我的 build.gradle buildTypes 之一的片段,用于发布
proguardFile getDefaultProguardFile('proguard-android.txt')
proguardFile 'proguard-dart.pro'
proguardFile 'proguard-parceler.pro'
proguardFile 'proguard-retrolambda.pro'
proguardFile 'proguard-rules.pro'
proguardFile 'proguard-rx-java.pro'
proguardFile 'proguard-support-design.pro'
proguardFile 'proguard-support-v7-appcompat.pro'
对于Firebase
序列化中使用的对象,添加@Keep
注释。
对于 Gson
使用的字段,添加 @SerializedName
注释或在对象上使用 @Keep
。
每当我使用反射(或 Animators,它们在技术上是相同的)时,我都会确保添加混淆器规则以确保在我编写此类代码后立即通过反射访问代码。最后可能没有什么可以解决的。