apk文件结构

结构

lib: 存放其他语言编写的so(动态链接库)

META-INF:用于存放数字签名相关

resources.arsc:暂时没怎么用过,用于存放编译打包厚度资源关系映射.同时还会生成一个R类指出id

res :存放经过编译后的资源文件

assets:存放不需要编译的资源文件

下面进行一些讲解,可能不是很详细

lib

一般子文件名会表明使用环境要求,例如(x86_64)适用于arm-v8(64)和arm-v7(32).
一般在编写的时候,直接在本地调用so里面的函数,多数项目里面很多逻辑都是写在c语言c++或者其他更适合这个项目的语言.再编译成so文件,还有一些加固,反调试逻辑,或者图形处理,游戏开发之类的

所以学习arm汇编还是有必要的.还有一些native层的开发相关的比如jni之类的.给自己画饼ing…..

META-INF

%E6%88%AA%E5%9B%BE%202026-03-24%2015-07-20.png
META-INF存储的是数字签名相关的,如图所示,一般有以下三个文件,.rsa文件,.SF文件,MF文件
根据签名使用的非对称加密算法可能也有其他比如DSA文件
这里使用的是传统的v1签名方案,还有v1,2,v3结合等等,2026年还出了v4签名方案
可以通过

1
apksigner verify --verbose --print-certs your.apk

来判断你的apk用了哪些签名
这里有很多详细的介绍:安卓官网
v1签名的方案是基于jar签名的:

  1. MF文件里面存放的是整个apk的文件中出去自身文件外,所有文件的哈希摘要.这样就能保证在更改文件内容后,验证是否文件是否更改
  2. SF文件存储了MF文件的整个数字摘要,以及其中每个条目的二次摘要
    Signature-Version: 1.0

Created-By: 10.0.2 (Oracle Corporation)

SHA1-Digest-Manifest: 3sfFzBcS0MeMB74RumtN3kWp1Fs=

SHA1-Digest-Manifest-Main-Attributes: kUARMfQJQjPfkkzCl/B9BYe5L4w=
比如这里
第一个是整个 文件的内容进行摘要
第二个是逐个内容进行摘要,前面的主属性区域(就是描述内容)+各个条目摘要

  1. .rsa()这类文件,包含开发者对用私钥对sf文件签名后的数字签名以及签名的时候使用的数字证书
    当然仅仅是这三个文件,大项目肯定是不够用的,他们也有其他的方法保证文件未被篡改.不过这里就不说了,暂时没学.V2/v3方案遇到了再说,V2就是塞到了APK压缩包的
    为了保护 APK 内容,APK 包含以下 4 个部分:
    1. ZIP 条目的内容(从偏移量 0 处开始一直到 APK 签名分块的起始位置)
    2. APK 签名分块
    3. ZIP 中央目录
    4. ZIP 中央目录结尾
      APK塞在APK签名分块用于验证1,3,4部分

AndroidManifest配置文件(应用清单概览)

其实就是个说明书,提供应用数据,gredlew打包的时候会用到

  1. manifes标签
    根标签,位于最外层
    manifest标签是AndroidManifest.xml文件的根标签,它包含了应用程序的基本信息,如包名、版本号、SDK版本、应用程序的名称和图标等等。
1
2
3
4
5
6
7
8
9
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="70302"
android:versionName="7.3.2"
android:installLocation="auto"
android:compileSdkVersion="28"
android:compileSdkVersionCodename="9"
package="com.imangi.templerun2"
platformBuildVersionCode="28"
platformBuildVersionName="9">
  • package="com.imangi.templerun2"
    应用包名,相当于应用的唯一标识。
  • android:versionCode="70302"
    内部版本号,给系统和商店判断升级用,数字越大版本越新。
  • android:versionName="7.3.2"
    给用户看的版本名。
  • android:installLocation="auto"
    安装位置由系统自动决定。
  • android:compileSdkVersion="28"
    表示这个 APK 是按 Android 9 / API 28 的 SDK 编译的。
  • android:compileSdkVersionCodename="9"
    对应上面的 Android 9。
  • platformBuildVersionCode="28"
    打包时的平台版本代码,也是 API 28。
  • platformBuildVersionName="9"
    打包时的平台版本名,Android 9。
  • xmlns:android="http://schemas.android.com/apk/res/android"
    这是命名空间声明,表示后面所有 android: 开头的属性都属于 Android 官方定义。
  1. application
    包含应用程序的主要标签,包含应用程序所有组件的.在这个标签中也可以设置程序的主题和和允许备份,硬件加速,网络安全配置,之类.设置应用的全局属性
    . 应用基本信息
    控制应用整体外观和入口级信息,例如:
    namelabeliconlogobannerdescriptionthemeappCategoryisGame

    2. 进程与任务行为
    控制应用运行在哪个进程、任务栈如何表现,例如:
    processtaskAffinityallowTaskReparentinghasCodepersistentvmSafeModelargeHeap

    3. 备份与数据恢复
    控制是否允许备份、如何备份、恢复时的规则,例如:
    allowBackupbackupAgentfullBackupContentfullBackupOnlyrestoreAnyVersionkillAfterRestoredataExtractionRules

    4. 安全与网络
    控制明文流量、网络安全配置、权限相关默认行为,例如:
    usesCleartextTrafficnetworkSecurityConfigpermissionrequestLegacyExternalStorage

    5. 调试与系统行为
    控制是否可调试、是否启用某些运行时能力,例如:
    debuggabletestOnlyextractNativeLibsallowNativeHeapPointerTaggingprofileableprofileableByShell
    参考,当然这些只是科普向,详情我也没看,
    同时也提供了应用程序了所有组件,比如activity(非常重要,控制界面)
    一般来说会遇到这四个组件

    • Activity:界面页面
      比如登录页、设置页、游戏主界面。
    • Service:后台服务
      比如后台播放音乐、下载任务、推送处理。
    • BroadcastReceiver:广播接收器
      用来接收系统或应用发出的消息,比如开机完成、网络变化。
    • ContentProvider:内容提供者
      用来给别的应用或本应用共享数据,比如文件、数据库内容。
  2. activity标签
    定义一个Activity(Android应用的界面)组件,包含Activity的基本信息,比如显示界面,响应用户操作管理页面生命周期(后面会讲一下),页面跳转
    示例:

1
2
3
4
5
6
7
<activity
android:theme="@android:style/Theme.Translucent"
android:name="com.bytedance.sdk.openadsdk.stub.activity.Stub_Standard_Activity_T"
android:exported="false"
android:launchMode="standard"
android:configChanges="screenSize|orientation|navigation|keyboardHidden"
android:windowSoftInputMode="adjustResize|stateHidden"/>

对应类名:com.bytedance.sdk.openadsdk.stub.activity.Stub_Standard_Activity_T
使用主题
android:theme=”@android:style/Theme.Translucent”
是否对外开放
android:exported=”false”(仅限本应用调用)
启动模式
android:launchMode=”standard”默认
每次穷东新建一个activity实例,不强制复用旧页面
android:configChanges=”screenSize|orientation|navigation|keyboardHidden”
页面发生变化的时候(变化有屏幕切换,横竖屏幕切换,导航切换,键盘切换)页面自己处理,系统不要默认重建他
android:windowSoftInputMode=”adjustResize|stateHidden”
弹出软件盘的时候,页面自动放缩,页面启动是时候软键盘默认隐藏
其实就是字面意思这些,(英语水平决定我的学习速度2333,补考没过,有点难绷………………………..)
3. receiver标签
用于静态注册BroadcastReceiver(广播接收器),动态注册于apk代码中实现,静态注册因为是在androidmainfest.xml里面,广播接受不依赖于activity结束而结束,应用程序进程的关闭也系统也能知道有这么一个接受器,动态静态使用场景不同
关于广播机制这些文章有详细的讲解,临时看的我估计也讲不明白:
广播机制的应用场景
文档
4. service标签
service组件:Service(服务)是 Android 四大组件之一,属于一种在后台运行、无用户界面的长生命周期组件。它主要用于处理不需用户交互的长期任务(如后台音乐播放、大文件下载、网络请求)。Service 默认在主线程运行,但即使被切换到后台甚至应用被关闭,Service 仍能保持状态运行.
内容太多,没看完,官方文档对于服务组建的描述很详细
service概览
5. provider标签
定义一个Content Provider( 内容提供者)组件,仅仅只是看概念还是太干燥了,后续还是得开个开发专栏浅浅看一下.
内容提供程序管理对中央数据存储区的访问。提供程序是 Android 应用的一部分,通常提供自己的界面来处理数据。不过,content provider 主要由其他应用使用,这些应用使用提供程序客户端对象来访问提供程序。提供程序与提供程序客户端共同提供一致的标准数据界面,该界面还可处理进程间通信并保护数据访问的安全性。
6. uses-permission标签
定义所需权限,启动的时候会要求索取.如访问网络、读取SD卡等等。在应用程序安装时,系统会提示用户授权这些权限。
7. uess-feature标签
定义应用需要的硬件或者软件特性,如摄像头GPS等等

resources.arsc文件

在编译过程中由aapt2生成,类似于符号表,有点像,里面存储的资源的索引和映射关系.把资源文件名和类型,值等信息映射到R.java中定义的整数id上,代码中可以通过R类来引用
在编译过程中由aapt2生成,类似于符号表,有点像,里面存储的资源的索引和映射关系.把资源文件名和类型,值等信息映射到R.java中定义的整数id上,代码中可以通过R类来引用

下面是apk的打包编译流程


没找到好一点的图,可以大致看看打包的流程
参考:掘金

  • 打包资源文件:通过aapt工具将res目录下的文件打包生成R.java文件和resources.arsc资源文件
  • 处理aidl files:如果有aidl接口,通过aidl工具打包成java接口类(不同进程间通信)
  • java Compiler:javac编译,将R.java,源码文件,aidl.java编译为class文件
  • dex:源码.class,第三方jar包等class文件通过dx工具生成dex文件
  • apkbuilder:apkbuilder将所有的资源编译过的和不需要编译的,dex文件,arsc资源文件打包成一个完整的apk文件
  • jarsigner:以上生成的是一个没有签名的apk文件,这里通过jarsigner工具对该apk进行签名,从而得到一个带签名的apk文件
  • zipalign:对齐,将apk包中所有的资源文件距离文件起始偏移为4的整数倍,这样运行时可以减少内存的开销

res 文件

资源目录文件.里面有很多子目录,存放不同的内容
参考这个应用资源概览
资源文件不知道怎么补充

classes.dex

dex文件ART下的可执行文件格式,本身是由class生成的,里面有该应用所有的java类.
没啥好说的.后续选到详细说明


apk文件结构
http://example.com/2026/03/24/APK 文件结构/
Author
fox
Posted on
March 24, 2026
Licensed under