本章将演示如何基于 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.-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 的时候你可能遇到以下错误提示:

...
: 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.
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  -validity 

  命令详解:

  -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.-.el6.i686: failure: Packages/libXfont-1.4.-.el6.i686.rpm from RHEL6.: [Errno ] No more mirrors to try.
libfontenc-1.0.-.el6.i686: failure: Packages/libfontenc-1.0.-.el6.i686.rpm from RHEL6.: [Errno ] 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=
enabled= [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=
enabled= [el5_u1_base]
name=Enterprise Linux $releasever Update 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=
enabled= [el5_u2_base]
name=Enterprise Linux $releasever Update 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=
enabled= [el5_u3_base]
name=Enterprise Linux $releasever Update 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=
enabled= [el5_u4_base]
name=Enterprise Linux $releasever Update 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=
enabled= [el5_u5_base]
name=Enterprise Linux $releasever Update 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=
enabled= [ol5_u5_base]
name=Oracle Linux $releasever Update 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=
enabled= [ol5_u6_base]
name=Oracle Linux $releasever Update 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=
enabled= [ol5_u7_base]
name=Oracle Linux $releasever Update 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=
enabled= [ol5_u8_base]
name=Oracle Linux $releasever Update 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=
enabled= [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=
enabled= [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=
enabled= [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=
enabled= [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=
enabled= [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=
enabled=

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

[Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建的更多相关文章

  1. [Android] 基于 Linux 命令行构建 Android 应用(二):命令行管理项目

    创建 Android 项目 在命令行创建 Android 项目需要用到 android 工具(该工具由 Android SDK 提供,位于 <sdk>/tools/ 目录下.).它能自动生 ...

  2. [Android] 基于 Linux 命令行构建 Android 应用(六):Android 应用签名

    Android 要求所有应用在安装前必须使用证书进行数字签名.Android 使用该证书来确定一个应用以及其作者身份,该证书不要求由证书发行机构颁发,因此 Android 应用经常使用自我签名的证书, ...

  3. [Android] 基于 Linux 命令行构建 Android 应用(四):命令行构建

    谷歌提供的 Android SDK 支持 Ant 自动构建[1],你可以使用调试和发行两种模式进行构建,两种模式不同之处在于调试模式 Ant 会调用内置的调试密钥,而发行模式调用你提供的私钥. 首先安 ...

  4. [Android] 基于 Linux 命令行构建 Android 应用(五):Ant 构建命令

    Android SDK 提供的 android 工具可以在项目根目录自动生成 Ant 构建文件 build.xml[1].进入项目根目录后,你可以使用以下 Ant 命令[2]. ant clean 清 ...

  5. [Android] 基于 Linux 命令行构建 Android 应用(一):关于 Android 项目

    关于 Android 项目 项目是保存源代码和资源文件的容器. 谷歌提供的 Android SDK 工具只能对具有固定目录结构的项目进行编译和打包.因此强烈建议使用 Eclipse + ADT 或者 ...

  6. [Android] 基于 Linux 命令行构建 Android 应用(三):构建流程

    Android 应用的构建过程就是将 Android 项目中的文件和资源进行编译和打包,最后将结果输出到 .apk 文件..apk 文件是保存二进制文件的容器,它包含了运行安卓应用所需的所有信息,例如 ...

  7. 7个基于Linux命令行的文件下载和网站浏览工具

    7个基于Linux命令行的文件下载和网站浏览工具 时间:2015-06-01 09:36来源:linux.cn 编辑:linux.cn 点击: 2282 次 Linux命令行是GNU/Linux中最神 ...

  8. 【转载】基于Linux命令行KVM虚拟机的安装配置与基本使用

    基于Linux命令行KVM虚拟机的安装配置与基本使用 https://alex0227.github.io/2018/06/06/%E5%9F%BA%E4%BA%8ELinux%E5%91%BD%E4 ...

  9. 5个基于Linux命令行的文件下载和网站浏览工具

    导读 命令行是GNU/Linux中最神奇迷人的部分,它是非常强大的工具;命令行本身功能多样,多种内建或者第三方的命令行应用使得Linux变得更加健壮和强大.Linux Shell支持多种不同类型的网络 ...

随机推荐

  1. STL——map/unordered_map基础用法

    map /multimap map是STL里重要容器之一. 它的特性总结来讲就是:所有元素都会根据元素的键值key自动排序(也可根据自定义的仿函数进行自定义排序),其中的每个元素都是<key,  ...

  2. R12.2.7 开启预置用户账号

    [root@apps scripts]# cd /u01/install/APPS/scripts [root@apps scripts]# ll total 244 -rwxr-xr-x 1 ora ...

  3. java线程安全之并发Queue

    关闭 原 java线程安全之并发Queue(十三) 2017年11月19日 23:40:23 小彬彬~ 阅读数:12092更多 所属专栏: 线程安全    版权声明:本文为博主原创文章,未经博主允许不 ...

  4. DNS的域名的解析解决办法(openDNS)

    http://www.williamlong.info/archives/1101.html

  5. 实现一个原子的正整数类:AtomicPositiveInteger

    import java.util.concurrent.atomic.AtomicInteger; public class AtomicPositiveInteger extends Number ...

  6. sed学习[参考转载]

    一.选项与参数: -n :使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者 ...

  7. iOS开发之Xcode9报错 Compiling IB documents for earlier than iOS7 is no longer supported.

    升级到Xcode9时,最低的编译版本为iOS8,但是在使用一些SDK的时候就会报出Compiling IB documents for earlier than iOS7 is no longer s ...

  8. 团队工作效率分析工具gitstats

    如果你是团队领导,关心团队的开发效率和工作激情:如果你是开源软件开发者,维护者某个repo:又或者,你关心某个开源软件的开发进度,那么你可以试一试gitstats. gitstats 是一个git仓库 ...

  9. 使用jackson来进行数组格式的json字符串转换成List。

    有一个字符串如下.如下,也是通过jackson把list转换成的json字符串,我想把它转过来,看网上的内容都不尽人如意,都是片断的内容.估计只有写的知道怎么使用,所以就直接看了jackson的官网, ...

  10. Android 使用开源库StickyGridHeaders来实现带sections和headers的GridView显示本地图片效果

    大家好!过完年回来到现在差不多一个月没写文章了,一是觉得不知道写哪些方面的文章,没有好的题材来写,二是因为自己的一些私事给耽误了,所以过完年的第一篇文章到现在才发表出来,2014年我还是会继续在CSD ...