[译] 使用 APK Analyzer 分析你的 APK

标签: dev | 发表时间:2017-04-21 08:00 | 作者:
出处:http://itindex.net/admin/pagedetail

本文来自“天天P图攻城狮”公众号(ttpic_dev)

本文是对 《Analyze Your Build with APK Analyzer》 的翻译。

Android Studio 2.2包含了APK Analyzer,通过它我们能够直观地看到APK的组成。使用APK Analyzer不仅能够减少你花在debug上的时间,而且还能减少你的APK大小。使用APK Analyzer,你能够实现:

  • 查看APK中文件的绝对大小和相对大小。(译注:相对大小指的是该文件占整个APK大小的百分比)

  • 理解DEX文件的组成。(译注:能看到DEX文件中包含了哪些类)

  • 快速查看APK中文件的最终版本(比如AndroidManifest.xml)。(译注:AndroidManifest.xml、resources.arsc本来是二进制形式显示的,APK Analyzer能够解析并显示这些文件的内容)

  • 对比两个APK。(译注:新版APK和旧版APK之间文件大小的差异)

这里有3种方法访问APK Analyzer:

  • 拖拽APK到Android Studio的编辑窗口。

  • 切换到Project视图,并且双击APK文件。

  • 在菜单栏中选择Build > Analyzer APK,并且选择APK。

注意:当使用APK Analyzer分析debug的APK,请使用Build > Build APK生成的APK。点击Run将会生成Instant Run的APK。APK Analyzer不能分析通过Instant Run生成的APK,判断APK是否是Intant Run生成的可以通过看APK中是否有instant-run.zip文件。

译注:APK Analyzer是让我们更有效地制定减包方案的实用工具,它能够让我们发现使得APK变大的元凶。

查看文件和大小信息

APK就是一个zip包。APK Analyzer显示每个文件或目录作为一个实体,实体的层级说明了APK文件的结构。

如图1,APK Analyzer对每个实体显示了raw file size和download file size。Raw File Size表示实体在磁盘中解压后的大小,而Download Size表示实体在Google Play中压缩后的大小。% of Total Download Size表示实体的download size占APK总的download size的百分比。

译注:图1中,最上面的5.8M是指APK在磁盘中的大小,而4.9M是指从Google Play中下载的大小。

图1:在APK Analyzer中的文件大小

译注:通过查看各个目录或文件的大小,我们能发现APK中哪个区域的文件太大了,比如如果dex太大,我们是不是引入了重复功能的第三方库(比如Glide和Fresco),或者抽取出一个精简的第三方库(精简ffmpeg库);如果res目录太大,我们可以看看哪些图片过大了,需要通过tinypng压缩,或者用webp代替。

查看AndroidManifest.xml

如果项目中包含了多个AndroidManifest.xml或者包含提供manifest文件的library,在APK中他们将被合并为一个manifest文件。在APK中manifest文件是普通的二进制文件,但是在APK Analyzer中查看manifest文件,该文件是以XML形式显示的。这种显示形式让我们能理解应用中的任何变化。比如,你能看到library中的AndroidManifest.xml是怎么合入最后的AndroidManifest.xml的。

另外,这种显示形式提供了lint的能力,会在右上角显示警告、错误提示。图2显示了manifest文件的错误提示。

图2:manifest文件的一个错误

查看代码和资源实体

不同的构建任务会改变APK文件最后的实体。比如混淆压缩规则能改变你最后的代码和图片资源。在APK Analyzer中能够快速查看文件的最终版本:点击实体,就能在下面看到文件的内容,包含文字和图片实体的预览。

图3:最终图片资源的预览

APK Analyzer也能展示文本或二进制文件。比如点击resources.arsc能够让你看到针对配置特定的值(例如一个字符串资源的特定语言的翻译)。如图4,你能看到每个字符串资源的翻译。

图4:翻译的字符串资源预览

查看DEX文件

APK Analyzer的DEX文件浏览器让你能够快速了解DEX文件的信息。我们能看到类、包、总的引用和声明个数,这些信息能够帮助我们决定是否使用multi-dex或者移除依赖使得满足64K方法数限制。

图5展示了一个中等大小的APP(方法数接近64K)。每个包、类、方法都列有Defined Method和Referenced Method。Referenced Method列是DEX文件中引用的全部方法,它包含了你定义的方法、依赖的library、定义在标准Java和Android包中的方法。Defined Method列只包含了定义在DEX文件中方法,因此它是Referenced Method方法的子集。注意当你引入一个依赖,在依赖中定义的方法会包含在Defined Method和Referenced Method中。还要注意,混淆压缩也会改变DEX文件的内容。

图5:一个使用了multi-dex的应用

比较APK文件

APK Analyzer能比较两个不同APK中各个实体的大小。这对于我们了解为何你的APP相比上个版本变大了是很有用的。

在发布一个新版APK之前,在APK Analyzer中导入你即将发布的APK。在右上角点击Compare With,选择上一个版本的APK,点击OK。然后就会出现类似图6的对话框,允许你比较之间的差别。

图6显示了一个APP的debug和release包的差别,不同的编译类型会导致实体的不同。

译注:Old Size是先选择的APK,New Size是后选择的APK。

图6:debug和release的APK之间的差别



如果您觉得我们的内容还不错,就请转发到朋友圈,和小伙伴一起分享吧~

相关 [apk analyzer 分析] 推荐:

[译] 使用 APK Analyzer 分析你的 APK

- - IT瘾-dev
本文来自“天天P图攻城狮”公众号(ttpic_dev). 本文是对 《Analyze Your Build with APK Analyzer》 的翻译. Android Studio 2.2包含了APK Analyzer,通过它我们能够直观地看到APK的组成. 使用APK Analyzer不仅能够减少你花在debug上的时间,而且还能减少你的APK大小.

APK文件分析工具:AppMon

- - FreeBuf.COM | 关注黑客与极客
对手机恶意软件研究人员来说,有很多APP行为分析工具可以选择,在这里,我要向大家推荐的是AppMon,它可以通过二进制指令获取app程序运行记录,并显示调用函数和相关参数. AppMon使用了多平台动态框架环境Frida,Frida是一款基于python + javascript 的hook框架,适应android\ios\linux\win\osx等平台的脚本交互环境.

一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

- -
在平时开发、测试过程中、甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题. 我们需要找造成OutOfMemoryError原因. 1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;. 2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况.

使用Memory Analyzer tool(MAT)分析内存泄漏

- - 移动开发 - ITeye博客
前言的前言:本文是自2005年8月以来,首次在一个月之内发布三篇文章. 谨以此文献给这么多年始终不济的我. 北漂快两年了,何时能回到故乡,回去后又会怎样,也许永远是个未知……. 在平时工作过程中,有时会遇到OutOfMemoryError,我们知道遇到Error一般表明程序存在着严重问题,可能是灾难性的.

使用MAT(Memory Analyzer Tool)工具分析dump文件

- -
《使用MAT(Memory Analyzer Tool)工具分析dump文件》. 生产环境中,尤其是吃大内存的JVM,一旦出现内存泄露等问题是非常容易引发OutofMemory的,如果没有一个好的工具提供给开发人员定位问题和分析问题,那么这将会是一场 噩梦. 目前JDK其实自带有一些内存泄露分析工具专门用于帮助开发人员定位内存泄露等问题,但是这些工具往往并不是能够满足一些现状,这里笔者所指的现状更多是迅速、便捷、高效的定位出问题,方便开发人员迅速进行调整.

Eclipse Memory Analyzer简介

- - Java - 编程语言 - ITeye博客
Eclipse Memory Analyzer是一个非常棒的堆内存分析工具,是JDK自带的堆分析工具jhat的一个非常好的替代品,能够快速地定位Java内存泄露的原因.       可能有的同学会问,JVM不是号称自动内存管理,GC会自动垃圾回收,Java怎么会有内存泄露,不会搞错吧.       在开始分析之前,我们先想想,在编程这个角度上,我们如何避免堆内存泄露呢.

java解析APK

- - Linux - 操作系统 - ITeye博客
1、结合安卓提供apktool工具,用java执行cmd解析命令获取apk信息. 2、利用相关jar包里的集成方法解析apk. 这里只给出第二种方法,因为第一种方法在linux服务器下会出现不在控制范围之内的结果. // 将解压文件对象转列举对象. // 获得名为AndroidManifest.xml的文件.

ORACLE SQL Performance Analyzer的使用

- - CSDN博客数据库推荐文章
通过 SPA,您可以根据各种更改类型(如初始化参数更改、优化器统计刷新和数据库升级)播放特定的. SQL 或整个 SQL 负载,然后生成比较报告,帮助您评估它们的影响.. 在 Oracle Database 11g 之前的版本中,我必须捕获所有 SQL 语句,通过跟踪运行这些语句,. 然后得到执行计划 — 这是一项极其耗时又极易出错的任务.

android apk反编译

- - CSDN博客推荐文章
3.查看Jar包的GUI工具. apk文件其实就是一个MIME为zip的压缩包,可以用winrar软件打开看到里面的文件结构. 解压缩后找到里面的classes.dex文件,classes.dex文件就是java文件编译再通过Dalvik须立即提供的dx打包工具打包而成的,接下来就用2个工具来逆向导出java源文件.

SQL Performance Analyzer SPA常用脚本汇总

- - CSDN博客数据库推荐文章
附件为 一个SPA报告  spa_buffergets_summary. SQL 性能分析器 SQL Performance Analyzer SPA. Oracle Database 11g 引入了 SQL 性能分析器;使用该工具可以准确地评估更改对组成工作量的 SQL 语句的影响. SQL 性能分析器可帮助预测潜在的更改对 SQL 查询工作量的性能影响.