Home

命令行编译打包android应用

在eclipse中点击一下就能将android项目一键构建,但在这个过程中发生了什么?我们亲手用命令行来实践一下吧.

构建流程

先上一张google官方的构建流程图 build process

命令行构建

下面我们就来用命令行实践一下,我所使用的sdk版本是android-sdk_r24.0.2-linux 首先新建一个Android应用项目 android create project –target 19 –name TestApp –path ~/workspace/TestApp –activity MainActivity –package com.example.testapp

使用aapt生成R.java和编译的资源包

aapt在sdk中的build-tools中找到,从build-tools中选最新的版本的aapt appt的使用方法

aapt package -f -M ${manifest.file}   
-F ${packaged.resource.file}     
-I ${path.to.android-jar.library}   
-S ${android-resource-directory}    
[-m -J ${folder.to.output.the.R.java}]

实践:

mkdir ~/workspace/TestApp/gen
./aapt package -f -M ~/workspace/TestApp/AndroidManifest.xml \  
-F ~/workspace/TestApp/bin/resources.arsc \  
-I ~/Android/SDK/platforms/android-21/android.jar \  
-S ~/workspace/TestApp/res/   \  
-m -J ~/workspace/TestApp/gen/

使用aidl命令把.aidl转成.java文件

aidl -p ${android-framework} -I ${srcdir} dir="${srcdir}" ${.aidl files}

这里我们没有.aidl文件,所以跳过

编译.java文件

使用javac编译所有的.java文件

mkdir ~/workspace/TestApp/bin/classes  
javac -encoding UTF-8 -source 1.6 -target 1.6 \  
-bootclasspath  ~/Android/SDK/platforms/android-21/android.jar \  
-d ~/workspace/TestApp/bin/classes \   
~/workspace/TestApp/src/com/example/testapp/*.java \  
~/workspace/TestApp/gen/com/example/testapp/R.java

生成dex文件

生成dex文件的工具是dx,跟aapt在同一目录。 dx用法:

dx -–dex --dump-to ${output.dex.file}  --core-library ${compiled.classes.directory} 

实践:

./dx --dex --dump-to ~/workspace/TestApp/bin/classes.dex \  
--core-library  ~/workspace/TestApp/bin/classes

注意在我使用的build-tools/21.1.2中的dx还不兼容使用jdk 8及以上版本,所以在用javac编译时需指定source和target为1.6或1.7。这点需要注意,不然会出现下面的异常

UNEXPECTED TOP-LEVEL EXCEPTION:

打包所有文件成apk文件

打包所有文件成apk文件使用的工具是apkbuilder,不过在较新的android sdk中取消了这个工具,不过apkbuilder只是个批处理文件,我们可以自己生成它。在sdk/tools目录中:

cat android | sed -e 's/com.android.sdkmanager.Main/com.android.sdklib.build.ApkBuilderMain/g' > apkbuilder
chmod a+x apkbuilder

详情查看stackoverflow的这个问答 apkbuilder用法:

apkbuilder  ${output.apk.file} -u -z  ${packagedresource.file} -f  ${dex.file}

实践:

mkdir ~/workspace/TestApp/build  
./apkbuilder ~/workspace/TestApp/build/TestApp-unsigned.apk  -u \  
-z ~/workspace/TestApp/bin/resources.arsc \  
-f ~/workspace/TestApp/bin/classes.dex

签名

apk需要正确的签名才能在android系统上安装,要签名apk就需要密钥key。生成key使用jdk中的keytool生成密钥证书

keytool -genkeypair -alias ${别名} -keyalg RSA -keystore ${keystore文件的路径+文件名}.keystore

实践:

keytool -genkeypair -alias "testkey" -keyalg "RSA" -keystore "test.keystore" 

输入之后回答一堆问题之后就会生成.keystore文件 在debug的时候可以使用googleg提供的debug key,debug证书存放可以在$HOME/.android/debug.keystore中。 下一步是使用jarsigner给apk文件签名

jarsigner  -keystore ${keystore} -storepass  ${keystore.password} -keypass ${keypass密钥别名密码} -signedjar ${signed.apkfile} ${unsigned.apkfile} ${keyalias密钥别名}

实践:

jarsigner -keystore test.keystore -storepass 1234567890 -keypass 1234567890 -signedjar \  
~/workspace/TestApp/build/TestApp-signed.apk \  
~/workspace/TestApp/buildTestApp-unsigned.apk testkey

一步到位

由上可见,apk的构建非常的繁杂。不过好在android应用在创建的时候就已经配置好ant自动构建脚本了。在项目主目录下直接

ant debug

就可在bin下生成debug模式的apk 生产release使用

ant release