在 Android Studio 中分析 Proguard 优化构建的最佳方式?

Posted

技术标签:

【中文标题】在 Android Studio 中分析 Proguard 优化构建的最佳方式?【英文标题】:Best way to profile Proguard-optimized build in Android Studio? 【发布时间】:2019-07-14 22:55:16 【问题描述】:

我们希望对我们的代码进行分析,使其尽可能接近我们发布版本中的样子,即使用相同的 Proguard 优化。明显的问题是所有类名/方法都被混淆了,使得分析/调试变得困难。解决此问题的最佳做法是什么?

有没有办法将 proguard 映射上传到 android Studio?或者是一种更好的方法来拥有不同的 Proguard 配置,保留所有类/方法名称但仍运行所有其他优化?

【问题讨论】:

进行除重命名之外的所有优化似乎完全合适。 【参考方案1】:

从 Android Studio 4.0 开始,无法向分析器提供映射。存在feature request,因此任何感兴趣的人都可以对其加注星标,以引起 Android 工具团队的注意。这看起来是一个合理的功能,其他 Java 分析器可以做到。

目前最好的选择是将-dontobfuscate 添加到配置文件的Proguard/R8 配置中,如the Android docs 中所述。不过也有一些潜在的缺点:

    理论上的一个:保持长名称可能会稍微歪曲性能配置文件,因为类稍大,这可能会影响类加载时间。但是,这不太可能改变您在分析期间寻找的答案:热方法仍然很热。 轶事一:优化管道中的某些工具可能不喜欢生成的配置 - 这取决于项目和工具。因此,我在 Facebook 的 Redex 中看到了崩溃。

【讨论】:

【参考方案2】:

您可以分析 deobfuscate proguarded build,但不能使用 Android Studio,您必须使用 Android Studio CPU Profiler 下方的 simpleperf 工具包和另一个 UI:Firefox Profiler。

先决条件:

检查你是否在 python >= 3.8

python3 -V

安装Android NDK

安装最新的simpleperf:

$ git clone https://android.googlesource.com/platform/system/extras ~/extras
$ cd ~/extras/simpleperf/scripts

使用app_profiler.py 的个人资料,例如当线程阻塞(off-cpu 分析)10 秒时,Google Maps @4000Hz 采样堆栈和抓取堆栈:

$ ./app_profiler.py \
    --app com.google.android.apps.maps \
    --record_options "-g -e cpu-clock --trace-offcpu -f 4000 --duration 10" \
    --activity com.google.android.maps.MapsActivity

转换为 Firefox Profile 格式,使用 proguard map 去混淆:

$ ./gecko_profile_generator.py \
    --proguard-mapping-file proguard.map \
    | gzip > gecko_profile.json.gz

gecko_profile.json.gz拖放到https://profiler.firefox.com/中

【讨论】:

以上是关于在 Android Studio 中分析 Proguard 优化构建的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中分析故障转储

如何在 Visual Studio 2008 中分析 MsTest 的单元测试?

当我在 Zend Studio 中分析 CLI PHP 时如何传递参数?

在android中分析用户定义的方法

Android Studio 掌握这些调试技巧,Debug能力不能再高啦

Android Studio 掌握这些调试技巧,Debug能力不能再高啦