构建-13 Analyzer APK文件分析

时间:2021-09-28 16:37:02

官方文档

使用APK Analyzer分析您的构建

 [Analyze your build with APK Analyzer]
Android Studio包含一个APK分析器,可在构建过程完成后立即深入了解APK的组成。使用APK分析器可以减少您在应用中调试DEX文件和资源调试问题所花费的时间,并有助于减少您的APK大小。它也可以通过命令行apkanalyzer使用。

使用APK分析器,您可以完成以下操作:
  • 查看APK中文件的绝对大小和相对大小,例如DEX和Android资源文件。
  • 了解DEX文件的组成。
  • 快速查看APK中文件的最终版本,例如AndroidManifest.xml文件。
  • 对两个APK进行并排比较[side-by-side comparison]。

项目打开时,有三种方法可以访问APK Analyzer:
  • 将APK拖到Android Studio的编辑器窗口中。
  • Switch to the Project perspective in the Project window,然后在默认的build / output / apks /目录中双击APK。
  • 在菜单栏中选择Build> Analyze APK,然后选择您的APK。
重要:分析调试版本时,请使用通过选择Build> Build APK或gradle命令创建的APK。单击工具栏中的 Run 会生成启用了Instant Run的APK,这些APK不应与APK Analyzer一起用于优化任务,因为它们仅供开发使用,并动态加载大多数资源。您可以通过是否有 instant-run.zip 文件嵌入在APK中来识别即时运行APK。
1
1
1
重要:分析调试版本时,请使用通过选择Build> Build APK或gradle命令创建的APK。单击工具栏中的 Run 会生成启用了Instant Run的APK,这些APK不应与APK Analyzer一起用于优化任务,因为它们仅供开发使用,并动态加载大多数资源。您可以通过是否有 instant-run.zip 文件嵌入在APK中来识别即时运行APK。

查看文件和大小信息

[View file and size information]
APK是遵循ZIP文件格式的文件[APKs are files that follow the ZIP file format]。 APK分析器将每个文件或文件夹显示为具有可用于导航到文件夹的扩展功能[expansion functionality available to navigate into folders]的实体。 实体的层次结构[mirrors]反映了[mirrors]APK文件中文件和文件夹的结构。

APK Analyzer显示每个实体的原始文件大小和下载文件大小值,如图1所示。原始文件大小表示磁盘上实体的解压缩大小[unzipped size],而下载大小表示实体的估计压缩大小[estimated compressed size],因为它将通过 Google Play分发。 总下载大小的百分比表示实体所代表的APK总下载大小的百分比。
构建-13 Analyzer APK文件分析
Figure 1. File sizes in the APK Analyzer

查看清单文件

如果您的项目包含多个AndroidManifest.xml文件(such as for product flavors)或包含也提供清单文件的库,则它们将合并到APK中的单个文件中。 此清单文件通常是APK中的二进制文件,但在APK分析器中选择后,将重建并呈现此实体的XML格式[the XML form of this entity is reconstructed and presented]。 通过此查看器,您可以了解在构建期间可能对应用程序所做的任何更改。 例如,您可以看到应用程序所依赖的库中的AndroidManifest.xml文件是如何合并到最终的AndroidManifest.xml文件中的。
此外,此查看器提供一些lint功能,并在右上角显示警告或错误。 图2显示了为选定的清单文件报告的错误。
构建-13 Analyzer APK文件分析
Figure 2. An error icon appears in the right margin for the selected manifest file

查看 DEX 文件

APK Analyzer的DEX文件查看器使您可以立即访问应用程序中DEX文件中的基础信息[underlying information]。查看器中提供了类,包,总引用[total reference]和声明计数,这有助于决定是否使用multidex或如何删除依赖项以低于64K DEX限制。

图3描绘了[depicts]一个低于64k DEX限制的中型应用程序。 DEX文件中的每个包,类和方法都包含在 Defined Method and Referenced Methods 列中列出的计数。 Referenced Methods列计算DEX文件引用的所有方法。这通常包括代码中定义的方法,依赖库以及代码使用的标准Java和Android包中定义的方法 - 这些是在每个DEX文件中计入64k方法限制的方法。 Defined Methods列仅计算在其中一个DEX文件中定义的方法,因此该数字是 Referenced Methods 的子集。
请注意,在APK中打包依赖项时,依赖项中定义的方法会添加两个方法计数。
另请注意,编译源代码后,缩小[minification]和/或Proguard收缩也会大大改变DEX文件的内容。
2
2
1
请注意,在APK中打包依赖项时,依赖项中定义的方法会添加两个方法计数。
2
另请注意,编译源代码后,缩小[minification]和/或Proguard收缩也会大大改变DEX文件的内容。
构建-13 Analyzer APK文件分析
构建-13 Analyzer APK文件分析
Figure 3. A medium-sized app

过滤DEX文件树视图

[Filter the DEX file tree view]
在 Class 列表上方,APK Analyzer提供了用于查看所选DEX文件内容的过滤器。

要使用过滤器显示类中的所有方法和字段,请执行以下操作:
  • 在 File 列表中,选择 classes.dex文件。
  • 在 Class 列表中,导航到并选择一个class,展开您选择的class。
  • 点击切换按钮以显示或隐藏类字段或方法。
  • 点击切换显示所有引用的方法或字段以显示或隐藏引用的包,类,方法和字段。 在树视图中,斜体节点[talicized nodes]是在所选DEX文件中没有定义的引用。
构建-13 Analyzer APK文件分析
DEX文件可以引用在不同文件中定义的方法和字段。 例如,System.out.println()是对Android框架中println()方法的引用。

加载 Proguard 映射文件

过滤图标旁边是Proguard映射图标。 它们将显示为灰色,直到您加载一组Proguard映射文件,这些文件向DEX查看器添加功能,例如反混淆名称(mapping.txt),显示已删除的节点(usage.txt)以及指示无法删除的节点(seeds.txt)。 Proguard映射文件适用于使用Proguard启用的APK,并且必须来自生成APK的相同构建。

要加载Proguard映射文件,请执行以下操作:
单击"Load Proguard Mappings"。
导航到包含映射文件的项目文件夹,并加载所有文件或任意文件的组合或包含这些文件的文件夹。
映射文件通常位于 project / app / build / outputs / mappings / release / 中。 如果文件选择器检测到此项目结构,则默认导航到release文件夹。
构建-13 Analyzer APK文件分析 构建-13 Analyzer APK文件分析

以下列表描述了映射文件[describes the mapping files]:
  • seeds.txt:Proguard配置阻止在压缩过程中被删除的节点以粗体显示。
  • mapping.txt:启用反混淆[Deobfuscate]名称,以便您可以恢复由Proguard进行混淆处理的节点的原始名称。
  • usage.txt:启用Show removed节点,以便显示Proguard在压缩期间删除的类,方法和字段。 已被恢复的节点以删除线显示。
构建-13 Analyzer APK文件分析  
构建-13 Analyzer APK文件分析  构建-13 Analyzer APK文件分析

显示字节码,查找用法,生成Keep规则

[Show bytecode, find usages, and generate Keep rule]
Class 列表视图中的节点具有上下文菜单,其中包含以下选项,可允许你查看字节码,查找用法,以及显示可显示 你为所选节点复制和粘贴的Proguard规则的对话框[display a dialog that shows Proguard rules that you can copy and paste for the selected node]。 右键单击 Class 列表视图中的任何节点以显示其上下文菜单。
构建-13 Analyzer APK文件分析

1、显示字节码:反编译[Decompiles]选定的类,方法或字段,并在对话框中显示smali(not Java code)字节码表示,如下所示:
原始代码:
public void a() {
	System.out.println("GoodBye");
}
x
1
public void a() {
2
    System.out.println("GoodBye");
3
}
字节码:
.method public a()V
    .registers 3

    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const-string v1, "GoodBye"

    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    return-void
.end method
11
1
.method public a()V
2
    .registers 3
3

4
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
5

6
    const-string v1, "GoodBye"
7

8
    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
9

10
    return-void
11
.end method

2、查找用法:显示DEX代码的其他部分对所选类或方法的引用。 如果加载了seeds.txt,则以粗体显示的节点表示Proguard配置会阻止它们在压缩期间被删除:
构建-13 Analyzer APK文件分析
构建-13 Analyzer APK文件分析

3、生成Proguard Keep规则:显示可以复制并粘贴到项目Proguard配置文件中的Proguard规则,以防止在Proguard压缩阶段删除给定的包,类,方法或字段。 有关更多信息,请参阅 Customize which code to keep.
例如对于 OtherClass2,在弹窗中生成的信息为:
# Add *one* of the following rules to your Proguard configuration file.
# Alternatively作为选择, you can annotate classes and class members with @android.support.annotation.Keep

# keep the class and specified members from being removed or renamed
-keep class com.bqt.test.OtherClass2 { *; }

# keep the specified class members from being removed or renamed
# only if the class is preserved保留
-keepclassmembers class com.bqt.test.OtherClass2 { *; }

# keep the class and specified members from being renamed only
-keepnames class com.bqt.test.OtherClass2 { *; }

# keep the specified class members from being renamed only
-keepclassmembernames class com.bqt.test.OtherClass2 { *; }
x
1
# Add *one* of the following rules to your Proguard configuration file.
2
# Alternatively作为选择, you can annotate classes and class members with @android.support.annotation.Keep
3

4
# keep the class and specified members from being removed or renamed
5
-keep class com.bqt.test.OtherClass2 { *; }
6

7
# keep the specified class members from being removed or renamed 
8
# only if the class is preserved保留
9
-keepclassmembers class com.bqt.test.OtherClass2 { *; }
10

11
# keep the class and specified members from being renamed only
12
-keepnames class com.bqt.test.OtherClass2 { *; }
13

14
# keep the specified class members from being renamed only
15
-keepclassmembernames class com.bqt.test.OtherClass2 { *; }

查看代码和资源实体

各种构建任务会更改APK文件中的最终实体。 例如,Proguard收缩规则可以改变您的最终代码,图像资源可以被产品风格中的资源覆盖。使用APK分析器可以轻松查看文件的最终版本。单击实体时,下面会显示文本或图像实体的预览。
构建-13 Analyzer APK文件分析

APK分析器还可以显示各种文本和二进制文件。 例如,resources.arsc实体查看器允许您查看特定于配置[configuration-specific]的值,例如字符串资源的语言转换。 在下图中,您可以看到每个字符串资源的翻译。
构建-13 Analyzer APK文件分析
构建-13 Analyzer APK文件分析
PS:如果你没有设置不同语言下的值,则只有 default 列有值,其他类没有值。
构建-13 Analyzer APK文件分析

比较APK文件

APK分析器可以比较两个不同APK文件中实体的大小。 当您需要了解应用程序与先前版本相比增加的原因时,这非常有用。 在发布更新的APK之前,请执行以下操作:
  • 将要发布的APK版本加载到APK分析器中。
  • 在APK分析器的右上角,单击“比较”。
  • 在选择对话框中,找到上次发布给用户的APK,然后单击“确定”。

类似于下图中的对话框似乎可以帮助您评估更新可能对用户产生的影响。
构建-13 Analyzer APK文件分析

Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.
Last updated June 5, 2018.

2018-7-26