title: android-ProGuard混淆
categories: Android
tags: [android, unity, ProGuard, 混淆]
date: 2020-03-30 19:05:25
comments: false
mathjax: true
toc: true
android-ProGuard混淆
前篇
- 官方
- 缩减、混淆处理和优化您的应用 - https://developer.android.com/studio/build/shrink-code
- Android混淆(Proguard)详解 - https://juejin.im/post/5ae7edc7f265da0b776f7a95
- Android混淆——了解这些就够了 - https://juejin.im/post/5aeae5b6f265da0ba469a265
- Android 多渠道打包之混淆文件ProGuard技术详解 - https://blog.csdn.net/javazejian/article/details/50587857
ProGuard 工具是用于压缩,优化,混淆我们的代码,主作用是可以移除代码中的无用类,字段,方法和属性同时可以混淆(类,字段,方法,属性的)命名。最终结果可以使我们的 apk 文件体积更加小,也会让我们的 apk 更加难以被他人逆向工程,这对于那些特别时包含一些安全性功能的apk来说是相当重要的。很抽象,我也这么觉得,结合其他资料,我们把 ProGuard 技术的功能概括为以下4项:
-
压缩(shrinks) :检查并移除代码中无用的类,字段,方法,属性。
-
优化(optimizes):对字节码进行优化,移除无用的指令。
-
混淆(obfuscates):使用a,b,c,d等简短而无意义的名称,对类,字段和方法进行重名,这样即使代码被逆向工程,对方也比较难以读懂。 (就类似 js 里面的
uglify-js
, 压缩代码.) -
预检测(Preveirfy):在java平台上对处理后的代码进行再次检测。
ProGuard 混淆技术是集成到 Android 构建系统,所以我们不需要手动调用它。ProGuard 混淆技术只有当我们构建您的应用程序并准备发布应用时才需要使用,所以我们在debug模式下没有必要进行代码混淆。ProGuard 混淆技术也只是一种可选技术,即使不使用 ProGuard 混淆技术,我们的应用程序也可以进行运行,但是强烈建议在发布应用程序时使用该技术。
混淆代码也是防止 app 上传到 Google Play 后代码查重.
对代码进行混淆处理
- https://developer.android.com/studio/build/shrink-code#obfuscate
混淆处理的目的是通过缩短应用的类、方法和字段的名称来减小应用的大小
不过,由于混淆处理会对代码的不同部分进行重命名,因此在执行某些任务(如检查堆栈轨迹)时需要用到额外的工具。 要了解混淆处理后的堆栈轨迹,请参阅下一个部分
输出混淆日志
# 未混淆的类和成员
-printseeds ../../proguard-log/seeds.txt
# 列出从 apk 中删除的代码
-printusage ../../proguard-log/unused.txt
# 混淆前后的映射
-printmapping ../../proguard-log/mapping.txt
# R8 在构建项目时应用的所有规则的完整报告
-printconfiguration ../../proguard-log/full-r8-config.txt
解码经过混淆处理的堆栈轨迹
- https://developer.android.com/studio/build/shrink-code#decode-stack-trace
R8 对您的代码进行混淆处理后,理解堆栈轨迹的难度将会极大增加,因为类和方法的名称可能已发生变化。 除了重命名之外,R8 还可以更改堆栈轨迹中的行号,以在写入 DEX 文件时进一步缩减大小。 幸运的是,R8 在每次运行时都会创建一个 mapping.txt
文件,其中列出了经过混淆处理的类、方法和字段名称与原始名称的映射关系。此映射文件还包含用于将行号映射回原始源文件行号的信息。R8 会将此文件保存在 /build/outputs/mapping//
目录中。
注意 :您每次构建项目时都会覆盖 R8 生成的
mapping.txt
文件,因此您每次发布新版本时都要注意保存一个该文件的副本。 通过为每个发布版本保留一个mapping.txt
文件的副本,您可以在用户提交来自旧版应用的经过混淆处理的堆栈轨迹时,调试相关问题。
unity Android 混淆
-
打开 混淆
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bbg2Ulog-1585726911435)(http://yxbl.itengshe.com/20200331164701-1.png)]
-
然后生成文件
Assets\Plugins\Android\proguard-user.txt
, 在里面添加 混淆规则 即可.需要注意的是跨平台 (都是 public 方法) 调用方法需要 keep 住, 否则运行时调用 java 会报错. keep 住 public 方法即可. 如:
-keep class com.yang.androidaar.MainActivity{ public <methods>; # 保持该类下所有的共有方法不被混淆 }
将入口 MainActivity 类 keep 住.
接入的第三方 sdk 有要求混淆 keep 的规则, 直接丢到里面即可.
踩坑
在 as 中导出 unity 库模块 的 jar 时, 不能在 库模块 中开启混淆. 否则打包时, 主工程有开启了混淆, 导致二次混淆会报错
transformClassesAndResourcesWithR8ForRelease FAILED