官方文档

使用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总下载大小的百分比。
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显示了为选定的清单文件报告的错误。
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文件的内容。
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文件中没有定义的引用。
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文件夹。
 

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

显示字节码,查找用法,生成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 列表视图中的任何节点以显示其上下文菜单。

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配置会阻止它们在压缩期间被删除:

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分析器可以轻松查看文件的最终版本。单击实体时,下面会显示文本或图像实体的预览。

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

比较APK文件

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

构建-13 Analyzer APK文件分析的更多相关文章

  1. - Gradle 翻译 Analyzer APK文件分析 MD

    目录 目录 APK文件分析 使用 APK 分析器分析您的编译版本 查看文件和大小信息 查看 AndroidManifest.xml 查看 DEX 文件 过滤DEX文件树视图 加载 Proguard 映 ...

  2. apk文件分析原则

    如果在dex生成的jar文件里没有发现关键内容的话,就要注意jar里面的native函数以及loadlibrary操作,从而可以判断出加载了哪些so,调用了什么函数.就不会出现判断不出是不是加载了某s ...

  3. Android系统加载Apk文件的时机和流程分析(1)--Android 4.4.4 r1的源码

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80982869 Android系统在启动时安装应用程序的过程,这些应用程序安装好之 ...

  4. 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可 ...

  5. mat 使用 分析 oom 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...

  6. matlab M文件分析工具使用(Code Analyzer and Profiler)

    Code Analyzer and Profiler Matlab中,对写在m文件(.m文件)里的代码有分析的工具,可以进行优化,这里做一个简单的介绍. Code Analyzer Code Anal ...

  7. [Android Memory] 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    转载地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html Eclipse Memory Analyzer ...

  8. 破解第一个程序----分析APK文件

    反编译APK成功后,在outdir目录下会生成一系列目录与文件. smali:程序所有的反汇编代码: res:程序中所有的资源文件: 如何寻找突破口是分析程序的关键.错误提示一般是指引关键代码的风向标 ...

  9. Windows环境手动DOS命令构建apk文件

    第一步 抽取资源id,生成R.java aapt p[ackage] -f [-A <assets>] -S <res> -M <AndroidManifest.xml& ...

随机推荐

  1. [CEOI2017]Palindromic Partitions

    [CEOI2017]Palindromic Partitions 题目大意: 给出一个长度为\(n(n\le10^6)\)的只包含小写字母字符串,要求你将它划分成尽可能多的小块,使得这些小块构成回文串 ...

  2. input文字颜色、光标颜色

    <input type="text" placeholder="输入框"> input{ color: red;/*输入文字.光标颜色*/ -web ...

  3. Windows访问Linux的Ext4格式分区

    Ext2Fsd是Windows下一套很实用的Driver,虽然名称是ext2fsd但ext3/ext4都可读取,安装完成后电脑便可直接认得ext格式扇区 虽然官方介绍只能支持到Windows 8,但实 ...

  4. wap2.0开发

    前言 移动通信和互联网的迅速发展,使得互联网从固定向移动转移(即移动互联网)成为一种必然的趋势.由于手机终端本身的限制条件和无线链路的特点,现有无线传送技术的效率和可靠性会越来越难以令用户满意.如何让 ...

  5. External Input Counter and External interrupt

    External Input Counter and External interrupt : count the input signal from the button. So what is t ...

  6. ARM 非对齐的数据访问操作

    I’m confused about unaligned memory accesses on ARM. My understanding was that they’re not allowed — ...

  7. 《Go语言实战》摘录:6.4 并发 - 锁住共享资源

    6.4 锁住共享资源

  8. 布局控件Grid

    XAML概述 Silverlight的控件绘制是由XAML语言进行支持的.什么是XAML语言? 简单的说,XAML(Extensible Application Markup Language )是一 ...

  9. Subversion detected an unsupported working copy version

    关于这个错误:Subversion detected an unsupported working copy version while checking the status of 'XXXX'. ...

  10. eclipse 中 import sun.misc.BASE64Decoder; 报错

    from://http://blog.sina.com.cn/s/blog_48964b120101ahrf.html 在android做3DES加密功能时 eclipse 中 import sun. ...