没有 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