Android apkanalyzer简介
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。
目录
- 一、导读
- 二、概览
- 三、用法
- 3.1 使用 Android Studio
- 3.1.1 查看文件和大小信息
- 3.1.2 查看 AndroidManifest.xml
- 3.1.3 查看 DEX 文件
- 3.1.4 过滤 DEX 文件树状视图
- 3.1.5 加载 ProGuard 映射
- 3.1.6 显示字节码、查找用法以及生成 Keep 规则
- 3.1.7 查看代码和资源实体
- 3.1.8 比较文件
- 3.2 使用 命令行
- 四、 推荐阅读
一、导读
我们继续总结学习基础知识,温故知新。
apkanalyzer 用于分析我们生成的apk,可以得到各种我们想要的信息,
例如分析 APK 文件属性,如应用 ID、版本代码和版本名称,查看文本、图像和字符串资源等等。
常用的如:
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 的语法为:
apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]
- global-options: 这里我们常用的有 -h ,简单易懂的格式(-h 选项)
- subject :要查询的内容,常用的有 apk, files, manifest, dex, resources
- verb :要了解的关于 subject 的内容
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学习专栏
相关文章:

Android apkanalyzer简介
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、用法3.1 使用 Android Studio3.1.1…...
PJSIP 2.7.2对G.729的支持,编译bcg729步骤
PJSIP 2.7.2对G.729的支持,编译bcg729步骤 下载BCG729源码升级cmake编译BCG729编译pjsip2.7.2 pjsua测试 下载BCG729源码 git clone git://git.linphone.org/bcg729.git升级cmake 注:编译BCG729要求cmake版本大于3.0,如果版本已经达到要求&…...
(二)Python类型总结
Python 是一种面向对象的语言。这意味着在 Python 中,一切都是对象,包括变量、函数和模块。Python 支持类和对象的概念,通过定义类来创建对象,并使用对象的方法和属性来操作数据。 Python 与 Java 和 C 在数据类型方面有一些相似…...
pojo之vo_dto_po的一些理解
一次扫盲VO、DTO、DO和PO区别、用法、概念~-腾讯云开发者社区-腾讯云 (tencent.com) Java学习笔记——实体类(ENTITY,VO,DTO,BO)_dto继承entity_路言汐的博客-CSDN博客 说清楚PO、DTO、VO、BO与使用场景_业务逻辑层p…...
Leetcode 第 364 场周赛题解
Leetcode 第 364 场周赛题解 Leetcode 第 364 场周赛题解题目1:2864. 最大二进制奇数思路代码复杂度分析 题目2:美丽塔 I思路代码复杂度分析 题目3:美丽塔 II思路代码复杂度分析 题目4:统计树中的合法路径数目思路代码复杂度分析 …...
简单单调栈的运用,悬线法---最大子矩阵,整除分块(规律+分块边界)
简单单调栈的运用 牛客一站到底 最优屏障 题意:有n座山,高度位ai,山上的士兵能相互监督当且仅当max(ai1...aj-1)<min(ai,aj) M国的防守能力大小为相互监视的哨兵对数,H国家可以放一块巨大屏障在某山前,以便最大消弱M方式能力 计算最优的屏…...
华为OD 数组求和(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理
Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…...

【鸿蒙软件开发】进度条Progress
文章目录 前言一、进度条Progress1.1 创建进度条1.2 进度条样式进度条样式ProgressType.Linear(线性样式)ProgressType.Ring(环形无刻度样式)ProgressType.ScaleRing(环形有刻度样式)ProgressType.Eclipse&…...
Java后端开发(九)-- idea(2022版)将commit(未push)的 本地仓库 的 多条commit记录 进行撤销
目录 1.多次 修改Test01类后,提交到本地仓库 。 2.多次重复 1 的步骤,多次commit成功后,在Git =》Log中会显示,commit记录...

【蓝桥每日一题]-动态规划 (保姆级教程 篇10)#方格取数
高能预警:讲了这么久动态规划了,该上点有难度的题吧 目录 题目:方格取数 思路(解法一): 解法二: 题目:方格取数 思路(解法一): 如果只有两个方向…...

Git GUI工具:SourceTree代码管理
Git GUI工具:SourceTree SourceTreeSourceTree的安装SourceTree的使用 总结 SourceTree 当我们对Git的提交、分支已经非常熟悉,可以熟练使用命令操作Git后,再使用GUI工具,就可以更高效。 Git有很多图形界面工具,这里…...

4 OpenCV实现多目三维重建(多张图片增量式生成稀疏点云)【附源码】
本文是基于 OpenCV4.80 进行的,关于环境的配置可能之后会单独说,先提一嘴 vcpkg 真好用 1 大致流程 从多张图片逐步生成稀疏点云,这个过程通常包括以下步骤: 初始重建: 初始两张图片的选择十分重要,这是整…...

【Java基础面试三十九】、 finally是无条件执行的吗?
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官: finally是无条件执行的…...

【讲座笔记】基于 Apache Calcite 的多引擎指标管理最佳实践|CommunityOverCode Asia 2023 | 字节开源
引言 三个问题 (问题解法) 1套SQL 2种语法 统一SQL的实践案例 虚拟列的实践案例 SQL Define Function 指标管理的实现 在这里插入图片描述...

蓝桥杯 (猜生日、棋盘放麦子、MP3储存 C++)
思路: 1、用循环。 2、满足条件,能整除2012、3、12且month等于6、day<30 #include<iostream> using namespace std; int main() {for (int i 19000101; i < 20120312; i){int month i / 100 % 100;int day i % 100;if (i % 2012 0 &…...
求 k 整除最大元素和(dp)
Description 给你一个整数数组,请你在其中选取若干个元素, 使得其和值能被 k 整除,输出和值最大的那个和值。 最后的数字可能很大,所以结果需要对 19260817 取模。 Input 第一行是两个正整数 n,k:表示数…...

代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II
LeetCode T491 递增子序列 题目链接:491. 递增子序列 - 力扣(LeetCode) 题目思路: 首先这里的测试用例很容易误导我们,这道题不能使用上次子集的思路对数组先排序,使用一个used数组来解决问题. 我们用[4,7,6,7]举例这道题的递增序列不存在[4,6,7,7]这个…...

【六:(mock数据)spring boot+mybatis+yml】
目录 1.1、代码编写Demo类User类启动类 APplication 1.2、配置类查询语句的配置 mysql.ymlspringboot的配置 application.yml日志的配置 logback.xml数据库的配置 mybatis-config.xml 1.3、测试:1.3.1、测试获取用户数1.3.2、添加用户1.3.3、数据的更新1.3.4、数据的…...

51单片机KeyWard
eg1: 单片机键盘的分类 键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值得称为编码键盘,如计算机键盘,而靠软件来识别的称为非编码键盘,在单片机组成的各种…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...