APK打包过程

APK构建打包过程

apk构建打包过程

  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进行对齐处理。

工具介绍:

工具描述
aapt/aapt2Android资源打包工具
aidlAndroid接口描述语言转换为跨进程通信.java文件的工具
javacJava编译器
proguard代码混淆工具
dx/d8转化.class文件为Davik VM能识别的.dex文件
apkbuilder打包生成apk
jarsinger签名工具
zipalign字节码对齐优化工具

资源编译流程

AAPT: Android Asset Packaging Tool

资源合并

在这里插入图片描述

资源文件编译

在这里插入图片描述

编译的内容包括res资源,AndroidManifest文件,assets资源

编译之后生成两个文件:
R.java文件:赋予每个非assets资源一个id值,以常量的形式定义于R.java文件中

resources.arsc文件,用来描述那些具有id值的资源的配置信息,它的内容就相当于是一个资源索引表。包含了所有的id值的数据集合。在该文件中,如果某个id对应的是string,那么该文件会直接包含该值,如果id对应的资源是某个layout或者drawable资源,那么该文件会存入对应资源的路径。

R.java文件结构图

在这里插入图片描述

id值的最高字节代表package的id,次高字节代表type的id,最后的字节代表当前类型中出现的序号

resource.arsc文件

通过Analyze apk功能查看resource.arsc文件结构
在这里插入图片描述

aidl文件编译

aidl : Android Interface Definition Language

  • aidl工具解析接口定义文件,然后生成相应的Java代码接口供程序调用。如果在项目中没有使用到aidl文件,则可以跳过这一步。
  • 输入:aidl后缀的文件,位于工程src/main/aidl目录。
  • 输出:可用于进程通信的C/S端java代码,位于build/generated/source/aidl。

Java源码编译

  • R.java和aidl生成的Java文件,再加上工程的源代码,使用javac编译生成class文件。
  • 输入:java源码文件夹(另外还包括了aapt生成的R.java,aidl生成的java文件,以及BuildConfig.java)。
  • 输出:对于gradle编译,生成的class文件保存在build/intermediates/classes

proguard代码混淆

  • javac完成代码编译之后,一般还会对源码进行混淆,类似于加密,目的是为了增加反编译的难度,同事也将代码名称进行缩短,减少代码占用体积。
  • 输入:编译后的.class文件,混淆规则配置文件proguard-rules.pro。
  • 输出:被混淆后的.class文件,混淆前后的映射文件。

混淆之后的class文件转换为dex文件

  • dx工具生成可供Android系统虚拟机可以执行的classes.dex文件。dx会将class转换为Dalvik字节码,生成常量池,消除冗余数据
  • 输入:所有.class文件。
  • 输出:classes.dex文件。
    在这里插入图片描述
    如上图所示,多个.class文件生成一个.dex文件

打包apk文件

  • 打包生成apk文件。旧的apkbuilder脚本已经废弃,现在通过sdklib.jar的ApkBuilder类进行打包
  • 输入:.ap_资源包文件,classes.dex文件,未编译的资源文件(assets资源等),libs等文件。
  • 输出:apk文件。

签名apk文件

  • 对apk文件进行签名,签名后才能在设备上进行安装。
  • 输入:上一步中生成.apk文件、签名文件(Debug or Release keystore)
  • 输出:签名后apk文件。
    签名之后的apk会多一个META-INF文件夹,针对apk的签名信息。

zipalign优化

  • zipalign对签名后的apk文件进行对齐处理,使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而通过内存映射访问apk文件时会更快。同时也减少了在设备上运行时的内存消耗。
  • 输入:签名后的apk文件。
  • 输出:对齐优化的apk文件。

APK典型文件

文件或文件夹作用
AndroidManifest.xml程序全局配置文件
classes.dexDalvik字节码
resources.arsc资源索引表
MEAT-INF该目录下存放的签名信息
res该目录存放资源文件
assets该目录存放一些配置或资源文件

关联技术

  • APK加固
  • 资源混淆:对资源索引表进行修改,从而混淆资源名
  • 热修复:multidex的学习
  • 插件化:multidex的学习
  • 快速多渠道打包

DEX编译过程

编译流程

  1. java源码编译:通过javac将源码编译为.class文件
  2. 多DEX分包:脚本将类根据一定规则划分到主dex和从dex中,生成配置文件
  3. proguard优化混淆:对.class文件进行压缩、优化、混淆处理
  4. 转换为dex文件:dx/d8将.class文件转换为dex文件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值