本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容。
本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 Android 应用,先决环境为:
1. JDK[1]
2. Android SDK
3. Apache Ant
安装过程需要使用 sudo 权限。
1. 搭建环境
1.1. 安装 JDK
JDK 是构建 Android 应用先决条件之一,由于版权原因,一般安装 Open JDK。
RHEL 中使用 yum 安装,我们选择安装 java-1.7.0-openjdk-devel(即 Java 7)[2]:
# yum upgrade ... # yum install java-1.7.0-openjdk-devel
如果你使用程序包管理工具例如 yum 安装 JDK,那么 yum 已经为你处理好了一切,系统可以自动找到 JDK 提供的各种工具。如果你是手动安装,你需要手动声明 JAVA_HOME 环境变量以便稍后 Ant 可以找到 JDK 提供的各种工具。
$ vi ~/.bash_profile 在最后一行输入: export JAVA_HOME=<你的 JDK 安装路径>
1.2. 安装 Android SDK
Android 官方提供了适用不同开发环境的 Android SDK,我们选择安装适用于 Linux CLI 的 SDK Tools Only:
$ cd ~/downloads $ wget https://dl.google.com/android/android-sdk_r23.0.2-linux.tgz $ tar zxvf android-sdk_r23.0.2-linux.tgz -C ~/work/env
以上命令将 android-sdk_r23.0.2-linux.tgz 下载到用户的 ~/downloads 目录,然后解压到用户的 ~/work/env 目录下,在该目录下会有一个 android-sdk-linux 目录,所以你的 Android SDK 安装目录为 ~/work/env/android-sdk-linux。你可以将 Android SDK 目录解压到任何地方,只要你记得它在哪里即可。
配置 Android SDK 环境变量
将 Android SDK 中的 platform-tools/ 和 tools/ 目录添加到系统可执行路径中。编辑 ~/.bash_profile 文件(将其中的 $HOME/work/env/android-sdk-linux 替换为你的 Android SDK 安装路径):
# configure android sdk path PATH=$PATH:$HOME/work/env/android-sdk-linux/tools PATH=$PATH:$HOME/work/env/android-sdk-linux/platform-tools
export PATH
另外根据你系统架构设置 ANDROID_SWT 环境变量。
32 位:
export ANDROID_SWT=/home/android/work/env/android-sdk-linux/tools/lib/x86
64 位:
$ export ANDROID_SWT=/home/web_monitor/Downloads/android-sdk-linux/tools/lib/x86 _64
1.3. 安装 Apache Ant
Ant 是一个 Java 项目构建工具,也是 Android SDK 默认支持的构建工具。(更多关于 Ant 介绍)
你可以使用 yum 自动安装 Ant[3]:
# yum install ant
在使用 Ant 的时候你可能遇到以下错误提示:
... 199: No supported regular expression matcher found: java.lang.ClassNotFoundException: org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp ...
解决方法是安装 ant-apache-regexp[4]:
$ sudo yum install ant-apache-regexp
配置 Ant 环境变量
我实际的 Ant 版本为 1.9.4,安装路径为 ~/work/env/apache-ant-1.9.4,编辑 ~/.bash_profile:
# ant configuration export ANT_HOME=$HOME/work/env/apache-ant-1.9.4 export PATH=$PATH:$ANT_HOME/bin
2. CLI 构建应用
配置完毕所有先决环境后,就可以开始构建我们的 Android 项目了。
2.1. 更新 Android Targets
新安装的 Android SDK 没有附带 Android Target,你要做的第一件事就是下载最新的 Android Targets。
查看当前已安装 Android Targets:
$ android list target
你会使用该命令来查看是否安装了某个 Android Target,也会用它来查看 Target ID,这个 ID 会在稍后构建时用到。
下载并安装 Android Targets[5]:
$ android update sdk --no-ui
安装过程中会询问你是否接受相关许可。另外初次更新耗时较长,而且很难一次性更新所有的资源,你需要多次反复执行该命令直到你拥有最新最全的 Android Targets。
2.2. 构建项目
2.2.1. 准备项目
你可以新建一个项目,或者直接从你的代码管理系统中签出项目代码,然后进入项目根目录。
如果你的项目之前一直使用 Eclipse 开发,那么在你项目根目录中可能没有 build.xml 这个文件,该文件是 Ant 构建配置文件,我们需要使用这个文件来调用 Ant 进行自动构建,你不必自己动手来写这个文件,如果你的项目是使用 Android SDK 提供的 android 工具创建的,那么它会自动生成在你项目根目录中。如果它不存在,我们只需要使用 android 工具更新一下项目就可以重新创建它。
$ android update project -p .
android update project 命令可用选项包括:
Options: -l --library : Directory of an Android library to add, relative to this project's directory. -p --path : The project's directory. [required] -n --name : Project name. -t --target : Target ID to set for the project. -s --subprojects: Also updates any projects in sub-folders, such as test projects.
其中只有 -p 是必选。
2.2.2. 使用 Ant 构建项目
有了 build.xml 以后,就可以使用 Ant 来构建整个项目,Android SDK 提供的 Ant 命令(点击查看全部 Ant 命令)最主要的有:
● ant clean:清理项目中冗余输出项。
● ant debug:调试模式构建。
● ant release:发行模式构建。
调试模式构建
在项目根目录下直接执行以下命令:
$ ant debug
构建完毕后,在项目根目录下的 bin 目录中你可以找到 <project-name>-debug.apk,你可以将它安装到安卓设备上进行调试。
发行模式构建
在项目根目录下直接执行以下命令:
$ ant release
构建过程中会要求你输入签名用的 keystore 文件和密码,构建完毕后,你可以在 bin 目录找到 <project-name>-release.apk,你可以将该文件上传到安卓应用商店公开发行。
如果想要整个构建过程实现无人值守的自动化效果,你需要解决构建过程中输入问题,以下是两个解决方法。
方法一:在项目根目录下创建 ant.properties 文件,添加以下内容:
# You can also use it define how the release builds are signed by declaring # the following properties: # 'key.store' for the location of your keystore and # 'key.alias' for the name of the key to use. # The password will be asked during the build when you use the 'release' target. key.store=<你的 keystore 文件路径> key.alias=<你的 keystore 别名> key.store.password=<你的 keystore 文件密码> key.alias.password=<你的 keystore 别名密码>
方法二:在命令行使用 -D 选项动态传入相关参数:
$ ant release -Dkey.store=keystore -Dkey.alias=alias -Dkey.store.password=passwd -Dkey.alias.password=passwd
如果你还没有一个 keystore 文件,你可以使用 JDK 提供的 keytool 工具创建一个:
$ keytool -genkey -v -keystore <App-Name>.keystore -alias <Alias Name> -keyalg RSA -keysize 2048 -validity 10000
命令详解:
-genkey 或 -genkeypair:生成 keystore。
-v:打印相关信息。
-keystore:keystore 文件名。
-alias:设置别名。
-keyalg:密钥算法(一般使用 RSA 算法)。
-keysize:密钥长度(按位计算)。
-validity:有效期(按天)。
其他构建选项
如果不想每次都进入项目根目录进行构建,可以使用 Ant 的 -buildfile 选项。
$ ant release -buildfile <path-to-your-build.xml>
如果想要将 .apk 输出到其他目录,编辑 ant.properties 文件添加:
# You can use this to override default values such as # 'source.dir' for the location of your java source folder and # 'out.dir' for the location of your output folder. out.dir=<the destination path you want>
或者
$ ant release -Dout.dir=<path>
其他一些有用选项:
-lib <path>:添加第三方 Java 包搜索路径。
-logfile <file> 或 -l <file>:日志输出文件。
-logger <classname>:记录日志的类名。
-propertyfile <name>:ant 属性文件。
(完)
注:
[1] 必须安装 JDK 而不是 JRE,因为 JRE 只提供 JAVA 运行环境,但我们要用到一些由 JDK 提供的工具。
[2] 如果你安装过程出现以下问题,可是按照给出的方法解决:
错误提示:
... Error Downloading Packages: libXfont-1.4.5-2.el6.i686: failure: Packages/libXfont-1.4.5-2.el6.i686.rpm from RHEL6.4: [Errno 256] No more mirrors to try. libfontenc-1.0.5-2.el6.i686: failure: Packages/libfontenc-1.0.5-2.el6.i686.rpm from RHEL6.4: [Errno 256] No more mirrors to try. ...
解决方法是新建一个远程仓库连接:
# vi /etc/yum.repos.d/public-yum-el5.repo
粘贴以下内容:
[el5_latest] name=Oracle Linux $releasever Latest ($basearch) baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/latest/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=1 [el5_ga_base] name=Oracle Linux $releasever GA installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/0/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [el5_u1_base] name=Enterprise Linux $releasever Update 1 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/1/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [el5_u2_base] name=Enterprise Linux $releasever Update 2 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/2/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [el5_u3_base] name=Enterprise Linux $releasever Update 3 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/3/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [el5_u4_base] name=Enterprise Linux $releasever Update 4 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/4/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [el5_u5_base] name=Enterprise Linux $releasever Update 5 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/5/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [ol5_u5_base] name=Oracle Linux $releasever Update 5 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/5/base/x86_64/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [ol5_u6_base] name=Oracle Linux $releasever Update 6 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/6/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [ol5_u7_base] name=Oracle Linux $releasever Update 7 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/7/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [ol5_u8_base] name=Oracle Linux $releasever Update 8 installation media copy ($basearch) baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/8/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [el5_addons] name=Enterprise Linux $releasever Add ons ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/addons/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [el5_oracle_addons] name=Oracle Software addons for Enterprise Linux $releasever ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/oracle_addons/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [ol5_UEK_latest] name=Latest Unbreakable Enterprise Kernel for Oracle Linux $releasever ($basearch) baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/UEK/latest/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [ol5_UEK_base] name=Unbreakable Enterprise Kernel for Oracle Linux $releasever ($basearch) baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/UEK/base/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0 [el5_unsupported] name=Productivity Applications for Enterprise Linux $releasever ($basearch) baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/unsupported/$basearch/ gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5 gpgcheck=1 enabled=0
然后更新仓库并安装 JDK 需要的依赖包:
# yum install freetype-devel # yum install xorg-x11-proto-devel
在随后我还遇到几次错误提示,都是由于缺少依赖包资源导致。为此只能手动安装所需依赖包,例如:
# cd ~/downloads # wget ftp://mirror.symnds.com/distributions/CentOS-vault/6.1/os/x86_64/Packages/libfontenc-1.0.5-2.el6.i686.rpm ... # yum install libfontenc-1.0.5-2.el6.i686.rpm
我还用到的依赖包包括:libfontenc-devel-1.0.5-2.el6.i686.rpm, libXfont-1.4.5-2.el6.i686.rpm, libXfont-devel-1.4.5-2.el6.i686.rpm。
最后再次安装 JDK:
# yum install java-1.7.0-openjdk-devel
[3] 我使用的是 android-sdk_r23.0.2-linux.tgz,这个版本 Android SDK 要求 Ant 1.8 版本或以上,但我使用 yum 安装只能达到 Ant 1.7 版本,因此只能手动安装最新版本的 Ant 1.9.4。
$ cd ~/downloads $ wget "http://mirror.symnds.com/software/Apache//ant/binaries/apache-ant-1.9.4-bin.tar.gz" $ tar zxvf apache-ant-1.9.4-bin.tar.gz -C ~/work/env
[4] 如果在 Ubuntu 中,你需要安装 ant-optional:$ sudo apt-get install ant-optional。
[5] $ android update sdk 命令用来更新当前的 sdk,直接运行该命令会导致以下异常:
... Exception in thread "main" org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed] ...
这是因为它默认启动一个 GUI 界面来更新 SDK 资源,如果你使用 Eclipse + ADT 进行开发,在命令运行该命令就会调出 Android SDK Manager 窗口。在 CLI 界面下我们需要使用 ---no-ui 选项:$ android update sdk --no-ui。