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

也可以看看