打包系列教程目录:
纯ant命令行打包android apk之图文从原理角度完全详解android打包过程(打包系列教程之一)
用ant的build.xml构建自动化打包android apk 完全详解(打包系列教程之二)
Android 多渠道打包之混淆文件ProGuard技术详解-特别篇(打包系列教程之三)
android studio gradle 多渠道打包之完全详解(打包系列教程之四)
android studio gradle 多版本多apk打包(打包系列教程之五)
详解高速神器python脚步打包android apk,超级快!!(打包系列教程之六)
通过上一篇文章内容的学习,我们基本已经明白了android打包签名apk的主要操作与流程,那么这一篇文章我们就将上一篇文章的打包内容转化成ant的build.xml文件进行自动化打包,这样可以避免我们上一篇文章的敲打命令行的繁琐操作,从而让我们离自动化操作更近一步(建议先了解一下ant的基本用法,可以看这篇文章:http://blog.csdn.net/jason0539/article/details/44836769)。
我们还是跟上一篇一样,根据以下步骤一步步来进行。
(1). 生成用于应用的R.java;
(2). 编译所有java文件为class文件;
(3). 打包class文件和jar包为classes.dex;
(4). 打包assets和res资源为资源压缩包(例如res.zip,名字可以自己定义);
(5). 构建classes.dex和res.zip生成未签名的APK;
(6). 生成有签名的APK;
(7). 对签名包进行zipalign优化;
注意这里的目录跟上一篇的文章的目录是有区别的,上一篇的内容是为了演示方便,才把生成的文件都存放在桌面的ant文件的gen目录和bin目录下,本篇默认路径都是cd到工程目录的根目录下,所以生成的文件也存放在工程目录原有的gen文件夹和bin文件下。
在工程开始之前,我们先要指定一些常量或者属性以及做一些初始化操作
start initing ...
finish initing.
这里主要定义了android的sdk目录,java的home目录以及tools工具和build_tools工具,后初始化文件夹。对于environment="env"这个属性常量,我很诧异,因为在我的mac电脑上,无论我怎么测试都读不到我定义的java和android环境变量,最终还是选择了绝对路径定义(如有知晓原因,请劳烦给我留言,谢谢!)。
1.生成用于应用的R.java
aapt package -f -m -J gen -S res -M AndroidManifest.xml -I /Users/zejian/Documents/androidStudio/SDK/platforms/android-22/android.jar
参数含义如下:
-f 如果编译生成的文件已经存在,强制覆盖。
-m 使生成的包的目录存放在-J参数指定的目录
-J 指定生成的R.java 的输出目录路径(存放在桌面的gen)
-S 指定res文件夹的路径
-I 指定某个版本平台的android.jar文件的路径(我使用的是API-22)
转换成ant (注意依据当前项目的根目录)
1.正在生成用于应用的R.java存放到gen(使用aapt) ...
步骤1已经完成...
2.
编译所有java文件为class文件
javac -target 1.7 -bootclasspath /Users/zejian/Documents/androidStudio/SDK/platforms/android-22/android.jar -d bin src/com/example/command4ant/*.java gen/com/example/command4ant/R.java
含义如下:
-target
-bootclasspath <路径> 覆盖引导类文件的位置
-d <目录> 指定存放生成的类文件的位置
-sourcepath <路径> 指定查找输入源文件的位置
转换成ant (注意依据当前项目的根目录)
2.正在编译所有java文件为class文件(包含src和gen目录)...
步骤2已经完成...
3.
打包class文件和jar包为classes.dex
dx --dex --output=bin/classes.dex bin
参数含义如下:
--output=<要生成的classes.dex路径> <要处理的class文件的路径>
转换成ant (注意依据当前项目的根目录)
3.正在打包class文件和jar包为classes.dex...
步骤3已经完成...
4.
打包assets和res资源为资源压缩包(例如res.zip,名字可以自己定义)
aapt package -f -M AndroidManifest.xml -S res -I /Users/zejian/Documents/androidStudio/SDK/platforms/android-22/android.jar -A assets -F bin/res.zip
参数含义:
-f 如果编译生成的文件已经存在,强制覆盖。
-m 使生成的包的目录存放在-J参数指定的目录
-S 指定res文件夹的路径
-I 指定某个版本平台的android.jar文件的路径
-A 指定assert文件夹的路径
-F 指定输出文件完整路径
转换成ant (注意依据当前项目的根目录)
4.正在打包assets和res资源为资源压缩包res.zip...(include res, assets, AndroidManifest.xml)
步骤4已经完成...
5.
构建classes.dex
和
res.zip
生成未签名的
APK
apkbuilder bin/unsigned_command4Ant.apk -v -u -z bin/res.zip -f bin/classes.dex
参数含义:
第一个参数是存放打包后的文件完整路径
-v Verbose 显示过程信息
-u 创建一个无签名的包
-z 指定apk资源路径
-f 指定dex文件路径
转换成ant (注意依据当前项目的根目录)
5.正在构建classes.dex和res.zip生成未签名的APK(unsigned.apk)...
步骤5已经完成...
6.
生成有签名的APK
jarsigner -verbose -keystore debug4zj -storepass debug4zj -keypass debug4zj -signedjar bin/signed_command4Ant.apk bin/unsigned_command4Ant.apk debug4zj
参数含义:
-verbose 签名/验证时输出详细信息
-keystore 密钥库路径
-storepass 用于密钥库完整性的口令(密码)
-keypass 专用密钥的口令(密码)
-signedjar 已签名的 apk 文件的名称 (第一个apk是签名之后的文件, 第二个apk是需要签名的文件)
转换成ant (注意依据当前项目的根目录)
6.正在生成有签名的APK...
步骤6已经完成...
7
. 对签名包进行zipalign优化
zipalign -v 4 bin/signed.apk bin/zipalign_signed.apk
参数含义:
-v 输出详细信息
- 需要zipalign优化的apk 优化后的apk名称以及存放位置
转换成ant (注意依据当前项目的根目录)
7.正在对签名包进行zipalign优化...
步骤7已经完成...
到此打包流程的转换成ant的build.xml就完成了,最后给出完成的
build.xml文件:
start initing ...
finish initing.
1.正在生成用于应用的R.java存放到gen(使用aapt) ...
步骤1已经完成...
2.正在编译所有java文件为class文件(包含src和gen目录)...
步骤2已经完成...
3.正在打包class文件和jar包为classes.dex...
步骤3已经完成...
4.正在打包assets和res资源为资源压缩包res.zip...(res, assets, AndroidManifest.xml)
步骤4已经完成...
5.正在构建classes.dex和res.zip生成未签名的APK(unsigned.apk)...
步骤5已经完成...
6.正在生成有签名的APK...
步骤6已经完成...
7.正在对签名包进行zipalign优化...
步骤7已经完成...
然后我们运行build.xml文件,运行log如下:
这就为该签名包提供了时间戳的机构地址的认证链接,这样就不会报错啦。不过这个我在实际操作中发现,打包到签名时,用的时间特别久,原因就是要去提供的地址验证该时间戳的认证,所以我为了节省时间一般不加。完整代码如下:
6.正在生成有签名的APK...
步骤6已经完成...
到此
使用ant的build.xml构建自动化打包android apk 就全部分析完。下一篇我会继续分析使用ant实现android的多渠道打包,欢迎继续关注哈。
案例源码下载:http://download.csdn.net/detail/javazejian/9417035