apk文件结构
- 学安卓有一段时间了,不过学的很慢,打算先花一天整理一下之前学的
参考:安卓逆向基础知识之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

META-INF存储的是数字签名相关的,如图所示,一般有以下三个文件,.rsa文件,.SF文件,MF文件
根据签名使用的非对称加密算法可能也有其他比如DSA文件
这里使用的是传统的v1签名方案,还有v1,2,v3结合等等,2026年还出了v4签名方案
可以通过
1 | |
来判断你的apk用了哪些签名
这里有很多详细的介绍:安卓官网
v1签名的方案是基于jar签名的:
- MF文件里面存放的是整个apk的文件中出去自身文件外,所有文件的哈希摘要.这样就能保证在更改文件内容后,验证是否文件是否更改
- SF文件存储了MF文件的整个数字摘要,以及其中每个条目的二次摘要
Signature-Version: 1.0
Created-By: 10.0.2 (Oracle Corporation)
SHA1-Digest-Manifest: 3sfFzBcS0MeMB74RumtN3kWp1Fs=
SHA1-Digest-Manifest-Main-Attributes: kUARMfQJQjPfkkzCl/B9BYe5L4w=
比如这里
第一个是整个 文件的内容进行摘要
第二个是逐个内容进行摘要,前面的主属性区域(就是描述内容)+各个条目摘要
- .rsa()这类文件,包含开发者对用私钥对sf文件签名后的数字签名以及签名的时候使用的数字证书
当然仅仅是这三个文件,大项目肯定是不够用的,他们也有其他的方法保证文件未被篡改.不过这里就不说了,暂时没学.V2/v3方案遇到了再说,V2就是塞到了APK压缩包的
为了保护 APK 内容,APK 包含以下 4 个部分:- ZIP 条目的内容(从偏移量 0 处开始一直到 APK 签名分块的起始位置)
- APK 签名分块
- ZIP 中央目录
- ZIP 中央目录结尾
APK塞在APK签名分块用于验证1,3,4部分
AndroidManifest配置文件(应用清单概览)
其实就是个说明书,提供应用数据,gredlew打包的时候会用到
- manifes标签
根标签,位于最外层
manifest标签是AndroidManifest.xml文件的根标签,它包含了应用程序的基本信息,如包名、版本号、SDK版本、应用程序的名称和图标等等。
1 | |
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 官方定义。
application
包含应用程序的主要标签,包含应用程序所有组件的.在这个标签中也可以设置程序的主题和和允许备份,硬件加速,网络安全配置,之类.设置应用的全局属性
. 应用基本信息
控制应用整体外观和入口级信息,例如:
name、label、icon、logo、banner、description、theme、appCategory、isGame。2. 进程与任务行为
控制应用运行在哪个进程、任务栈如何表现,例如:
process、taskAffinity、allowTaskReparenting、hasCode、persistent、vmSafeMode、largeHeap。3. 备份与数据恢复
控制是否允许备份、如何备份、恢复时的规则,例如:
allowBackup、backupAgent、fullBackupContent、fullBackupOnly、restoreAnyVersion、killAfterRestore、dataExtractionRules。4. 安全与网络
控制明文流量、网络安全配置、权限相关默认行为,例如:
usesCleartextTraffic、networkSecurityConfig、permission、requestLegacyExternalStorage。5. 调试与系统行为
控制是否可调试、是否启用某些运行时能力,例如:
debuggable、testOnly、extractNativeLibs、allowNativeHeapPointerTagging、profileable、profileableByShell
参考,当然这些只是科普向,详情我也没看,
同时也提供了应用程序了所有组件,比如activity(非常重要,控制界面)
一般来说会遇到这四个组件- Activity:界面页面
比如登录页、设置页、游戏主界面。 - Service:后台服务
比如后台播放音乐、下载任务、推送处理。 - BroadcastReceiver:广播接收器
用来接收系统或应用发出的消息,比如开机完成、网络变化。 - ContentProvider:内容提供者
用来给别的应用或本应用共享数据,比如文件、数据库内容。
- Activity:界面页面
activity标签
定义一个Activity(Android应用的界面)组件,包含Activity的基本信息,比如显示界面,响应用户操作管理页面生命周期(后面会讲一下),页面跳转
示例:
1 | |
对应类名: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类.
没啥好说的.后续选到详细说明
