APK目录结构

apk目录结构介绍

APK

apk本质上是一个压缩包,将后缀改成zip可以直接用解压软件打开。

这里对腾讯的应用宝进行分析

1
2
3
adb shell pm list packages|grep tencent
adb shell pm path com.tencent.android.qqdownloader
adb pull /data/app/~~5gelR1bNtbsD-kN4pzX4Jw==/com.tencent.android.qqdownloader-hzh4Zx7t09B6v2XhbDIUzQ==/base.apk D:\data\code\APK

将apk拉去到本地以后,改后缀为zip解压打开(注意,解压缩打开都是乱码,只有反编译才能看到除了assets文件夹外的内容),文件目录和功能如下:

1
2
3
4
5
6
7
8
9
10
assets/                 # 应用自带原始资源(不参与 aapt 资源 ID 编译)
lib/ # 原生动态库(.so,按 ABI 分目录)
META-INF/ # APK 签名相关元数据
okhttp3/ # OkHttp 相关配置/资源(依赖库带出来的)
res/ # Android 资源目录(布局/drawable/字符串等)
AndroidManifest.xml # 应用清单(包名、权限、组件、SDK版本等)
classes.dex # 主 Dex(Dalvik/ART 可执行字节码)
classes2.dex ... # 多 Dex 拆分(方法数超 65536 后分包)
jacoco-agent.properties # JaCoCo 代码覆盖率代理配置(调试/测试打包残留),不理解为啥存在在这里
resources.arsc # 编译后的资源索引表(资源 ID->具体值/路径)

通俗理解如下:

1
2
3
4
5
6
AndroidManifest.xml   -> 告诉系统“我是谁、要什么、有哪些组件”
classes*.dex -> 执行逻辑
res/ + resources.arsc -> 界面/字符串/图片等资源解析
assets/ -> 原样资源
lib/ -> native .so
META-INF/ -> 签名校验

详细介绍下

  1. assets/
    • 应用打包时原样放入的“原始文件”
    • 不会生成 R.id/... 资源 ID
    • 运行时通过 AssetManager / getAssets().open("xxx") 读取
    • 常见内容:
      • 配置文件、JSON、离线地图、模型文件、字体、网页资源、加密密钥/脚本等
    • 与 res/ 区别:res 会被 aapt2 编译并分配资源 ID,assets 保持原样
  2. lib/
    • 存放 Native 动态链接库 .so

    • 通常按 CPU 架构分子目录,例如:

      1
      2
      3
      4
      lib/armeabi-v7a/
      lib/arm64-v8a/
      lib/x86/
      lib/x86_64/
    • 通过 JNI 调用,比如音视频、加解密、网络加速、安全校验、游戏引擎等

    • 运行时会由系统按设备 ABI 选择加载。ABI简单理解是,系统的驱动版本和底层架构。

    • 也是包体积“大头”之一

  3. META-INF/
    • APK 签名信息所在目录(APK 必须签名才能安装)
    • 常见文件:
      • MANIFEST.MF:各文件摘要(SHA/SHA256)
      • CERT.SF:对 MANIFEST 的签名相关文件
      • CERT.RSA / CERT.DSA:签名证书/公钥信息
    • 用于:
      • 安装校验完整性
      • 校验是否篡改
      • 判断“是否同签名”(覆盖安装、系统权限、共享 UID 等)
    • 重打包/改文件后签名会变,需重新签名
  4. okhttp3/
    • 不是 Android 强制标准目录,通常是 **OkHttp(Square/Android 常用网络库)**​ 打包带出的资源/配置
    • 可能包含:
      • 内置证书/配置
      • 网络拦截器相关资源
      • Kotlin/Java 库资源(有些库会往根目录放东西)
    • 说明该 App 使用 OkHttp 做 HTTP/HTTPS 请求(很常见)
  5. res/
    • Android 标准资源目录
    • 会被编译进资源表,通过 R.xxx.xxx 或 Resources.getXXX() 访问
    • 常见子目录:
    1
    2
    3
    4
    5
    6
    7
    res/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)表示适配不同屏幕/语言

  6. AndroidManifest.xml
    • 应用清单文件(核心)
    • 包含:
      • 包名(如 package="com.tencent.android.qqdownloader")
      • application 节点(入口、主题、允许备份、硬件加速等)
      • 四大组件:
        • activity
        • service
        • receiver
        • provider
      • 权限声明:
        • uses-permission(要什么权限)
        • uses-feature(需要相机/定位等特性)
      • SDK 版本:
        • minSdkVersion
        • targetSdkVersion
        • compileSdkVersion(有时在构建信息里)
      • 安装位置、支持屏幕等
    • 注意:APK 里通常是 二进制 XML(AXML),不是直接可读文本;你这里显示用 Edge 打开,可能是反编译工具已转成文本/或你用工具查看
  7. classes.dex
  8. 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 等
  9. jacoco-agent.properties
    • **JaCoCo(Java Code Coverage)**​ 代码覆盖率工具相关配置
    • 用于测试时统计“哪些代码被执行过”
    • 正常发布版一般不该带,常见是:
      • 测试包/内部构建
      • 开启覆盖率采集
      • 反编译/解包看到残留
    • 可能配置:
      • agent 输出路径
      • 包含/排除类规则
      • 覆盖率 dump 方式
  10. resources.arsc
    • 编译后的资源索引表(二进制资源表)
    • 作用:把代码里的资源 ID(如 0x7f0...)映射到:
      • 字符串值
      • 布局/图片路径
      • 主题/样式
      • 多语言/多密度对应资源
    • 由 aapt/aapt2 生成
    • 改资源后通常要重新生成/通过 apktool 处理
    • 与 res/ 配合理解:
      res/ 是“资源源文件/编译后片段”,resources.arsc 是“查表索引”
作者

纹云

发布于

2026-10-26

更新于

2026-10-26

许可协议