Android apkanalyzer简介

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。

专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。

目录

  • 一、导读
  • 二、概览
  • 三、用法
    • [3.1 使用 Android Studio](#3.1 使用 Android Studio)
      • [3.1.1 查看文件和大小信息](#3.1.1 查看文件和大小信息)
      • [3.1.2 查看 AndroidManifest.xml](#3.1.2 查看 AndroidManifest.xml)
      • [3.1.3 查看 DEX 文件](#3.1.3 查看 DEX 文件)
      • [3.1.4 过滤 DEX 文件树状视图](#3.1.4 过滤 DEX 文件树状视图)
      • [3.1.5 加载 ProGuard 映射](#3.1.5 加载 ProGuard 映射)
      • [3.1.6 显示字节码、查找用法以及生成 Keep 规则](#3.1.6 显示字节码、查找用法以及生成 Keep 规则)
      • [3.1.7 查看代码和资源实体](#3.1.7 查看代码和资源实体)
      • [3.1.8 比较文件](#3.1.8 比较文件)
    • [3.2 使用 命令行](#3.2 使用 命令行)
  • [四、 推荐阅读](#四、 推荐阅读)

一、导读

我们继续总结学习基础知识,温故知新。

apkanalyzer 用于分析我们生成的apk,可以得到各种我们想要的信息,

例如分析 APK 文件属性,如应用 ID、版本代码和版本名称,查看文本、图像和字符串资源等等。

常用的如:

java 复制代码
apkanalyzer apk summary xxx.apk 输出应用 ID、版本代码和版本名称。 eg: com.myapp  5   1.1-beta

二、概览

通过 APK 分析器的命令行版本,您可以在构建流程完成后立即了解 APK 的组成,并且可以比较两个 APK 之间的差异。

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

apkanalyzer 包含在 Android SDK 命令行工具软件包中(位于 android_sdk/cmdline-tools/version/bin/apkanalyzer)。

或者,您也可以在 Android Studio 中访问 APK 分析器工具,如使用 APK 分析器来分析您的 build 中所述。

三、用法

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

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

您也可以使用 apkanalyzer 从命令行运行 APK 分析器。

下面我们分部讲解一下.

3.1 使用 Android Studio

可以通过以下三种方式访问 APK 分析器:

  • 将 APK 或 app bundle 拖到 Android Studio 的 Editor 窗口中。
  • 在 Project 窗口中切换到 Project 视图,然后在默认的 build/output/apks/ 目录中双击相应 APK。
  • 在菜单栏中依次选择 Build > Analyze APK,然后选择您的 APK 或 app bundle。

打开后就可以直接查看相关信息了,这一步是傻瓜式的操作了。

通过 apkanalyzer,我们可以:

3.1.1 查看文件和大小信息

3.1.2 查看 AndroidManifest.xml

3.1.3 查看 DEX 文件

3.1.4 过滤 DEX 文件树状视图

3.1.5 加载 ProGuard 映射

3.1.6 显示字节码、查找用法以及生成 Keep 规则

这个我们讲一下,使用方式为先选定一个dex文件,然后在下面展示类的窗口中选择一个类,然后点击右键即可。

  • Show bytecode

    对选定的类、方法或字段进行反编译,并在对话框中显示 smali 字节码表示形式

  • Find usages

    显示 DEX 代码的哪些其他部分对选定的类或方法进行了引用,如果加载了 seeds.txt,以粗体显示的节点表示 ProGuard 配置阻止在压缩过程中移除这些节点。

  • Generate Proguard Keep rule

    生成 Keep 规则,大白话就是如果你不想混淆这个类,使用该选择之间生成keep规则即可。

3.1.7 查看代码和资源实体

3.1.8 比较文件

apkanalyzer

3.2 使用 命令行

apkanalyzer 的语法为:

java 复制代码
apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]
  • global-options: 这里我们常用的有 -h ,简单易懂的格式(-h 选项)
  • subject :要查询的内容,常用的有 apk, files, manifest, dex, resources
  • verb :要了解的关于 subject 的内容
java 复制代码
apkanalyzer -h apk verb [options] apk-file [apk-file2]
apkanalyzer -h files verb [options] apk-file [apk-file2]
apkanalyzer -h manifest verb [options] apk-file [apk-file2]
apkanalyzer -h dex verb [options] apk-file [apk-file2]
apkanalyzer -h resources verb [options] apk-file [apk-file2]

-h 可要可不要

我们列一下常用命令

查看 APK 文件属性 说明
apkanalyzer apk summary xxx.apk 输出应用 ID、版本代码和版本名称。 eg: com.myapp 5 1.1-beta
apkanalyzer apk file-size xxx.apk 输出 APK 的总文件大小
apkanalyzer apk download-size xxx.apk 输出 APK 的下载大小估计值
apkanalyzer apk features xxx.apk 输出 APK 用来触发 Play 商店过滤的功能
apkanalyzer apk features --not-required xxx.apk 输出 APK 用来触发 Play 商店过滤的功能。添加 --not-required 选项可在输出中包含标记为"非必需"的功能
apkanalyzer apk compare xxx1.apk xxx2.apk 比较 apk-file 和 apk-file2 的大小。输出示例(旧大小/新大小/大小差异/路径)
apkanalyzer apk compare --different-only xxx1.apk xxx2.apk 比较 apk-file 和 apk-file2 的大小,输出存在差异的目录和文件
apkanalyzer apk compare --files-only xxx1.apk xxx2.apk 比较 apk-file 和 apk-file2 的大小。不输出目录条目
apkanalyzer apk compare --patch-size xxx1.apk xxx2.apk 比较 apk-file 和 apk-file2 的大小。逐个显示每个文件的补丁大小估计值,而不是原始差异
查看 APK 文件系统 说明
apkanalyzer files list xxx.apk 列出 APK 中的所有文件
apkanalyzer files cat --file path xxx.apk 输出文件内容。您必须使用 --file path 选项(如 --file /AndroidManifest.xml)指定 APK 内的路径。
查看清单中的信息 说明
apkanalyzer manifest print xxx.apk 以 XML 格式输出 APK 清单。
apkanalyzer manifest application-id xxx.apk 输出应用 ID 值。
apkanalyzer manifest version-name xxx.apk 输出版本名称值。
apkanalyzer manifest version-code xxx.apk 输出版本代码值。
apkanalyzer manifest min-sdk xxx.apk 输出最低 SDK 版本。
apkanalyzer manifest target-sdk xxx.apk 输出目标 SDK 版本。
apkanalyzer manifest permissions xxx.apk 输出权限列表
apkanalyzer manifest debuggable xxx.apk 输出应用是否可调试。
查看清单中的信息 说明
dex list apk-file 输出 APK 中的 DEX 文件列表。
dex references [--files path] [--files path2] apk-file 输出指定 DEX 文件中的方法引用数。 默认包含所有 DEX 文件。添加 --files 选项可指明要包含的特定文件。 输出示例:classes.dex 59598
dex packages [option1 option2 ...] apk-file 输出 DEX 中的类树。在输出中,P、C、M 和 F 分别表示软件包、类、方法和字段。x、k、r 和 d 分别表示已移除、保留、引用和定义的节点。
dex code --class class [--method method] 以 smali 格式输出类或方法的字节码。输出中必须包含类名,并且要输出完全限定类名以进行反编译。添加 --method 选项可指定要反编译的方法。方法反编译的格式为 name(params)returnType,例如 someMethod(Ljava/lang/String;I)V。
packages 添加以下选项可优化输出:

--defined-only:在输出中仅包含 APK 中定义的类。
--files:指定要包含的 DEX 文件名。默认:所有 DEX 文件。
--proguard-folder file:指定用于搜索映射的 Proguard 输出文件夹。
--proguard-mappings file:指定 Proguard 映射文件。
--proguard-seeds file:指定 Proguard 种子文件。
--proguard-usages file:指定 Proguard 用法文件。
--show-removed:显示由 Proguard 移除的类和成员。
输出示例(类型/状态/定义的方法/引用的方法/字节大小/名称):



P d 1 1 85 g
P d 1 1 85 g.a
C d 1 1 85 g.a.a
M d 1 1 45 g.a.a java.lang.Object get()
C r 0 1 40 byte[]
M r 0 1 40 byte[] java.lang.Object clone()
查看存储在 res/ 和 resources.arsc 中的资源 说明
resources packages 输出资源表中定义的软件包列表。
resources configs --type type [--package package] apk-file 输出指定 type 的配置列表。 type 是资源类型,如 string。 如果要指定资源表软件包名称,请添加 --package 选项,否则系统将使用第一个定义的软件包。
resources value --config config --name name --type type [--package package] apk-file 输出由 config、name 和 type 指定的资源的值。type 选项是资源类型,如 string。如果要指定资源表软件包名称,请添加 --package 选项,否则系统将使用第一个定义的软件包。
resources names --config config --type type [--package package] apk-file 输出属于某个配置和类型的资源名称列表。type 选项是资源类型,如 string。 如果要指定资源表软件包名称,请添加 --package 选项,否则系统将使用第一个定义的软件包。
resources xml --file path apk-file 以简单易懂的形式输出 XML 二进制文件。 添加 file 选项可指定文件的路径。

apkanalyzer

四、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

相关推荐
工业甲酰苯胺7 分钟前
MySQL 主从复制之多线程复制
android·mysql·adb
少说多做34318 分钟前
Android 不同情况下使用 runOnUiThread
android·java
Estar.Lee2 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
找藉口是失败者的习惯2 小时前
从传统到未来:Android XML布局 与 Jetpack Compose的全面对比
android·xml
Jinkey4 小时前
FlutterBasic - GetBuilder、Obx、GetX<Controller>、GetxController 有啥区别
android·flutter·ios
大白要努力!5 小时前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟6 小时前
Android音频采集
android·音视频
小白也想学C7 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程7 小时前
初级数据结构——树
android·java·数据结构
闲暇部落10 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin