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