Android 编译流程解析03-手动编译Apk
Android编译流程
通过之前两篇文章,我们已经大致了解了编译相关的Gradle,它们的编译流程如下图所示,这篇文章我们来通过手动编译的方式,来模拟Gradle 编译Android APK文件。
手动编译APK
创建一个Android项目
首先,我们要有一个Android项目,为了更简单,我去除了多余的代码,我们编译的时候,可以直接使用该项目。
下载地址 Android 手动编译APK-代码资源下载
创建build文件夹
我们把下载好的项目解压,然后使用cmd,进入其app目录下,然后创建build文件夹
mkdir build
编译资源
aapt2 compile -o build/res.zip --dir src/main/res
然后,会生成一个zip文件
我们打开这个zip文件,可以看到所有资源已经被打包成了.flat格式
对资源进行链接
aapt2 link build/res.zip -I C:\Developer\Android\SDK\platforms\android-29\android.jar --java build --manifest src\main\AndroidManifest.xml -o build\app-debug.apk
执行后,可以看到生成了app-debug.apk
在com文件夹里,还有R.java文件
来看下R.java
然后,我们把R.java赋值到我们项目代码中,这样就不用再导包了。
编译java文件
接着,我们需要编译Java文件
javac -d build -cp C:/Developer/Android/SDK/platforms/android-29/android.jar src/main/java/com/heiko/mytest/*.java
这样我们就得到了class字节码文件
Java 代码是由 javac 编译的,Kotlin 代码是由 kotlinc 编译的
这里的 C:/Developer/Android/SDK 可以由 %ANDROID_HOME% 代替
生成Dex文件
可以用老的dx编译器,也可以用新的d8编译器。
这里我们用d8编译器。
d8 --output build --lib C:/Developer/Android/SDK/platforms/android-29/android.jar build/com/heiko/mytest/*.class
这样,我们就生成了dex文件
将dex文件放入apk文件中
我们要调用zip命令,这里的zip也就是我们常用的解压缩软件,
由此也可以证明,apk文件实质上就是个压缩文件。
要通过命令行使用zip,我们需要先配置到环境变量中。
详见【终端】“zip不是内部或外部命令,也不是可执行程序”详细解决办法
zip -j build/app-debug.apk build/classes.dex
可以看到,新的app-deblug.apk文件,比原来要大一点
我们看下其内部,可以看到dex文件已经在里面了
生成签名
这个时候,apk文件中的内容还少META-INF
,也就是签名信息。
这里我们可以使用debug签名,密码是固定的android
apksigner sign -ks C:\Users\Heiko\.android\debug.keystore build/app-debug.apk
我们再来看下app-debug.apk
可以看到,已经有META-INF
文件夹了。
安装apk
最后,我们把apk安装到手机上,可以看到,正常运行成功 !
至此,我们手动编译APK就成功了 !
Android 编译流程解析系列
Android 编译流程解析01-AppPlugin初始化
Android 编译流程解析02-相关Task解析
Android 编译流程解析03-手动编译Apk
本文地址:https://blog.csdn.net/EthanCo/article/details/107172750