由于 Jack 和 Jill 已经过时,我不得不修改一些命令。
安装了/a中的sdk,ndk(这个hello world没有用到ndk),系统中的jdk,/usr/bin中的android-tools-adb等(这个包含adb和fastboot和电话定义,以便它可以检测到它们)。
我将此添加到.bashrc:
export JAVA_HOME=/usr/lib64/java
export ANDROID_HOME=/a
export ANDROID_PLATFORM=$ANDROID_HOME/platforms/android-23
export ANDROID_BUILD_TOOLS=$ANDROID_HOME/build-tools/28.0.0-rc1
export ANDROID_NDK=$ANDROID_HOME/ndk
export ANDROID_TOOLS=$ANDROID_HOME/tools # sdk tools
PATH=$PATH:$JAVA_HOME/bin:$ANDROID_HOME:$ANDROID_BUILD_TOOLS:$ANDROID_NDK:$ANDROID_TOOLS:$ANDROID_TOOLS/bin:$ANDROID_PLATFORM
这是我修改后的命令:
sdkmanager --list
sdkmanager "platforms;android-23"
sdkmanager platform-tools
mkdir /a/prj
cd /a/prj
mkdir --parents src/dom/domain
vi 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 );
}
}
vi 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>
如果选择改用res/目录,修改源代码和AndroidManifest.xml如下图:
# this section is OPTIONAL , the hello world can run without any res
mkdir res/values -p
vi res/values/values.xml
<?xml version='1.0'?>
<resources>
<string name='appLabel'>Saying hello</string>
</resources>
# Reference the resource from the AndroidManifest.xml manifest.
vi AndroidManifest.xml
<!-- <application a:label='Saying hello'> --> <!-- edit this -->
<application a:label='@string/appLabel'>
vi src/dom/domain/SayingHello.java
// v.setText( "Hello world" ); // edit this
v.setText( "This app is called "
+ getResources().getString( R.string.appLabel ));
# end OPTIONAL section
我还创建了一个构建脚本,buildprj:
#!/bin/bash
#Generate the source for the resource declarations.
aapt package -f \
-I $ANDROID_PLATFORM/android.jar \
-J src -m \
-M AndroidManifest.xml -S res -v
#Compile the source code to Java bytecode (.java ニ .class)
javac \
-bootclasspath $ANDROID_PLATFORM/android.jar \
-classpath src -source 1.7 -target 1.7 \
src/dom/domain/*.java
#Translate the bytecode from Java to Android (.class ニ .dex)
dx --dex --output="classes.dex" src
#Package up the resource files, including the manifest
aapt package -f -F app.apkPart -I $ANDROID_PLATFORM/android.jar \
-M AndroidManifest.xml -S res -v
#Make the full APK using the ApkBuilder tool:
CLASSPATH=$ANDROID_TOOLS/lib/* java \
com.android.sdklib.build.ApkBuilderMain app.apkUnalign \
-d -f classes.dex -v -z app.apkPart
#Optimize the data alignment of the APK (recommended practice https://developer.android.com/studio/command-line/zipalign.html ):
zipalign -f -v 4 app.apkUnalign app.apk
adb install -r app.apk
adb shell am start -n dom.domain/.SayingHello
echo "To uninstall the app: adb uninstall dom.domain"
# cleanup
rm app.apkPart app.apkUnalign classes.dex
find . -name "*.class" -exec rm {} +
find . -name "R.java" -exec rm {} +
要运行构建脚本,只需调用它:
./buildprj # run the build script
在此过程中我遇到了一些陷阱:
java -classpath $ANDROID_TOOLS/lib/sdklib.jar \
com.android.sdklib.build.ApkBuilderMain \
app.apkUnalign \
-d -f classes.dex -v -z app.apkPart
it gave an error that didn't say "sdklib.jar doesn't exist/is not found"
Error: Could not find or load main class com.android.sdklib.build.ApkBuilderMain
... :(
cd /a/tools/lib/
ln -s sdklib-25.3.1.jar sdklib.jar
java -classpath $ANDROID_TOOLS/lib/sdklib.jar \
com.android.sdklib.build.ApkBuilderMain \
app.apkUnalign \
-d -f classes.dex -v -z app.apkPart
Exception in thread "main" java.lang.NoClassDefFoundError: com/android/prefs/AndroidLocatio
java -classpath $ANDROID_TOOLS/lib/sdklib.jar \
com.android.sdklib.build.ApkBuilderMain \
app.apkUnalign \
-d -f classes.dex -v -z app.apkPart --help
THIS TOOL IS DEPRECATED. See --help for more information.
Unknown argument: --help
哇...
无论如何,事实证明它只是在解释不推荐使用 CLI (ApkBuilderMain) 以支持直接调用 Java API (ApkBuilder)。如果您知道如何从命令行执行此操作,请更新此示例。更新:实际上从命令行似乎不可能做到这一点,所以警告有点奇怪......
"If --help fails with an ArrayIndexOutOfBoundsException, then instead pass no arguments:
java -classpath SDK/tools/lib/sdklib.jar \
com.android.sdklib.build.ApkBuilderMain
" all right...