APK目录结构
apk目录结构介绍
APK
apk本质上是一个压缩包,将后缀改成zip可以直接用解压软件打开。
这里对腾讯的应用宝进行分析
1 | adb shell pm list packages|grep tencent |
将apk拉去到本地以后,改后缀为zip解压打开(注意,解压缩打开都是乱码,只有反编译才能看到除了assets文件夹外的内容),文件目录和功能如下:
1 | assets/ # 应用自带原始资源(不参与 aapt 资源 ID 编译) |
通俗理解如下:
1 | AndroidManifest.xml -> 告诉系统“我是谁、要什么、有哪些组件” |
详细介绍下
- assets/
- 应用打包时原样放入的“原始文件”
- 不会生成
R.id/...资源 ID - 运行时通过
AssetManager/getAssets().open("xxx")读取 - 常见内容:
- 配置文件、JSON、离线地图、模型文件、字体、网页资源、加密密钥/脚本等
- 与
res/区别:res会被 aapt2 编译并分配资源 ID,assets保持原样
- lib/
存放 Native 动态链接库
.so通常按 CPU 架构分子目录,例如:
1
2
3
4lib/armeabi-v7a/
lib/arm64-v8a/
lib/x86/
lib/x86_64/通过 JNI 调用,比如音视频、加解密、网络加速、安全校验、游戏引擎等
运行时会由系统按设备 ABI 选择加载。ABI简单理解是,系统的驱动版本和底层架构。
也是包体积“大头”之一
- META-INF/
- APK 签名信息所在目录(APK 必须签名才能安装)
- 常见文件:
MANIFEST.MF:各文件摘要(SHA/SHA256)CERT.SF:对 MANIFEST 的签名相关文件CERT.RSA/CERT.DSA:签名证书/公钥信息
- 用于:
- 安装校验完整性
- 校验是否篡改
- 判断“是否同签名”(覆盖安装、系统权限、共享 UID 等)
- 重打包/改文件后签名会变,需重新签名
- okhttp3/
- 不是 Android 强制标准目录,通常是 **OkHttp(Square/Android 常用网络库)** 打包带出的资源/配置
- 可能包含:
- 内置证书/配置
- 网络拦截器相关资源
- Kotlin/Java 库资源(有些库会往根目录放东西)
- 说明该 App 使用 OkHttp 做 HTTP/HTTPS 请求(很常见)
- res/
- Android 标准资源目录
- 会被编译进资源表,通过
R.xxx.xxx或Resources.getXXX()访问 - 常见子目录:
1
2
3
4
5
6
7res/layout/ # XML 布局
res/drawable/ # 图片/矢量/选择器
res/mipmap/ # 启动图标(按密度)
res/values/ # strings/colors/dimens/styles/arrays
res/anim/ # 动画
res/raw/ # 类似 assets 但会进资源表
res/xml/ # 配置类 XML不同后缀(如
-hdpi/-xhdpi/-xxhdpi/-zh-rCN)表示适配不同屏幕/语言 - AndroidManifest.xml
- 应用清单文件(核心)
- 包含:
- 包名(如
package="com.tencent.android.qqdownloader") application节点(入口、主题、允许备份、硬件加速等)- 四大组件:
activityservicereceiverprovider
- 权限声明:
uses-permission(要什么权限)uses-feature(需要相机/定位等特性)
- SDK 版本:
minSdkVersiontargetSdkVersioncompileSdkVersion(有时在构建信息里)
- 安装位置、支持屏幕等
- 包名(如
- 注意:APK 里通常是 二进制 XML(AXML),不是直接可读文本;你这里显示用 Edge 打开,可能是反编译工具已转成文本/或你用工具查看
- classes.dex
- classes2.dex / classes3.dex / classes4.dex / classes5.dex
.dex= Dalvik/ART 可执行字节码文件- 由 Java/Kotlin 源码经
javac → d8/r8/dx转换而来 - App 逻辑基本都在这里:
- 页面逻辑
- 网络请求
- 业务规则
- 加解密
- 插件/下载逻辑等
- 为什么有多个 dex:
- Android 单个 Dex 方法引用上限 65536(64K)
- 超过就开启 Multidex,拆成
classes.dex、classes2.dex… - 大厂/大型 App(如应用宝)很常见
- 分析工具:
jadx(反编译成 Java/Kotlin 近似代码)apktool(反编译/回编译资源与 smali)smali/baksmali(看/改底层字节码)- Android Studio / jd-gui 等
- jacoco-agent.properties
- **JaCoCo(Java Code Coverage)** 代码覆盖率工具相关配置
- 用于测试时统计“哪些代码被执行过”
- 正常发布版一般不该带,常见是:
- 测试包/内部构建
- 开启覆盖率采集
- 反编译/解包看到残留
- 可能配置:
- agent 输出路径
- 包含/排除类规则
- 覆盖率 dump 方式
- resources.arsc
- 编译后的资源索引表(二进制资源表)
- 作用:把代码里的资源 ID(如
0x7f0...)映射到:- 字符串值
- 布局/图片路径
- 主题/样式
- 多语言/多密度对应资源
- 由
aapt/aapt2生成 - 改资源后通常要重新生成/通过
apktool处理 - 与
res/配合理解:
res/是“资源源文件/编译后片段”,resources.arsc是“查表索引”