如何从命令行打包APK

702 阅读1分钟

1、安装JDK

jdk 设置为环境变量以便使用 javac 编译 Java 文件,使用 keytool 命令创建签名文件。

2、安装SDK tools

aapt安装目录:/opt/android-sdk/build-tools/26.0.1/./aapt

android.jar安装目录:/opt/android-sdk/platforms/android-19/android.jar

dx安装目录:/opt/android-sdk/build-tools/26.0.1/./dx

3、编写需要打包的代码

创建 HelloAndroid 文件夹,在文件夹下准备对应的代码。

src/com/example/helloandroid\
obj\
bin\
res/layout\
res/values\
res/drawable\

如果包含 jar 文件,需要增加。

libs

Activity:src/com/example/helloandroid/MainActivity.java

strings.xml

activity_main.xml

AndroidManifest.xml

3、为代码生成R文件

aapt package -f -m -J /src -M $PROJ/AndroidManifest.xml -S /res -I /opt/android-sdk/platforms/android-19/android.jar

-m 指示 aapt 在 -J 指定的位置下创建目录

-J 指定输出的位置。 -J /src 将创建一个 src/com/example/helloandroid/R.java 这样的文件

-S 指定drawables, layouts等的 res 目录在哪里

-I 告诉 aapt android.jar 在哪里

4、编译Java代码

javac -d obj -classpath src -bootclasspath /opt/android-sdk/platforms/android-19/android.jar src/com/example/helloandroid/*.java

如果使用了三方库,需要编译 lib :

javac -d obj -classpath "src:libs/<your-lib>.jar" -bootclasspath /opt/android-sdk/platforms/android-19/android.jar src/com/example/helloandroid/*.java

编译后的 .class 文件在 obj 文件夹中,但 Android 无法读取它们。 我们必须将它们翻译到一个名为“classes.dex”的文件中,该文件将由 dalvik Android 运行时读取:

cd /opt/android-sdk/build-tools/26.0.1/\
./dx --dex --output=/bin/classes.dex /obj

如果使用了三方库,需要编译 lib :

./dx --dex --output=/bin/classes.dex /*.jar /obj

生成所有需要的的材料之后,将它们打包进 apk 中:

./aapt package -f -m -F /bin/hello.unaligned.apk -M /AndroidManifest.xml -S /res -I /opt/android-sdk/platforms/android-19/android.jar\

cp /bin/classes.dex .\

./aapt add /bin/hello.unaligned.apk classes.dex

到目前为止,我们使用了三个 AAPT 命令,第一个和第二个类似,但它们的作用不同。 必须像上面一样复制项目根目录下的 classes.dex 文件! 否则,AAPT 不会将此文件放在 APK 存档中的正确位置(因为 APK 类似于 .zip 文件)。

生成的包无法被 Android 安装,因为它是未对齐和未签名的。

我们可以查看打包成的apk的内容:

./aapt list /bin/hello.unaligned.apk

对APK签名

我们首先使用 Java 给出的命令 keytool 创建一个新的密钥库:

keytool -genkeypair -validity 365 -keystore mykey.keystore -keyalg RSA -keysize 2048

给 APK 签名:

./apksigner sign --ks mykey.keystore /bin/hello.apk

对齐包

./zipalign -f 4 /bin/hello.unaligned.apk $PROJ/bin/hello.apk

对齐可提高应用程序的性能并可能减少内存使用。

翻译

本文翻译自:medium.com/@dexter_422…

观看视频

asciinema.org/a/8AvDa1le1…