[Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建

  本章将演示如何基于 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
                    projects directory.
  -p --path       : The projects 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
View Code

 

  然后更新仓库并安装 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。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。