使用APK 分析器分析您的build | Android 开发者

文章推薦指數: 80 %
投票人數:10人

Android Studio 包含一个APK 分析器,可让您在构建流程完成后立即了解APK 的组成。

平台 AndroidStudio GooglePlay Jetpack Kotlin 文档 游戏 Language English BahasaIndonesia Español–AméricaLatina Português–Brasil 中文–简体 日本語 한국어 登录 AndroidStudio 下载 新变化 用户指南 预览 平台 AndroidStudio 下载 新变化 用户指南 预览 GooglePlay Jetpack Kotlin 文档 游戏 探索AndroidStudio 概览安装AndroidStudio迁移至AndroidStudio配置IDE键盘快捷键无障碍功能更新IDE和工具 工作流基础知识 管理项目 概览创建项目Play功能分发简介 添加C和C++代码 概览安装NDK和CMake为AGP配置NDK配置CMake关联Gradle创建Android库设置持续集成 编写您的应用 概览从模板添加代码查找示例代码为新设备添加模块创建Java类或类型使用Java8语言功能Java8语言支持表添加应用资源使用布局编辑器构建界面使用MotionEditor制作动画管理您应用的界面资源设计应用主题背景添加多密度矢量图形使用ImageAssetStudio创建图标创建可调整大小的位图(9-Patch)创建WebP图片本地化界面添加Android应用链接连接到Firebase使用Lint检查改进您的代码使用注解改进代码检查工具属性参考 构建和运行您的应用 概览 在模拟器上运行应用 概览创建和管理虚拟设备从命令行启动模拟器发送模拟器控制台命令设置模拟器网络配置硬件加速模拟器功能比较对模拟器进行问题排查 在硬件设备上运行应用 概览安装原始设备制造商(OEM)USB驱动程序获取GoogleUSB驱动程序创建运行/调试配置从命令行构建您的应用 配置build 概览配置应用模块添加build依赖项配置build变体使用AndroidGradle插件升级助理Gradle提示与诀窍迁移至Kotlin脚本 优化构建速度 概览排查构建性能问题对build进行性能剖析使用MavenPublish插件管理清单文件缩减应用大小启用multidex扩展AndroidGradle插件集成自定义C/C++构建系统 调试应用 概览配置开发者选项写入和查看日志分析堆栈轨迹使用布局检查器调试布局使用NetworkInspector检查网络流量使用DatabaseInspector调试数据库使用后台任务检查器调试WorkManager工作器查看设备上的文件调试预构建的APK截屏录制视频获取并阅读bug报告使用APK分析器分析您的build 测试应用 概览在AndroidStudio中测试从命令行进行测试高级测试设置 其他测试工具 概览Espresso测试记录器应用抓取工具MonkeyTesting monkeyrunner参考 概览MonkeyDeviceMonkeyImageMonkeyRunner 分析应用性能 概览 AndroidStudio性能分析器 概览 对CPU活动进行性能分析 概览录制轨迹导出轨迹导入轨迹检查轨迹界面卡顿检测通过检测应用生成轨迹日志分析内存用量分析能耗情况使用预构建APK进行性能分析 对您的应用进行基准测试 概览 Microbenchmark 概览编写基准对基准进行性能分析插桩参数不使用Gradle进行构建 Macrobenchmark 编写基准捕获指标控制您的应用插桩参数持续集成跟踪和分析性能使用BaselineProfiles提升应用性能 衡量性能 概览示例 发布应用 概览准备发布对您的应用进行版本控制对应用进行签名上传应用 发布库 概览准备发布配置发布内容变体配置测试夹具以供发布上传库 命令行工具 概览aapt2adbapkanalyzerapksigneravdmanagerbmgrbundletoold8dmtracedumpdumpsysetc1tooljobbjetifier-standalonelogcatmksdcardretracesdkmanagersystraceperfettozipalign环境变量 问题排查 已知问题 报告bug Android开发者 AndroidStudio 用户指南 使用APK分析器分析您的build AndroidStudio包含一个APK分析器,可让您在构建流程完成后立即了解APK或AndroidAppBundle文件的组成。

使用APK分析器可以减少调试应用的DEX文件和资源相关问题所用的时间,并且有助于减小APK的大小。

您也可以使用apkanalyzer从命令行运行该工具。

通过APK分析器,您可以完成以下操作: 查看应用中的文件(如DEX和Android资源文件)的绝对大小和相对大小。

了解DEX文件的组成。

快速查看应用中的文件(如AndroidManifest.xml文件)的最终版本。

对两个APK或appbundle进行并排比较。

当某个项目处于打开状态时,您可以通过以下三种方式访问APK分析器: 将APK或appbundle拖到AndroidStudio的Editor窗口中。

在Project窗口中切换到Project透视图,然后在默认的build/output/apks/目录中双击相应APK。

在菜单栏中依次选择Build>AnalyzeAPK,然后选择您的APK或appbundle。

查看文件和大小信息 APK是遵循ZIP文件格式的文件。

APK分析器将每个文件或文件夹显示为一个实体,这些实体具有可用于导航到文件夹中的展开功能。

这些实体的层次结构反映了APK中的文件和文件夹的结构。

APK分析器会显示每个实体的原始文件大小和下载文件大小值,如图1所示。

RawFileSize表示实体在磁盘上未经压缩时的大小,而DownloadSize则表示实体由GooglePlay提供时的压缩后大小的估计值。

%ofTotalDownloadSize表示实体占APK总下载大小的百分比。

图1.APK分析器中的文件大小 查看AndroidManifest.xml 如果您的项目包含多个AndroidManifest.xml文件(如产品变种的清单文件)或者包含的库也提供清单文件,这些文件会在您的应用中合并成一个文件。

此清单文件在APK或appbundle中通常是二进制文件,但在APK分析器中选择此文件后,系统会重构并呈现此实体的XML格式。

在此查看器中,您可以了解在构建期间可能对您的应用所做的任何更改。

例如,您可以看到应用所依赖的某个库中的AndroidManifest.xml文件是如何合并到最终AndroidManifest.xml文件中的。

此外,此查看器还提供了一些lint功能,并且会在右上角显示相关警告或错误。

图2显示了查看器正在报告选定清单文件中的一条错误。

图2.选定清单文件的右侧空白处显示了一个错误图标 查看DEX文件 在APK分析器的DEX文件查看器中,您可以立即查看应用的DEX文件中的底层信息。

该查看器中提供了类、软件包、总引用和声明计数,这有助于决定是否使用MultiDex或如何移除依赖项以避免超出64KDEX限制。

图3描绘了一个低于64kDEX限制的中等大小的应用。

DefinedMethods和ReferencedMethods列中列出了DEX文件中每个软件包、类和方法的相关计数。

ReferencedMethods列会统计DEX文件引用的所有方法。

这通常包括在您的代码和依赖项库中定义的方法,以及在代码使用的标准Java和Android软件包中定义的方法-这些方法计入每个DEX文件中的64k方法限制。

DefinedMethods列仅统计在某一个DEX文件中定义的方法,所以此数字是ReferencedMethods的子集。

请注意,如果将某个依赖项打包在应用中,这两个方法计数都会加上在该依赖项中定义的方法。

另请注意,缩减大小和代码缩减功能也会在源代码经过编译后显著改变DEX文件的内容。

图3.一个中等大小的应用 过滤DEX文件树状视图 在Class列表正上方,APK分析器提供了用于查看选定DEX文件内容的过滤器。

图4.DEX过滤器设置为显示BuildConfig的字段和方法 如需使用过滤器来显示某个类中的所有方法和字段,请执行以下操作: 在File列表中,选择classes.dex文件。

在Class列表中,导航到一个类并选择该类。

展开您选择的类。

切换Showfields图标以显示或隐藏类字段。

切换Showmethods图标以显示或隐藏类方法。

切换Showallreferencedmethodsorfields图标以显示或隐藏引用的软件包、类、方法和字段。

在树状视图中,斜体节点是在选定DEX文件中没有定义的引用。

DEX文件可以引用在其他文件中定义的方法和字段。

例如,System.out.println()是对Android框架中的println()方法的引用。

加载ProGuard映射 过滤器图标旁边是ProGuard映射图标。

它们处于灰显状态,直到您加载一组ProGuard映射文件来向DEX查看器添加一些功能,如对名称进行去混淆处理(mapping.txt)、显示已移除的节点(usage.txt),以及指示无法移除的节点(seeds.txt)。

您导入的ProGuard映射文件的build必须与启用了代码缩减功能后生成的APK的build相同。

如需了解详情,请参阅缩减、混淆和优化应用。

图5.加载ProGuard映射 要加载ProGuard映射文件,请执行以下操作: 点击LoadProguardMappings。

导航到包含映射文件的项目文件夹,然后加载所有文件、文件的任意组合或包含文件的文件夹。

映射文件通常位于project/app/build/outputs/mappings/release/。

如果文件选择器检测到此项目结构,会默认选择release文件夹。

首先,文件选择器会检查与mapping.txt、seeds.txt和usage.txt完全匹配的文件名。

接下来,文件选择器会检查在任意位置包含文本mapping、usage或seeds且以.txt结尾的文件名。

例如,release-seeds-1.10.15.txt就是一个匹配项。

以下列表介绍了映射文件: seeds.txt:ProGuard配置阻止在缩减过程中移除的节点以粗体显示。

mapping.txt:启用Deobfuscatenames,以便恢复由R8进行了混淆处理的节点的原始名称。

例如,可以将a、b、c之类进行了混淆处理的节点名称恢复为MyClass、MainActivity和myMethod()。

usage.txt:启用Showremovednodes,以便显示R8在缩减过程中移除的类、方法和字段。

恢复的节点带删除线。

如需详细了解如何使用R8对代码进行混淆处理并最大限度地减小其大小,请参阅缩减、混淆处理和优化应用。

显示字节码、查找用法以及生成Keep规则 Class列表视图中的节点具有一个上下文菜单,其中包含以下选项,可用于查看字节码、查找用法以及显示一个对话框(其中显示了您可以为选定节点复制并粘贴的ProGuard规则)。

右键点击Class列表视图中的任意节点即可显示其上下文菜单。

Showbytecode:对选定的类、方法或字段进行反编译,并在对话框中显示smali字节码(而不是Java代码)表示形式,如下所示: 图6.init方法的DEX字节码 Findusages:显示DEX代码的哪些其他部分对选定的类或方法进行了引用(图7)。

如果加载了seeds.txt,以粗体显示的节点表示Proguard配置阻止在缩减过程中移除这些节点: 图7.对MyClass的引用 GenerateProguardKeeprule:显示您可以复制并粘贴到项目Proguard配置文件中的Proguard规则,这些规则可阻止在代码缩减阶段移除给定的软件包、类、方法或字段(图8)。

如需了解详情,请参阅自定义要保留的代码。

图8.您可以从对话框复制到Proguard配置文件中的Proguard规则 查看代码和资源实体 各种构建任务会更改应用中的最终实体。

例如,Proguard缩减规则可能会改变您的最终代码,而图片资源可能会被产品变种中的资源替换。

使用APK分析器可以轻松查看文件的最终版本:只需点击相应实体,下方便会显示文本或图片实体的预览,如图9所示。

图9.最终图片资源的预览 APK分析器还可以显示各种文本和二进制文件。

例如,在resources.arsc实体查看器中,您可以查看配置专用的值,如字符串资源的语言翻译。

在图10中,您可以看到每个字符串资源的翻译。

图10.已翻译字符串资源的预览 比较文件 APK分析器可以比较两个不同APK或appbundle文件中的实体大小。

当您需要了解为什么您的应用较之先前版本有所增大时,这非常有用。

在发布经过更新的应用之前,请执行以下操作: 将要发布的应用版本加载到APK分析器中。

点击APK分析器右上角的CompareWith。

在选择对话框中,找到上次向用户发布的工件,然后点击OK。

此时将显示一个类似于图11中的对话框,帮助您评估更新可能会对用户产生的影响。

图11显示了特定应用的调试build和发布build之间的差异。

这两种构建类型使用不同的构建选项,因而会以不同的方式改变底层实体。

图11.调试版本APK和发布版本APK之间的差异 ContentandcodesamplesonthispagearesubjecttothelicensesdescribedintheContentLicense.JavaandOpenJDKaretrademarksorregisteredtrademarksofOracleand/oritsaffiliates. Lastupdated2021-09-27UTC. [{ "type":"thumb-down", "id":"missingTheInformationINeed", "label":"没有我需要的信息" },{ "type":"thumb-down", "id":"tooComplicatedTooManySteps", "label":"太复杂/步骤太多" },{ "type":"thumb-down", "id":"outOfDate", "label":"内容需要更新" },{ "type":"thumb-down", "id":"translationIssue", "label":"翻译问题" },{ "type":"thumb-down", "id":"samplesCodeIssue", "label":"示例/代码问题" },{ "type":"thumb-down", "id":"otherDown", "label":"其他" }] [{ "type":"thumb-up", "id":"easyToUnderstand", "label":"易于理解" },{ "type":"thumb-up", "id":"solvedMyProblem", "label":"解决了我的问题" },{ "type":"thumb-up", "id":"otherUp", "label":"其他" }] Twitter 在Twitter上关注@AndroidDev YouTube 在YouTube上访问“AndroidDevelopers”频道 LinkedIn 在LinkedIn上与Android开发者社区交流沟通 关于Android Android 适用于企业的Android 安全 源代码 新闻 博客 播客 发现 游戏 机器学习 隐私权政策 5G Android设备 大屏幕 WearOS AndroidTV AndroidforCars AndroidThings Chrome操作系统设备 版本 Android11 Android10 Pie Oreo Nougat Marshmallow Lollipop KitKat 文档和下载 AndroidStudio指南 开发者指南 API参考 下载Studio AndroidNDK 支持 报告平台错误 报告文档错误 GooglePlaysupport 参加调查研究 Android Chrome Firebase GoogleCloudPlatform 所有产品 隐私权政策 许可 品牌指南 通过电子邮件接收资讯和提示 订阅 Language English BahasaIndonesia Español–AméricaLatina Português–Brasil 中文–简体 日本語 한국어



請為這篇文章評分?