【安卓逆向】APK和APP结构

发布时间:2026/7/7 10:24:52

【安卓逆向】APK和APP结构 文章目录1. APK包文件结构1.1. 结构目录1.2. AndroidManifest.xml1.3. classes.dex1.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. 开屏界面 ActivitySplashActivity3.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属性说明格式二进制 XMLAAPT 编译后内容包名、权限、四大组件Activity/Service/Receiver/Provider、SDK 版本等查看需用apktool d或jadx反编译作用重要配置文件APP启动入口界面信息等等1.3. classes.dex属性说明格式Dalvik ExecutableDEX 字节码内容所有 Java/Kotlin 代码编译后的字节码多 DEX当代码超过 65536 个方法时会生成classes2.dex、classes3.dex…查看可用jadx、dex2jar反编译1.4. assets/资产目录未编译属性说明特点不压缩保持原始文件格式内容HTML、字体、数据库、配置文件等访问通过AssetManager访问无资源 ID1.5. lib/so文件架构说明armeabi-v7a32 位 ARM支持大多数 Android 设备arm64-v8a64 位 ARM主流设备x8632 位 x86模拟器x86_6464 位 x86模拟器armeabi旧版 ARM已弃用mipsMIPS 架构已弃用1.6. res/资源目录编译目录作用drawable/图片资源PNG/JPG/Vectordrawable-ldpi/mdpi/hdpi/xhdpi/不同密度的图片资源layout/布局文件XMLmipmap/应用图标启动器专用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.SFMANIFEST.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. 开屏界面 ActivitySplashActivitypublicclassSplashActivityextendsActivity{OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);// 显示开屏画面// 加载广告/缓冲数据// 延迟跳转 MainActivity}}3.3. Main Activity主界面publicclassMainActivityextendsActivity{OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);// 加载主界面布局// 初始化 Fragment / ViewPager// 加载数据// 启动成功}}感谢关注【遇事不決洛必達】欢迎点赞收藏和交流指正我会持续分享我的学习经验和心得。

相关新闻