最近在一个android项目中遇到了这样一个需求,对于不一样的客户须要不一样的apk名称,icon,并对apk进行不一样的配置。 java
从原理上讲,这是比较简单的,无非是对values/string.xml中相关字段进行修改,将相应的图标放置到对应的drawble文件夹下等。但这在实现过程当中遇到了一些问题,现记录下来与诸君共享。咱们知道打包编译后的apk实质上是一个压缩包,将apk后缀改为zip后解压咱们能够看到有以下文件: android
咱们能够看到,android为了提升文件读取效率,将values文件夹下的全部xml文件都编译进了resource.arsc的二进制文件中,若咱们直接对resources.arsc进行修改,将会比较麻烦,故决定采起ant从新编译的方式来实现。 程序员
apk的编译过程分为如下几个阶段: apache
1.用aapt命令生成R.java文件
2.用aidl命令生成相应java文件
3.用javac命令编译java源文件生成class文件
4.用dx.bat将class文件转换成classes.dex文件
5.用aapt命令生成资源包文件resources.ap_
6.用apkbuilder.bat打包资源和classes.dex文件,生成unsigned.apk
7.用jarsinger命令对apk认证,生成signed.apk windows
由上述步骤咱们能够看到,如果手工去实现这些步骤会很是繁琐,幸亏咱们有ant,能够帮助咱们方便的来处理这些事情。 测试
了解了这些原理,让咱们来看看是如何使用ant来编译apk的。 ui
步骤一、 this
下载ant,顾名思义,咱们须要使用ant,下载地址,到官网上下载对应的版本吧个人版本是 spa
Apache Ant(TM) version 1.9.3 命令行
步骤二、
配置ANT_HOME以及PATH,对于这两个配置相信java程序员必定不陌生了,故名思议,ANT_HOME为ant的解压目录,path为ANT_HOME/bin。配置好后测试一下,打开cmd,输入ant -verbose。若出现对应ant版本号,则说明配置成功了。
注:期间我遇到了这个问题
Unable to locate tools.jar. Expected to find it in C:/Program Files/Java/jre/lib/tools.jar
将C:/Program Files/Java/jdk/lib下的tools.jar拷贝到 C:/Program Files/Java/jre/lib下便可解决
步骤三、
使用anroid adt自带的android.bat对项目工程进行更新。android.bat路径在对应sdk\tools下,如个人在F:\android\adt\sdk\tools下。
在cmd窗口中敲入以下命令:
#更新项目 android.bat update project --name ATest -t 6 -p f:/test/android/ATest
其中
--name 为项目名称
-t android编译版本
-p 项目路径
上述命令将会在项目中自动建立相应所需的build.xml等。
若在更新时候出现以下问题:
Error: Target id '16' is not valid. Use 'android.bat list targets' to get the target ids.
则先输入以下代码来查询目前所支持的android编译版本。
android.bat list targets
步骤四、
相关资源准备。
一、将打包签名所需store拷贝到项目路径下
二、在项目的根目录下建一个ant.properties文件(注:有些系统下使用的是local.properties的文件),输入以下内容,其中keystore密码和alias密码能够不指定(防泄漏),那么在命令执行的过程当中会要求你输入
key.store=release.keystore key.store.password=antPassword key.alias.password=antPassword key.alias=release proguard.config=proguard.cfg
步骤五、
使用ant运行项目。
在cmd命令行输入
ant release
其中曾经遇到过这个问题,主要是未引入keystore所至,将能够store拷贝到项目下便可:
BUILD FAILED D:android-sdk-windows\tools\ant\build.xml:650: The following error occurred while executing this line: D:android-sdk-windows\tools\ant\build.xml:691: null returned: 1
若无问题,则会在对应的bin目录下看到生成好的apk啦。
release: BUILD SUCCESSFUL Total time: 18 seconds