Android自动打包流程详细图:
总结为以下几个步骤:
1. 生成R文件
2. Java代码编译成class文件
3. class文件生成dex文件
4. 打包资源
5. 生成apk
6. 创建密匙
7. 签名apk
下面用Ubuntu命令行来打包,流程如下:
1. 生成R文件,命令如下:
aapt package -f -m -J $BUILD_SOURCE_PATH/$ANDROID_GEN
-A $BUILD_SOURCE_PATH/$PACKAGE_RESOURCE_FILE
-S $BUILD_SOURCE_PATH/$ANDROID_RESOURCE_DIRECTORY
-I $BUILD_API_LEVEL_JAR
-M $BUILD_SOURCE_PATH/$MANIFEST_FILE
-f 如果编译生成的文件已经存在,强制覆盖。
-m 使生成的包的目录存放在-J参数指定的目录
-J 指定生成的R.java 的输出目录路径
-S 指定res文件夹的路径
-m 使生成的包的目录存放在-J参数指定的目录
-J 指定生成的R.java 的输出目录路径
-S 指定res文件夹的路径
-I 指定某个版本平台的android.jar文件的路径
-A 指定assert文件夹的路径
2.将Java代码编译成class文件,命令行如下:
javac -encoding UTF-8
-target 1.7
-bootclasspath $BUILD_API_LEVEL_JAR
-d $BUILD_SOURCE_PATH/$ANDROID_BIN/$ANDROID_BIN_CLASSES
$BUILD_SOURCE_PATH/$ANDROID_GEN/com/clarck/httpclientnew/R.java
$BUILD_SOURCE_PATH/src/com/clarck/httpclientnew/*.java
-encoding <编码> 指定编码格式
-target <版本> 生成特定 VM 版本的类文件
-bootclasspath <路径> 覆盖引导类文件的位置
-d <目录> 指定存放生成的类文件的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-d <目录> 指定存放生成的类文件的位置
-sourcepath <路径> 指定查找输入源文件的位置
3. class文件生成dex文件,命令行如下:
dx --dex --output=$BUILD_SOURCE_PATH/$ANDROID_BIN/$ANDROID_CLASSES_DEX
$BUILD_SOURCE_PATH/$ANDROID_BIN/$ANDROID_BIN_CLASSES
--output=<要生成的classes.dex路径> <要处理的class文件的路径>
4. 打包资源,命令行如下:
aapt package -f -M $BUILD_SOURCE_PATH/$MANIFEST_FILE
-S $BUILD_SOURCE_PATH/$ANDROID_RESOURCE_DIRECTORY
-A $BUILD_SOURCE_PATH/$PACKAGE_RESOURCE_FILE
-I $BUILD_API_LEVEL_JAR
-F $BUILD_SOURCE_PATH/$ANDROID_BIN/byreadreader
-f 如果编译生成的文件已经存在,强制覆盖
-M 指定AndroidManifest.xml的路径
-S 指定res文件夹路径
-M 指定AndroidManifest.xml的路径
-S 指定res文件夹路径
-I 指定某个版本平台的android.jar的路径
-F 指定输出文件完整路径
5. 生成apk,命令行如下:
apkbuilder $BUILD_APK_PATH/$BUILD_APK_NAME
-v -u -z $BUILD_SOURCE_PATH/$ANDROID_BIN/byreadreader
-f $BUILD_SOURCE_PATH/$ANDROID_BIN/$ANDROID_CLASSES_DEX
-rf $BUILD_SOURCE_PATH/$ANDROID_SRC
-v Verbose 显示过程信息
-u 创建一个无签名的包
-z 指定apk资源路径
-f 指定dex文件路径
-u 创建一个无签名的包
-z 指定apk资源路径
-f 指定dex文件路径
-rf 指定源码路径
6. 创建密匙,命令行如下:
keytool -genkey -alias release -keyalg RSA -validity 20000 -keystore release.keystore
-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
-alias 产生别名
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
-alias 产生别名
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
7. 签名apk,命令行如下:
jarsigner -verbose -keystore release.keystore -storepass !@#$%^ -keypass !@#$%^ -signedjar $BUILD_APK_PATH/$BUILD_RELEASE_APK_NAME $BUILD_APK_PATH/$BUILD_APK_NAME release
-verbose 签名/验证时输出详细信息
-keystore 密钥库位置
-storepass 用于密钥库完整性的口令
-keypass 专用密钥的口令(如果不同)
-signedjar 已签名的 JAR 文件的名称 (第一个apk是签名之后的文件, 第二个apk是需要签名的文件)
-keystore 密钥库位置
-storepass 用于密钥库完整性的口令
-keypass 专用密钥的口令(如果不同)
-signedjar 已签名的 JAR 文件的名称 (第一个apk是签名之后的文件, 第二个apk是需要签名的文件)
注:关于混淆代码,只需要在project.properties中指定用來混淆的.pro文件即可。
以上命令可以综合使用一个shell脚本来执行,具体demo详见:https://github.com/clarck/CommandAutoBuild