在本文中,我们将介绍创建Android应用项目(android create project)和虚拟机(android create avd)的命令。我们也将介绍用Apache Ant生成apk安装包的过程,用JDK(Java)中的keytool和jarsigner对apk进行签名的过程,以及用ADB在设备或虚拟机上安装apk的过程。文中的示例是在Windows 7中进行的,在其他操作系统(包括Linux和Mac OS)中的操作是类似的。
在开始之前,确认电脑中安装了JDK(下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html)、Android SDK(下载地址:http://http://developer.android.com/sdk/index.html)和Apache Ant(下载地址:http://ant.apache.org/index.html)。
在Android SDK中,android命令功能强大,其下包含了create project、create avd等子命令。该命令所处的位置为
android-sdk\tools\
我们可以使用帮助来了解android命令的用法:
android -h
下面是android帮助的输出结果:
从中我们可以看出,android命令的使用格式为
android [全局选项] 子命令 [子命令选项]
进一步地,我们可以使用帮助来查看android子命令的用法,例如查看子命令create project的用法:
android -h create project
下面是输出结果:
作者认为,在所有的命令中,“帮助”(-h)是功能最强大的工具(没有之一)!学习计算程序,不需要记过多的命令和命令的细节,关键在于理解基本原理,多使用帮助,多尝试。
下面我们介绍两个android子命令:创建Android应用项目(android create project)和创建Android虚拟机(android create avd)。其他子命令的用法请查看“帮助”。
创建Android应用项目的子命令是android create project。从前面的帮助中,我们看到,这个子命令有4个必选项(用[required]标注部分):
-a: 默认活动(Activity)的名称
-k: 应用的Android包的名称
-t: 项目的目标ID(即目标SDK版本)
-p:项目的路径
例如,我们创建一个名称为HelloWorld的Android应用项目:
android create project -n HelloWorld -a MainActivity -k com.zhangli.shally.helloworld -t android-23 -p D:\workspace\HelloWorld
下面是这个命令的输出:
该命令在D:\workspace\HelloWorld文件夹下创建了一个名称为HelloWorld的项目(注意:项目的名字(-n)不是必选项),这个项目中的默认活动为MainActivity,Android包的名字为com.zhangli.shally.helloworld,目标SDK为android-23。从前面的输出可以发现,该命令先创建项目目录“D:\workspace\HelloWorld”,然后在该目录下创建与项目相关的目录和文件:
注:根据具体需要来设置android create project子命令中各个选项。项目、活动和包的命名应尽量遵守Android编程规范。如果不确定支持哪些目标ID(目标SDK版本),可以用命令android list target列出开发机上已有的目标ID。
创建Android虚拟机的子命令是android create avd,我们先用帮助查看其用法:
这个子命令有2个必选项(用[required]标注部分):
-t: 虚拟机的目标ID(即虚拟机中的SDK版本)
-n: 虚拟机的名称
例如,下面的命令创建一个名为myavd的虚拟机,目标ID为android-23:
android create avd -t android-23 -n myavd -b armeabi-v7a
在创建虚拟机的过程中,会询问“是否自定义虚拟机硬件属性[no]”(见下图中画红线部分),直接“回车”选择默认配置。虚拟机创建结束后,输出硬件配置信息:
注:在创建虚拟机时,如果有多个ABI(application binary interface),则需用-b选项指定其中一个;否则会出现上图黄色框中的错误。
虚拟机的默认创建位置为:
%ANDROID_SDK_HOME%.android\avd
在作者的电脑中,我们得到如下虚拟机文件:
文件myavd.ini中包含编码、路径和目标ID信息:
avd.ini.encoding=UTF-8
path=C:\Users\Administrator\.android\avd\myavd.avd
path.rel=avd\myavd.avd
target=android-23
文件myavd.avd\config.ini中包含虚拟机的基本配置信息:
avd.ini.encoding=UTF-8
abi.type=armeabi-v7a
hw.cpu.arch=arm
hw.cpu.model=cortex-a8
hw.lcd.density=240
hw.ramSize=512
image.sysdir.1=system-images\android-23\default\armeabi-v7a\
skin.name=WVGA800
skin.path=platforms\android-23\skins\WVGA800
tag.display=Default
tag.id=default
vm.heapSize=48
文件myavd.avd\userdata.img为虚拟机中用户数据的镜像。
有三种方式设置虚拟机的sd卡、皮肤等属性:(a)在创建虚拟机时使用-t、-s等选项进行设置;(b)在创建虚拟机的交互界面(即在“是否自定义虚拟机硬件属性[no]”时输入y)进行设置;(c)在config.ini文件中进行设置。
虚拟机创建完成后,使用模拟器emulator(位于目录android-sdk\tools\)启动虚拟机:
emulator -avd myavd
我们可以用命令android list avd列出所有虚拟机。
Apache Ant是一个Java库,同时也是一个命令行工具,它可以有效地按build文件中描述的方式编译、生成、测试和运行Java应用。用Apache Ant从Android项目生成Android Apk安装包,只需两个步骤:
步骤1:用android update project命令更新Android项目,这个命令将更新build.xml、local.properties、proguard-project.txt等项目文件。(注:使用这个命令必须首先保证项目中有文件AndroidManifest.xml。)
android update project -p D:\workspace\HelloWorld
步骤2:用ant生成debug版本的Android Apk安装包:
ant -f D:\workspace\HelloWorld\build.xml debug
或release版本的Android Apk安装包:
ant -f D:\workspace\HelloWorld\build.xml release
生成安装包(debug版本和release版本)以后,项目HelloWorld文件夹中发生了两个变化:
(a) 在bin文件夹中产生了下面所列出的文件和文件夹
其中包含三个apk安装包:
HelloWorld-debug-unaligned.apk是未签名的debug版本apk文件;
HelloWorld-debug.apk是debug版本apk文件;
HelloWorld-release-unaligned.apk是未签名的release版本apk文件
从中我们可以看出,对于release版本的apk安装包,Android是鼓励对其进行数字签名的。我们可以用keytool对release安装包进行签名(见第3节“用keytool和jarsigner对Android Apk进行签名”)。
(b) 生成了一个新文件夹gen
其中,文件R.java是由aapt工具(位于目录android-sdk\build-tools\)根据应用中的资源文件自动生成的,里面包含了应用中所有资源的唯一编号。
Keytool是一个Java密钥和证书管理工具,它将密钥和证书储存在一个密钥仓库(keystore)中;jarsigner 工具利用密钥仓库中的信息来产生或校验Java存档 (JAR) 文件的数字签名。在这里我们仅演示如何用keytool来生成秘钥仓库,并演示jarsigner工具如何利用密钥仓库中的信息来对Android Apk进行数字签名。对于keytool和jarsigner的更多用法,请查阅“帮助”文档。
keytool和Jarsigner所处的位置为:
%JAVA_HOME%\bin\
用keytool和jarsigner对Android Apk进行签名需要两个步骤:
步骤1:用keytool -genkeypair创建一对密钥并保存在密钥库中
keytool -genkeypair -alias shally -keyalg RSA
-validity 100 -keystore D:\workspace\shally.jks
该命令生成一个别名为shally的密钥对,使用的密钥算法为RSA,密钥对的有效期是100天,并把密钥对保存在D:\workspace\shally.jks中。
在创建密钥对的过程中,先要输入密钥库的密码;然后针对密钥对,输入您名字、单位名称等信息,并对这些信息进行确认;最后输入密钥对的密码。可以用keytool -list列出密钥库中的信息:
步骤2:用jarsigner和前面创建的密钥对签名的Android Apk安装包
jarsigner -verbose -keystore D:\workspace\shally.jks -signedjar D:\workspace\HelloWorld\bin\HelloWorld-release.apk D:\workspace\HelloWorld\bin\HelloWorld-release-unsigned.apk shally
这个命令运行结束时,将在D:\workspace\HelloWorld\bin\目录下产生一个签名后的apk安装包HelloWorld-release.apk。
步骤2*:我们也可以在用ant生成Android Apk安装包时,对release版本的apk包进行签名。只需在Android应用项目根目录文件ant.properties中配置密钥库路径,密钥对别名,以及密钥库和密钥对密码:
key.store=D:\workspace\shally.jks
key.alias=shally
key.store.password=111111
key.alias.password=111111
Adb(android debug bridge)是一个Android调试桥,用来对设备或虚拟机进行管理,它可以进行以下的操作:
(1)在设备上运行Shell命令;
(2)管理设备或虚拟机上的文件
(3)管理设备或虚拟机上的预定端口;
(4)更新设备或虚拟机中,如Android系统和应用软件升级等。
在这里我们介绍如何使用adb来安装Android Apk安装包,关于adb的更多用法,请查看“帮助”。
adb所处的位置为:
android-sdk/platform-tools/
我们先用命令adb devices来查看连接的设备或虚拟机:
从上面的输出结果我们可以看到,在作者的开发机上连接了两个设备,其中3a25b5c是作者的手机,emulator-5554是前面创建和启动的虚拟机。
注: 5554是adb监听的Socket TCP端口之一,adb通过监听Socket TCP 5554等端口让IDE和Qemu进行通信。
我们可以通过命令adb shell来管理设备或虚拟机:
当连接了多台设备或虚拟机是,需要用选项-s来指定具体使用的设备或虚拟机,否则或出现以下错误:
error: more than one device and emulator
安装Android Apk的方式很简单,用命令adb push将待安装的apk复制到目录data/app/即可:
这时在虚拟机上我们将看到刚才安装的应用程序MainActivity(注:这是在HelloWorld应用项目的AndroidManifest.xml文件中设置的应用名字):
我们也可以通过其他方式进行安装,例如,首先将apk复制到设备或虚拟,然后在设备或虚拟机中用命令adb install进行安装。