文章目录
- 1. APK包文件结构
- 1.1. 结构目录
- 1.2. AndroidManifest.xml
- 1.3. classes.dex
- 1.4. assets/(资产目录,未编译)
- 1.5. lib/(so文件)
- 1.6. res/(资源目录,编译)
- 1.7. resources.arsc(资源文件索引)
- 1.8. META-INF/(签名目录)
- 2. APP代码结构
- 3. APP简单启动顺序
- 3.1. Application 阶段
- 3.2. 开屏界面 Activity(SplashActivity)
- 3.3. Main Activity(主界面)
1. APK包文件结构
1.1. 结构目录
app.apk ├── AndroidManifest.xml # 清单文件(二进制格式) ├── classes.dex # DEX 字节码文件 ├── classes2.dex # 多 DEX 文件(可选) ├── resources.arsc # 资源索引表 ├── META-INF/ # 签名信息目录 │ ├── MANIFEST.MF # 清单摘要文件 │ ├── CERT.SF # 签名摘要文件 │ └── CERT.RSA # 签名证书文件 ├── res/ # 资源文件目录 │ ├── drawable/ # 图片资源 │ ├── layout/ # 布局文件 │ ├── mipmap/ # 应用图标 │ ├── values/ # 字符串、颜色等 │ └── raw/ # 原始资源文件 ├── assets/ # 原始资源(不压缩) ├── lib/ # Native 库目录 │ ├── armeabi-v7a/ # 32 位 ARM 库 │ ├── arm64-v8a/ # 64 位 ARM 库 │ ├── x86/ # 32 位 x86 库 │ └── x86_64/ # 64 位 x86 库 └── unknown/ # 其他文件(可选)
1.2. AndroidManifest.xml
| 属性 | 说明 |
|---|
| 格式 | 二进制 XML(AAPT 编译后) |
| 内容 | 包名、权限、四大组件(Activity/Service/Receiver/Provider)、SDK 版本等 |
| 查看 | 需用apktool d或jadx反编译 |
| 作用 | 重要配置文件,APP启动入口,界面信息等等 |
1.3. classes.dex
| 属性 | 说明 |
|---|
| 格式 | Dalvik Executable(DEX 字节码) |
| 内容 | 所有 Java/Kotlin 代码编译后的字节码 |
| 多 DEX | 当代码超过 65536 个方法时,会生成classes2.dex、classes3.dex… |
| 查看 | 可用jadx、dex2jar反编译 |
1.4. assets/(资产目录,未编译)
| 属性 | 说明 |
|---|
| 特点 | 不压缩,保持原始文件格式 |
| 内容 | HTML、字体、数据库、配置文件等 |
| 访问 | 通过AssetManager访问,无资源 ID |
1.5. lib/(so文件)
| 架构 | 说明 |
|---|
armeabi-v7a | 32 位 ARM(支持大多数 Android 设备) |
arm64-v8a | 64 位 ARM(主流设备) |
x86 | 32 位 x86(模拟器) |
x86_64 | 64 位 x86(模拟器) |
armeabi | 旧版 ARM(已弃用) |
mips | MIPS 架构(已弃用) |
1.6. res/(资源目录,编译)
| 目录 | 作用 |
|---|
drawable/ | 图片资源(PNG/JPG/Vector) |
drawable-ldpi/mdpi/hdpi/xhdpi/ | 不同密度的图片资源 |
layout/ | 布局文件(XML) |
mipmap/ | 应用图标(启动器专用) |
values/ | 颜色、字符串、尺寸等 |
values-zh/values-en/ | 多语言资源 |
anim/ | 动画资源 |
raw/ | 原始文件(不编译) |
xml/ | 其他 XML 配置文件 |
1.7. resources.arsc(资源文件索引)
| 属性 | 说明 |
|---|
| 格式 | 二进制资源索引表 |
| 内容 | 所有资源的 ID 和对应的路径映射 |
| 作用 | 系统通过资源 ID(如R.id.xxx)快速查找资源 |
1.8. META-INF/(签名目录)
| MANIFEST.MF | 包含所有文件的 SHA1 摘要 |
|---|
| CERT.SF | MANIFEST.MF 的摘要 + 每个文件的摘要 |
| CERT.RSA | 签名证书(包含公钥和证书链) |
| CERT | 签名证书(可能命名为其他名称) |
2. APP代码结构
┌─────────────────────────────────────────────────────────────┐ │ APP 代码结构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 业务模块 │ │ │ │ 首页 / 登录 / 个人中心 / 商品 / 订单 / 购物车 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 系统模块 │ │ │ │ com.android.* (Activity / Service / 权限 / 通知) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 第三方模块 │ │ │ │ 网络请求(OkHttp) / 支付(Pay) / 推送(Umeng) / │ │ │ │ 图片加载(Glide) / 统计 / 地图 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘
3. APP简单启动顺序
┌─────────────────────────────────────────────────────────────────┐ │ APP 启动流程 │ └─────────────────────────────────────────────────────────────────┘ 用户点击 APP 图标 │ ▼ ┌─────────────────────────────────────┐ │ 1. 执行 Application │ │ ├── attach() │ │ └── onCreate() │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 2. 执行开屏界面 Activity │ │ (SplashActivity) │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 3. 执行 Main Activity │ │ └── onCreate() │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 4. 启动成功 ✅ │ └─────────────────────────────────────┘
3.1. Application 阶段
publicclassMyApplicationextendsApplication{// 系统调用时机:Application 创建时(最先执行)@OverridepublicvoidonCreate(){super.onCreate();// 初始化操作:// - 第三方 SDK 初始化(OkHttp、推送、统计等)// - 全局配置加载// - 异常捕获设置}}
3.2. 开屏界面 Activity(SplashActivity)
publicclassSplashActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);// 显示开屏画面// 加载广告/缓冲数据// 延迟跳转 MainActivity}}
3.3. Main Activity(主界面)
publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);// 加载主界面布局// 初始化 Fragment / ViewPager// 加载数据// 启动成功!}}
感谢关注【遇事不決洛必達】!欢迎点赞收藏和交流指正,我会持续分享我的学习经验和心得。