构建-13 Analyzer APK文件分析

官方文档

使用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

原文地址:https://www.cnblogs.com/baiqiantao/p/9374792.html

时间: 2024-10-10 12:26:27

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

apk文件分析原则

如果在dex生成的jar文件里没有发现关键内容的话,就要注意jar里面的native函数以及loadlibrary操作,从而可以判断出加载了哪些so,调用了什么函数.就不会出现判断不出是不是加载了某so的情况了. IDA调试的时候,只要勾选加载so时pause,通过so路径,就能很容易判断出来是不是apk自带的so文件了,attach是一种方法,但是很多情况下,关键点是在加载过程中的,很容易漏掉.

vue-cli构建项目得到的文件分析以及优化

参考文章: https://segmentfault.com/q/1010000008832754

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

Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗.本文主要介绍如何安装配置 Memory Analyzer,并结合一个实例,介绍如何利用 MAT 来进行堆转储文件分析,找到内存泄露的根源. 0 评论: 仇 璐, 软件工程师, IBM 杨 晓峰, 软件工程师, IBM 2010 年 7 月 22 日 内容 在 IB

Eclipse Memory Analyzer 进行堆转储文件分析

概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据. 通常内存泄露分析被认为是一件很有难度的工作,一般由团队中的资深人士进行.不过,今天我们要介绍的 MAT(Eclipse Memory Analyzer)被认为是一个“傻瓜式

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

反编译APK成功后,在outdir目录下会生成一系列目录与文件. smali:程序所有的反汇编代码: res:程序中所有的资源文件: 如何寻找突破口是分析程序的关键.错误提示一般是指引关键代码的风向标,错误提示附近一般是核心验证代码,我们需要阅读这些代码来理解软件的注册流程. 错误提示是安卓中的字符串资源: 1:硬编码到源码中: 2:引用自“res\values"目录下的string.xml文件. apk文件在打包时,string.xml文件中的字符串被加密存储在resources.arsc文件

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

转载地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗.本文主要介绍如何安装配置 Memory Analyzer,并结合一个实例,介绍如何利用 MAT 来进行堆转储文

APP的Android.mk文件分析

转载至:http://blog.csdn.net/bmw7bmw7/article/details/45482599 APP的Android.mk文件分析 2015-05-04 16:22 52人阅读 评论(0) 收藏 举报 android应用源码 [plain] view plaincopyprint? 1.  # 调用宏my-dir,这个宏返回当前Android.mk文件所在的路径 2.  LOCAL_PATH:= $(call my-dir) 3. 4.  # 包含CLEAR_VARS变量

ElasticSearch 启动时加载 Analyzer 源码分析

ElasticSearch 启动时加载 Analyzer 源码分析 本文介绍 ElasticSearch启动时如何创建.加载Analyzer,主要的参考资料是Lucene中关于Analyzer官方文档介绍.ElasticSearch6.3.2源码中相关类:AnalysisModule.AnalysisPlugin.AnalyzerProvider.各种Tokenizer类和它们对应的TokenizerFactory.另外还参考了一个具体的基于ElasticSearch采用HanLP进行中文分词的

【转】 Apk文件及其编译过程

Apk文件概述 Android系统中的应用程序安装包都是以apk为后缀名,其实apk是Android Package的缩写,即android安装包. 注:apk包文件其实就是标准的zip文件,可以直接用解压缩软件解开.Apk包中的内容 解压缩一个apk文件后,目录结构一般如下: *.apk ├-res │ ├+layout │ └+drawable ├-META-INF │ ├-MANIFEST.MF │ ├-CERT.SF │ └-CERT.RSA ├-resources.arsc ├-cla