没有IDE的Android编程
示例
这是一个简约的HelloWorld示例,仅使用最基本的Android工具。
要求和假设
OracleJDK1.7或更高版本
AndroidSDK工具(仅命令行工具)
本示例假设使用Linux。您可能必须针对自己的平台调整语法。
设置AndroidSDK
解压缩SDK版本后:
使用SDK管理器安装其他软件包。不要androidupdatesdk--no-ui按照捆绑的Readme.txt中的说明使用;它会下载约30GB的不必要文件。而是使用交互式SDK管理器androidsdk来获取建议的最少软件包。
将以下JDK和SDK目录添加到您的执行PATH。这是可选的,但是下面的说明假定了它。
JDK/箱
SDK/平台工具
SDK/工具
SDK/build-tools/LATEST(在步骤1中安装)
创建一个Android虚拟设备。使用交互式AVD管理器(androidavd)。您可能需要摆弄一些东西并寻求建议。现场说明并不总是有用。
(您也可以使用自己的设备)
运行设备:
emulator-avdDEVICE
如果设备屏幕似乎被锁定,请滑动以将其解锁。
在编写应用程序代码时,使其保持运行状态。
编写应用程式
转到一个空的工作目录。
制作源文件:
mkdir--parentssrc/dom/domain
touchsrc/dom/domain/SayingHello.java
内容:
packagedom.domain;
importandroid.widget.TextView;
publicfinalclassSayingHelloextendsandroid.app.Activity
{
protected@OverridevoidonCreate(finalandroid.os.BundleactivityState)
{
super.onCreate(activityState);
finalTextViewtextV=newTextView(SayingHello.this);
textV.setText("Helloworld");
setContentView(textV);
}
}
添加清单:
touchAndroidManifest.xml
内容:
<?xmlversion='1.0'?>
<manifestxmlns:a='http://schemas.android.com/apk/res/android'
package='dom.domain'a:versionCode='0'a:versionName='0'>
<applicationa:label='Sayinghello'>
<activitya:name='dom.domain.SayingHello'>
<intent-filter>
<categorya:name='android.intent.category.LAUNCHER'/>
<actiona:name='android.intent.action.MAIN'/>
</intent-filter>
</activity>
</application>
</manifest>
为声明的资源创建一个子目录:
mkdirres
现在将其留空。
构建代码
生成资源声明的源。在此处替换您的SDK的正确路径,以及要针对其构建的已安装API(例如“android-23”):
aaptpackage-f\
-ISDK/platforms/android-API/android.jar\
-Jsrc-m\
-MAndroidManifest.xml-Sres-v
资源声明(下面将进一步描述)实际上是可选的。同时,如果res/仍然为空,则上述调用不执行任何操作。
将源代码编译为Java字节码(.java→.class):
javac\
-bootclasspathSDK/platforms/android-API/android.jar\
-classpathsrc-source1.7-target1.7\
src/dom/domain/*.java
将字节码从Java转换为Android(.class→.dex):
首先使用Jill(.class→.jayce):
java-jarSDK/build-tools/LATEST/jill.jar\
--outputclasses.jaycesrc
然后杰克(.jayce→.dex):
java-jarSDK/build-tools/LATEST/jack.jar\
--importclasses.jayce--output-dex.
Android字节码曾经被称为“Dalvik可执行代码”,因此被称为“dex”。
如果愿意,您可以只打一个电话就可以替换步骤11和12。它可以直接从Java源代码(.java→.dex)进行编译。但是使用进行编译有很多好处javac。这是一个更广为人知,文档更丰富,适用范围更广的工具。
打包资源文件,包括清单:
aaptpackage-f\
-Fapp.apkPart\
-ISDK/platforms/android-API/android.jar\
-MAndroidManifest.xml-Sres-v
这样会产生部分APK文件(Android应用程序包)。
使用以下ApkBuilder工具制作完整的APK:
java-classpathSDK/tools/lib/sdklib.jar\
com.android.sdklib.build.ApkBuilderMain\
app.apkUnalign\
-d-fclasses.dex-v-zapp.apkPart
它警告:“此工具已弃用。有关更多信息,请参见--help。”如果使用--help失败ArrayIndexOutOfBoundsException,则不传递任何参数:
java-classpathSDK/tools/lib/sdklib.jar\
com.android.sdklib.build.ApkBuilderMain
它说明了ApkBuilderMain不建议使用CLI(),而是直接调用JavaAPI(ApkBuilder)。(如果您知道如何从命令行执行此操作,请更新此示例。)
优化APK的数据对齐方式(建议做法):
zipalign-f-v4app.apkUnalignapp.apk
安装和运行
将应用安装到Android设备:
adbinstall-rapp.apk
启动应用程序:
adbshellamstart-ndom.domain/.SayingHello
它应该运行并打个招呼。
就这样。这就是使用基本的Android工具打招呼所需要的。
声明资源
本部分是可选的。简单的“helloworld”应用程序不需要资源声明。如果您的应用程序也不需要它们,那么您可以通过省略步骤10并从步骤13中删除对res/目录的引用来简化构建。
否则,这是有关如何声明资源以及如何引用资源的简短示例。
添加资源文件:
mkdirres/values
touchres/values/values.xml
内容:
<?xmlversion='1.0'?>
<resources>
<stringname='appLabel'>Sayinghello</string>
</resources>
从XML清单中引用资源。这是一种声明式的引用方式:
<!--<applicationa:label='Sayinghello'>-->
<applicationa:label='@string/appLabel'>
从Java源引用相同的资源。这是必须的参考:
//v.setText("Helloworld");
v.setText("这个程序叫做"
+getResources().getString(R.string.appLabel));
通过重建,重新安装和重新运行该应用程序来测试上述修改(步骤10-17)。
它应该重新启动并说:“此应用程序称为“打招呼”。
卸载应用
adb uninstall dom.domain
也可以看看
原始问题-提示此示例的原始问题
工作示例-使用上述命令的有效构建脚本