aapt 命令行打包

859 阅读2分钟

记录第一次aapt命令行打包 准备工作,先用ide生成一个Android项目,项目中删除掉多余的文件,以及多余的build.gradle的引用; 我这个甚至连design包都去掉了,MainActivity中继承自Activity,而不是AppCompatActivity; AndroidManifest.xml中的主题theme也先去掉,

1.生成R.java文件

aapt package -f -m -J gen -S res -M AndroidManifest.xml -I H:\environment\android_sdk\platforms\android-28\android.jar

-f 假设编译生成的文件已经存在,强制覆盖。
-m 使生成的包的文件夹存放在-J參数指定的文件夹
-J 指定生成的R.java 的输出文件夹路径
-S 指定res目录的路径
-M 指定AndroidManifest.xml路径
-I 指定某个版本号平台的android.jar文件的路径
-A 指定assert目录的路径

这会在gen文件下生成R.java文件,以供后面使用

2.生成.class文件

javac -bootclasspath H:\environment\android_sdk\platforms\android-28\android.jar -d bin java\com\lyhinsuning\cmdpackage\*.java gen\com\lyhinsuning\cmdpackage\R.java

-target <版本号>               生成特定 VM 版本号的类文件
-bootclasspath <路径>        覆盖引导类文件的位置
-d <文件夹>                    指定存放生成的类文件的位置
-sourcepath <路径>           指定查找输入源文件的位置

这里会根据第一步生成的R文件,编译MainActivity.java文件生成相应的R.class和MainActivity.class

3.生成jar文件

cd bin
jar cvf cmdpackage.jar *

这里就会根据第二部bin文件里面生成的class文件打包成jar文件

4.生成dex文件

cd ..
dx --dex --output=bin\classes.dex bin\cmdpackage.jar

--output=<要生成的classes.dex路径> <要处理的class文件的路径>

5.打包资源(图片,字符串等xml文件)

aapt package -f -M AndroidManifest.xml -S res -I H:\environment\android_sdk\platforms\android-28\android.jar -F bin\resource.ap_

-f 假设编译生成的文件已经存在,强制覆盖
-M 指定AndroidManifest.xml的路径
-S 指定res目录路径
-I 指定某个版本号平台的android.jar的路径
-F 指定输出文件完整路径

这里生成了一个resource.ap_的文件,里面放的是图片资源(不信的话,可以修改后缀成.zip然后解压看看哦)

6.打包成apk文件

java -cp H:\environment\android_sdk\tools\lib\sdklib-26.0.0-dev.jar com.android.sdklib.build.ApkBuilderMain myCmd.apk -v -u -z bin\resource.ap_  -f bin\classes.dex -rf java

-v Verbose 显示过程信息
-u 创建一个无签名的包
-z 指定ap_资源路径
-f 指定dex文件路径
-rf 指定源代码路径

然后就在当前目录生成了一个myCmd.apk的apk文件,签名之后就可以安装在手机上了

7.签名apk文件

需要下载一个auto-sign.jar的东西,(可以百度或google下载)

cd auto-sign
java -jar signapk.jar testkey.x509.pem testkey.pk8 ../myCmd.apk myCmdSign.apk

这里就打包+签名结束了;生成的myCmdSign.apk文件就可以通过 adb install myCmdSign.apk安装到手机上了