6

Apk打包流程梳理和加载流程学习

 1 year ago
source link: http://xianyucoder.cn/2019/08/26/%E5%AE%89%E5%8D%93%E9%80%86%E5%90%91%E5%AD%A6%E4%B9%A0-apk%E6%89%93%E5%8C%85%E6%B5%81%E7%A8%8B%E6%A2%B3%E7%90%86/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Apk打包流程梳理和加载流程学习

2019-08-26

| App逆向

| 0

| 次阅读

2.1k

|

3 分钟

想要学习逆向必须先熟悉APP编译的流程。

安卓加载流程

java 代码 – > 加载布局文件 –> 资源文件

资料参考链接:

https://juejin.im/entry/58b78d1b61ff4b006cd47e5b

新版官网示意图

blog005MnFO1gy1g5z0anjgm1j30qe0to7d6.png
  1. 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中包括运行在 Android 设备上的字节码),将所有其他内容转换成已编译资源。
  2. APK 打包器将 DEX 文件和已编译资源合并成单个 APK。不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上。
  3. APK 打包器使用调试或发布密钥库签署您的 APK:
    1. 如果您构建的是调试版本的应用(即专用于测试和分析的应用),打包器会使用调试密钥库签署您的应用。Android Studio 自动使用调试密钥库配置新项目。
    2. 如果您构建的是打算向外发布的发布版本应用,打包器会使用发布密钥库签署您的应用。要创建发布密钥库,请阅读在 Android Studio 中签署您的应用
  4. 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时的内存占用。

旧版官网示意图

安卓体系结构

blog005MnFO1gy1g5z0cv4i8zj30ew0oiafg.png
  1. 通过aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)
  2. 处理.aidl文件,生成对应的Java接口文件
  3. 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件
  4. 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex
  5. 通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk
  6. 通过Jarsigner工具,对上面的apk进行debug或release签名
  7. 通过zipalign工具,将签名后的apk进行对齐处理。

安卓项目的文件结构与安卓apk的文件结构存在着一一对应的关系。

安卓应用开发的本质是:将源代码和各种资源文件编译整合成一个apk。

安卓逆向的本质是:想办法将apk转化为源代码和资源文件。

简单来说,apk就是一个带有签名的zip格式的压缩包,签名为了保护开发者的权益和标识apk。做为android逆向学习的第一步,了解apk的文件结构和生成过程是很有必要的。为了提升apk的安全性能,现在很多安卓应用程序的核心代码都采用NDK开发,所以生成的apk中会多出一个lib文件夹用于存放so文件。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK