沒有 IDE 的 Android 程式設計

這是一個極簡主義的 Hello World 示例 ,僅使用最基本的 Android 工具。

要求和假設

  • Oracle JDK 1.7 或更高版本
  • Android SDK 工具(只是命令列工具

這個例子假設 Linux。你可能必須調整自己平臺的語法。

設定 Android SDK

解壓縮 SDK 版本後:

  1. 使用 SDK 管理器安裝其他軟體包。不要按照繫結的 Readme.txt 中的說明使用 android update sdk --no-ui; 它下載了大約 30 GB 的不必要檔案。而是使用互動式 SDK 管理器 android sdk 來獲得建議的最小包。

  2. 將以下 JDK 和 SDK 目錄附加到執行 PATH。這是可選的,但下面的說明假定它。

    • JDK / bin 中
    • SDK /平臺的工具
    • SDK /工具
    • SDK / build-tools / LATEST (在步驟 1 中安裝)
  3. 建立 Android 虛擬裝置。使用互動式 AVD 管理器(android avd)。你可能需要調整一下並尋求建議; 在現場的指令並不總是有益的。

    (你也可以使用自己的裝置)

  4. 執行裝置:

    emulator -avd DEVICE
    
  5. 如果裝置螢幕似乎已鎖定,則滑動以將其解鎖。

    在編寫應用程式時讓它保持執行。

編寫應用程式

  1. 切換到空工作目錄。

  2. 製作原始檔:

    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 );
        }
    }
    
  3. 新增清單:

    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>
    
  4. 為宣告的資源建立一個子目錄:

    mkdir res
    

    暫時把它留空。

構建程式碼

  1. 生成資源宣告的源。在這裡替換 SDK 的正確路徑,以及要構建的已安裝 API (例如“android-23”):

    aapt package -f \
      -I SDK/platforms/android-API/android.jar \
      -J src -m \
      -M AndroidManifest.xml -S res -v
    

    資源宣告(下面進一步描述)實際上是可選的。同時,如果 res /仍為空,則上述呼叫不執行任何操作。

  2. 將原始碼編譯為 Java 位元組碼(.java→.class):

    javac \
      -bootclasspath SDK/platforms/android-API/android.jar \
      -classpath src -source 1.7 -target 1.7 \
      src/dom/domain/*.java
    
  3. 將位元組碼從 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 編譯是有好處的。它是一個更好的已知,更好的文件和更廣泛適用的工具。

  4. 打包資原始檔,包括清單:

    aapt package -f \
      -F app.apkPart \
      -I SDK/platforms/android-API/android.jar \
      -M AndroidManifest.xml -S res -v
    

    這導致部分 APK 檔案(Android 應用程式包)。

  5. 使用 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。” 如果 --helpArrayIndexOutOfBoundsException 失敗,那麼不傳遞任何引數:

    java -classpath SDK/tools/lib/sdklib.jar \
      com.android.sdklib.build.ApkBuilderMain
    

    它解釋了不推薦使用 CLI(ApkBuilderMain)而是直接呼叫 Java API(ApkBuilder)。 (如果你知道如何從命令列執行此操作,請更新此示例。)

  6. 優化 APK 的資料對齊( 推薦做法 ):

    zipalign -f -v 4 app.apkUnalign app.apk
    

安裝並執行

  1. 將應用安裝到 Android 裝置:

    adb install -r app.apk
    
  2. 啟動應用:

    adb shell am start -n dom.domain/.SayingHello
    

    它應該執行並打個招呼。

就這樣。這就是用基本的 Android 工具打招呼所需要的。

宣告資源

此部分是可選的。簡單的 hello world 應用程式不需要資源宣告。如果你的應用程式不需要它們,那麼你可以通過省略步驟 10 並從步驟 13 中刪除對 res /目錄的引用來稍微簡化構建。

否則,這是一個如何宣告資源以及如何引用它的簡短示例。

  1. 新增資原始檔:

    mkdir res/values
    touch res/values/values.xml
    

    內容:

    <?xml version='1.0'?>
    <resources>
        <string name='appLabel'>Saying hello</string>
    </resources>
    
  2. 從 XML 清單引用資源。這是一種宣告式的參考風格:

    <!-- <application a:label='Saying hello'> -->
         <application a:label='@string/appLabel'>
    
  3. 從 Java 源引用相同的資源。這是一個必要的參考:

    // v.setText( "Hello world" );
       v.setText( "This app is called "
         + getResources().getString( R.string.appLabel ));
    
  4. 通過重建,重新安裝和重新執行應用程式來測試上述修改(步驟 10-17)。

    它應該重新啟動並說“這個應用程式叫做 Saying hello”。

解除安裝應用程式

adb uninstall dom.domain

也可以看看