手动生成APK文件

前言

学习Android很长一段时间,一直都是使用开发工具生成APK文件,所有的Android打包过程基本上都是透明的,开发人员很难搞清楚底层的编译打包过程究竟是如何进行的。这里使用简单的只包含一个Activity和一个Service的手动打包来深入了解APK打包的每个过程。

aapt资源打包

打包最开始是处理资源和AndroidManifest文件,处理之后的各种资源会编译出一个R.java文件记录每个资源的id值,代码中就通过这些id数值来引用资源。资源处理的命令就是appt命令:

aapt package -f -M main/AndroidManifest.xml -I
"%ANDROID_HOME%/platforms/android-27/android.jar" -S main/res 
-J build/gen/ -m -F build/resources.zip --custom-package com.example.firstapp -o 'apk'

其中package代表打包,-M表名当前AndroidManifest.xml文件的位置,-S代表所有资源文件夹根路径,-J代表R.java生成之后放到的位置,-F代表将生成的资源resources.arsc,编译过的资源文件夹res和AndroidManifest.xml打入到一个zip包中,–custom-package代表R.java所属的包名,前面的-I代表引入android.jar也就是Android Framework包。这里因为MainActivity继承自Activity没有使用support包,仅仅需要引用Framework的jar包就够了。

aidl处理

aidl负责生成aidl文件对应的Java文件,本例中定义的aidl相对简单使用aidl命令处理就可以了。aidl命令之后的是aidl文件,后面跟上生成的Java文件路径就会自动生成Java代码。

aidl main/aidl/com/example/firstapp/ICommunicate.aidl
build/gen/com/example/firstapp/ICommunicate.java

javac编译

由于在本例中Java源代码其实很少,这里使用手动编辑一个sources.txt文件,它内部包含所有的java源文件,调用javac命令同时引入framework的jar包就可以编译出class文件。

// sources.txt
main/java/com/example/firstapp/MainActivity.java
main/java/com/example/firstapp/MyService.java
build/gen/com/example/firstapp/R.java
build/gen/com/example/firstapp/ICommunicate.java

javac @build/sources.txt -classpath %ANDROID_HOME%/platforms/android-
27/android.jar -d build/classes

dx生成dex文件

Android的虚拟机支持dex格式的文件,需要将所有的class文件全部编译到一个dex文件中,dx工具就能够将多个文件夹下的class文件合并成一个dex文件。

dx --dex --output=build/classes.dex build/classes

zip生成apk

在最新的tools包中已经不再包含apkbuilder命令了,其实打包apk就是生成一个zip包的过程,先把前面生成的resources.zip文件解压开,里面包含的三个文件和dex文件共同在打包成一个firstapp.zip包,之后在将zip包改名成firstapp.apk即可,打包工具任选。

签名apk

要想签名首先需要有自己的证书,这里使用keytool工具生成自己的证书,

keytool -genkey -v -keystore release.keystore -alias myrelease -keyalg RSA -keysize 2048 -validity 10000
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  zhang
您的组织单位名称是什么?
  [Unknown]:  com.example
您的组织名称是什么?
  [Unknown]:  com.example
您所在的城市或区域名称是什么?
  [Unknown]:  Beijing
您所在的省/市/自治区名称是什么?
  [Unknown]:  Beijing
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=zhang, OU=com.example, O=com.example, L=Beijing, ST=Beijing, C=CN是否正确?
  [否]:  y

正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 10,000 天):
         CN=zhang, OU=com.example, O=com.example, L=Beijing, ST=Beijing, C=CN
输入 <myrelease> 的密钥口令
        (如果和密钥库口令相同, 按回车):
[正在存储release.keystore]

生成证书之后使用jarsigner工具对前面生成的原始firstapp.apk做签名操作。

jarsigner -verbose -keystore release.keystore -signedjar firstapp_signed.apk 
build/firstapp.apk myrelease

zipalign对齐操作

zipalign可以提高程序的运行效率,这里使用-v 4代表将当前应用的内容以4个字节做对齐。

zipalign -v 4 firstapp_signed.apk firstapp_signed_aligned.apk

最后将对齐操作的包安装到手机上,可以看见安装已经成功,这时候点击进入程序整体展示正常,这样一个手动打包生成的apk文件就完成了。

adb install firstapp_signed_aligned.apk
firstapp_signed_aligned.apk: 1 file pushed. 0.8 MB/s (101846 bytes in 0.117s)
        pkg: /data/local/tmp/firstapp_signed_aligned.apk
Success

猜你喜欢

转载自blog.csdn.net/xingzhong128/article/details/80933182