編輯:Android開發實例
本章將演示如何基於 Linux 命令行構建 Android 應用,在開始本章之前,希望你已經閱讀之前幾章內容。
本文環境為 RHEL Sandiego 32-bits,要基於 Linux CLI 構建 Android 應用,先決環境為:
1. JDK[1]
2. Android SDK
3. Apache Ant
安裝過程需要使用 sudo 權限。
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 安裝路徑>
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 中的 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
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 版本為 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
配置完畢所有先決環境後,就可以開始構建我們的 Android 項目了。
新安裝的 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。
你可以新建一個項目,或者直接從你的代碼管理系統中簽出項目代碼,然後進入項目根目錄。
如果你的項目之前一直使用 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 是必選。
有了 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
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
學習目的: 1、掌握在Android中如何建立EditText2、掌握EditText的常用屬性3、掌握EditText焦點的事件、按鍵的事件(監聽器) 介紹:
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個