最近有手动打包apk的需求,因此研究了一下,主要分为以下7步:
1、使用aapt生成R.java文件
2、使用javac编译java源文件成为class文件
3、使用dx将class文件编译为dex文件
4、使用aapt生成resources.ap_资源包文件
5、使用sdklib.jar打包生成未签名apk
6、使用jarsigner签名apk
7、使用zipalign对apk进行4字节对齐
一、使用aapt生成R.java文件:
aapt工具位于sdk目录下的build-tools下(D:\Android\sdk\build-tools\27.0.3)。
aapt package -f //如果编译生成的文件已经存在,强制覆盖
-M G:\java_config\AndroidManifest.xml // 需要编译的AndroidManifest.xml文件
-I D:\Android\sdk\platforms\android-27\android.jar // 需要用的android.jar,在sdk中可以找到
-S G:\java_config\res // 资源所在目录
-J G:\java_config\gen // 编译生成R.java文件所在目录
-m //使生成的包的目录存放在-J参数指定的目录
二、使用使用javac编译java源文件成为class文件
javac -encoding UTF-8 // java文件的编码
-bootclasspath D:\Android\sdk\platforms\android-27\android.jar // 需要用的android.jar,在sdk中可以找到
-d G:\java_config\out // 编译成功的class文件路径
G:\java_config\java\com\example\administrator\mytest\*.java // 需要编译的java文件,多个的话就一一列出,以空格分割
G:\java_config\gen\com\example\administrator\mytest\*.java // 需要编译的R.java及manifest.java文件
-classpath G:\java_config\alipaysdk.jar;G:\java_config\alipaysecsdk.jar //用到的lib包(需依次列出,并以;号分割),若是没有可以不写这一行
三、使用dx将class文件编译未dex文件
dx.bat工具位于sdk目录下的build-tools下(D:\Android\sdk\build-tools\27.0.3),需设置环境变量
dx --dex --output=G:\java_config\dex\classes.dex //生成的classes.dex
G:\res_config\lib\HMS_SDK_2.5.3.302.jar //需要打包的依赖jar,若多个以空格分割,若是没有,此行可省略
G:\java_config\out //需要编译的class文件
四、使用aapt生成resources.ap_资源包文件
aapt package -f //如果编译生成的文件已经存在,强制覆盖
-M G:\java_config\AndroidManifest.xml // 需要编译的AndroidManifest.xml文件
-S G:\java_config\res // 资源所在目录
-I D:\Android\sdk\platforms\android-27\android.jar // 需要用的android.jar,在sdk中可以找到
-F G:\java_config\dex\resources.ap_ //生成的resources.ap_所在目录
五、使用sdklib.jar打包生成未签名apk
因为sdk更新3.0以后apkbuilder已经被删除了,官方建议使用sdklib.jar打包apk,sdklib.jar位于D:\Android\sdk\tools\lib下
java -cp
D:\Android\sdk\tools\lib\sdklib-26.0.0-dev.jar //sdklib.jar位置
com.android.sdklib.build.ApkBuilderMain //使用到的classname,固定不变
G:\result\modify_temp\temp.apk //输出apk的路径
-v -u //u指创建未签名的包
-z G:\java_config\dex\resources.ap_ //前面生成的resources.ap_文件
-f G:\java_config\dex\classes.dex //签名生成的classes.dex文件
-rf G:\java_config\java //引用的第三方jar以及其中的资源文件,按照一定的格式放置到apk文件夹中,其实就是src目录
-nf G:\java_config\libs //将主项目libs下面的so库打包
六、使用jarsigner签名apk
上面生成的apk是未签名的,不能正常安装,需要签名,才可以正常安装
jarsigner -verbose
-keystore C:\Users\Administrator\Desktop\debug.keystore //签名文件所在目录
-signedjar G:\result\官网_temp.apk //签名后生成的apk
G:\result\modify_temp\temp.apk //需要签名的apk
***** //签名文件的别名
-storepass ***** //签名文件的密码
7、使用zipalign对apk进行4字节对齐
zipalign的作用对资源文件通过内存映射对齐到4字节边界,这样访问资源文件的代码才是有效率的,使得在运行时Android与应用程序间的交互更加有效率
zipalign -f 4
G:\result\官网_temp.apk //需要4字节对齐的apk
G:\result\官网.apk //4字节对齐之后生成的apk
至此,手动打包apk已经完成。