安卓APK打包流程浅析

在面试中,大公司会问你......

  1. APK打包流程全过程?

  1. APK签名在实际业务中能处理什么?

  1. APK加固原理是如何实现的,怎么保证安全?

  1. APK签名V1,V2,V3的区别于原理,有什么漏洞?

这里只讲解打包流程的全过程。

现在2023年了,一般都是用Android studio来设计android,而最直接的安卓APK打包方式则是使用Android Studio集成直接生成apk,所以本文就介绍以AS软件集成生成APK的方式来讲解。


首先先介绍以下编译的不同,在AS里面有很多的这种编译的选项,但是这些选项有什么区别呢?

Sync Project with gradle files:对gradle文件之后,或刷新gradle配置时使用。
Make project:只是对项目中新产生或修改过的文件进行一次编译,已经编译过了的就不会编译了,耗时相对较短。
Clean Project :删除build目录下的所有文件,并对项目的大部分文件进行重新编译,时间相对于Rebuild Project短点。
Rebuild Project :包含了Clean的操作,并对整个项目进行了重新编译(包括NDK和资源文件),因此耗时相对较长。
Invalidate Cache/Restart AndroidStudio:自动生成的项目缓存异常时,点击可清理项目缓存并重启AndroidStudio,重启后即可正常生成项目文件。
Build APK:前面4个选项都是编译,没有生成apk文件,如果想生成apk,需要点击Build APK。
Generate Signed APK:生成有签名的apk。
————————————————
版权声明:本文为CSDN博主「carter_yu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: https://blog.csdn.net/carter_yu/article/details/105641951

我们常规的打包就是点击下方这个图,点击它。

安卓APK打包流程浅析_第1张图片

此时此刻在我们Project面板的app\bulid\outputs\apk\debug中会生成一个对应的apk的包,这个过程APK打包的这个能力不是AS软件提供的,而是AS的SDK提供的(就是当初你安装AS的时候安装的SDK)。

而SDK里面有一个build-tools文件夹。

安卓APK打包流程浅析_第2张图片

点开发现有好几个版本。

安卓APK打包流程浅析_第3张图片

随便点击一个33版本的。

安卓APK打包流程浅析_第4张图片

build-tools里面有很多我们打包会用到的工具,里面的工具可以完成具体的功能,例如aapt,aidl等等。

AS的Gradle就是调度我们这些工具的,以前是用Elccps来调度这些工具的。

安卓APK打包流程浅析_第5张图片

我们从上往下看,写代码期间会自动调用aapt和aidl工具。

aapt:每当我们写一个XML文件,aapt.exe就会被AS自动调度,生成一个R.java文件。而被打包后会生成一个.arsc文件,也就是我们的res目录被打包了,但是assets和lib文件夹下的这些资源aapt就不会进行处理,默认过滤。

aidl:进程间的通信。aidl.exe就会被AS自动调度,生成一个java Interface文件。

Application Source code:而最上方中间的是我们写的源文件代码。

安卓APK打包流程浅析_第6张图片


java compiler:Gradle通过调用javac命令,把三个.java文件全部转化为.class文件。

此时此刻在我们Project面板的app\bulid\intermediates\javac\debug\classes\com底下会生成一系列的.class文件。

安卓APK打包流程浅析_第7张图片


类加载机制
JVM加载类文件的话,单个文件加载会触发N次IO流
几百个类会触发更多次IO流。
所以安卓对类加载进行了一定的优化,将.class转为.dex文件,体积更小,本质上还是字节码。

而.class文件属于jar包。

而我们安卓虚拟机又不同于jvm,还有一些安卓私有的东西,所以要转化为.dex文件。

Gradle调用到dx.bat工具,把.class文件转化为.dex文件。

第三方jar包也是编译后的.class文件,也要被转化为.dex文件。

此时此刻在我们Project面板的app\bulid\intermediates\dex\debug下会生成.dex文件。

安卓APK打包流程浅析_第8张图片


Other Resources:比如assets,lib和res一些图片和XML文件等等,这些资源就不会经过相关工具处理,直接放入apk包中。

Compiled Resources:生成一个resoueces.arsc文件。

apk builder:调用libbcc.dll动态链接库,打包成APK。

比如:把.dex文件

res文件

清单文件

META-INF源信息文件

resources.arsc文件

新建文件夹,按顺序往里面放,然后右键压缩,后缀名zip改成apk。

本质上就是这样,用zip压缩方案进行io操作。

安卓APK打包流程浅析_第9张图片


签名:Gradle调用apksigner.bat工具,就从没签名的apk变成有签名的apk,apk里面就会多出一个META-INF源信息文件,没签名就没有。

安卓APK打包流程浅析_第10张图片


优化4K对齐:Gradle调用zipalign.exe工具(磁盘操作)关于操作系统,对内存再次进行优化,具体这个我也不太会。

安卓APK打包流程浅析_第11张图片

打包是由SDK提供,AS打包就是调用这些工具全自动化完成。所以你也可以自己打包,但是会出现安全问题。

你可能感兴趣的:(Android上层,android,android,studio,gradle)