没有 IDE 的 Android 编程
这是一个极简主义的 Hello World 示例 ,仅使用最基本的 Android 工具。
要求和假设
- Oracle JDK 1.7 或更高版本
 - Android SDK 工具(只是命令行工具 )
 
这个例子假设 Linux。你可能必须调整自己平台的语法。
设置 Android SDK
解压缩 SDK 版本后:
- 
使用 SDK 管理器安装其他软件包。不要按照绑定的 Readme.txt 中的说明使用
android update sdk --no-ui; 它下载了大约 30 GB 的不必要文件。而是使用交互式 SDK 管理器android sdk来获得建议的最小包。 - 
将以下 JDK 和 SDK 目录附加到执行 PATH。这是可选的,但下面的说明假定它。
- JDK / bin 中
 - SDK /平台的工具
 - SDK /工具
 - SDK / build-tools / LATEST (在步骤 1 中安装)
 
 - 
创建 Android 虚拟设备。使用交互式 AVD 管理器(
android avd)。你可能需要调整一下并寻求建议; 在现场的指令并不总是有益的。(你也可以使用自己的设备)
 - 
运行设备:
emulator -avd DEVICE - 
如果设备屏幕似乎已锁定,则滑动以将其解锁。
在编写应用程序时让它保持运行。
 
编写应用程序
- 
切换到空工作目录。
 - 
制作源文件:
mkdir --parents src/dom/domain touch src/dom/domain/SayingHello.java内容:
package dom.domain; import android.widget.TextView; public final class SayingHello extends android.app.Activity { protected @Override void onCreate( final android.os.Bundle activityState ) { super.onCreate( activityState ); final TextView textV = new TextView( SayingHello.this ); textV.setText( "Hello world" ); setContentView( textV ); } } - 
添加清单:
touch AndroidManifest.xml内容:
<?xml version='1.0'?> <manifest xmlns:a='http://schemas.android.com/apk/res/android' package='dom.domain' a:versionCode='0' a:versionName='0'> <application a:label='Saying hello'> <activity a:name='dom.domain.SayingHello'> <intent-filter> <category a:name='android.intent.category.LAUNCHER'/> <action a:name='android.intent.action.MAIN'/> </intent-filter> </activity> </application> </manifest> - 
为声明的资源创建一个子目录:
mkdir res暂时把它留空。
 
构建代码
- 
生成资源声明的源。在这里替换 SDK 的正确路径,以及要构建的已安装 API (例如“android-23”):
aapt package -f \ -I SDK/platforms/android-API/android.jar \ -J src -m \ -M AndroidManifest.xml -S res -v资源声明(下面进一步描述)实际上是可选的。同时,如果 res /仍为空,则上述调用不执行任何操作。
 - 
将源代码编译为 Java 字节码(.java→.class):
javac \ -bootclasspath SDK/platforms/android-API/android.jar \ -classpath src -source 1.7 -target 1.7 \ src/dom/domain/*.java - 
将字节码从 Java 转换为 Android(.class→.dex):
首先使用 Jill(.class→.jayce):
java -jar SDK/build-tools/LATEST/jill.jar \ --output classes.jayce src杰克(.jayce→.dex):
java -jar SDK/build-tools/LATEST/jack.jar \ --import classes.jayce --output-dex .Android 字节码曾被称为“Dalvik 可执行代码”,因此称为
dex。如果你愿意的话,你可以用一次调用取代 Jack 替换步骤 11 和 12; 它可以直接从 Java 源代码编译(.java→.dex)。但是用
javac编译是有好处的。它是一个更好的已知,更好的文档和更广泛适用的工具。 - 
打包资源文件,包括清单:
aapt package -f \ -F app.apkPart \ -I SDK/platforms/android-API/android.jar \ -M AndroidManifest.xml -S res -v这导致部分 APK 文件(Android 应用程序包)。
 - 
使用
ApkBuilder工具制作完整的 APK:java -classpath SDK/tools/lib/sdklib.jar \ com.android.sdklib.build.ApkBuilderMain \ app.apkUnalign \ -d -f classes.dex -v -z app.apkPart它警告说,“这个工具已被弃用。有关更多信息,请参阅 –help。” 如果
--help以ArrayIndexOutOfBoundsException失败,那么不传递任何参数:java -classpath SDK/tools/lib/sdklib.jar \ com.android.sdklib.build.ApkBuilderMain它解释了不推荐使用 CLI(
ApkBuilderMain)而是直接调用 Java API(ApkBuilder)。 (如果你知道如何从命令行执行此操作,请更新此示例。) - 
优化 APK 的数据对齐( 推荐做法 ):
zipalign -f -v 4 app.apkUnalign app.apk 
安装并运行
- 
将应用安装到 Android 设备:
adb install -r app.apk - 
启动应用:
adb shell am start -n dom.domain/.SayingHello它应该运行并打个招呼。
 
就这样。这就是用基本的 Android 工具打招呼所需要的。
声明资源
此部分是可选的。简单的 hello world 应用程序不需要资源声明。如果你的应用程序不需要它们,那么你可以通过省略步骤 10 并从步骤 13 中删除对 res /目录的引用来稍微简化构建。
否则,这是一个如何声明资源以及如何引用它的简短示例。
- 
添加资源文件:
mkdir res/values touch res/values/values.xml内容:
<?xml version='1.0'?> <resources> <string name='appLabel'>Saying hello</string> </resources> - 
从 XML 清单引用资源。这是一种声明式的参考风格:
<!-- <application a:label='Saying hello'> --> <application a:label='@string/appLabel'> - 
从 Java 源引用相同的资源。这是一个必要的参考:
// v.setText( "Hello world" ); v.setText( "This app is called " + getResources().getString( R.string.appLabel )); - 
通过重建,重新安装和重新运行应用程序来测试上述修改(步骤 10-17)。
它应该重新启动并说“这个应用程序叫做 Saying hello”。
 
卸载应用程序
adb uninstall dom.domain