总体流程涉及五个工具,也即5个步骤:
javac – compile Java code
d8 – convert .class to .dex (Google's DEX compiler)
aapt2 – compile and link resources
zipalign – align the APK
apksigner – sign the APK
MyApp/
├── src/
│ └── com/example/app/MainActivity.java
├── res/
│ └── values/
│ └── strings.xml
│ └── layout/
│ └── activity_main.xml
│ └── mipmap/
│ └── icon.png
├── assets/test.txt
├── AndroidManifest.xml
└── build/
Set environment variables:
# You have to have this version of JDK, otherwise it won't work
# To install this version of JDK, you can use `apt install openjdk-8-jdk`
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export NDK_VERSION="27.3.13750724"
export PLATFORM_VERSION_NUMBER="34"
export PLATFORM_VERSION="android-${PLATFORM_VERSION_NUMBER}"
export CMAKE_VERSION="4.1.0"
export BUILD_TOOLS_VERSION="34.0.0"
export ANDROID_HOME=$HOME/bin/android-sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/$NDK_VERSION
export ANDROID_NDK_ROOT=$ANDROID_NDK_HOME
export ANDROID_SDK=$ANDROID_HOME
echo "ANDROID_HOME=$ANDROID_HOME"
Download build tools:
export URL_CLITOOLS=https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip
export TMPFILE="$HOME/temp.zip"
[[ -d $ANDROID_HOME ]] || mkdir -p $ANDROID_HOME && wget --quiet ${URL_CLITOOLS} -O ${TMPFILE} \
&& unzip -d ${ANDROID_HOME} ${TMPFILE} \
&& rm ${TMPFILE}
Install SDK, NDK and other tools:
yes | $ANDROID_HOME/tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} --licenses \
&& $ANDROID_HOME/tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${BUILD_TOOLS_VERSION}" "cmake;${CMAKE_VERSION}" "ndk;${NDK_VERSION}" "platform-tools" "platforms;${PLATFORM_VERSION}" "tools"
mkdir -p build/classes
javac -source 1.7 -target 1.7 \
-bootclasspath $ANDROID_HOME/platforms/${PLATFORM_VERSION}/android.jar \
-d build/classes \
src/com/example/app/*.java
mkdir -p build/dex
find build/classes -name "*.class" -print0 | xargs -0 $ANDROID_HOME/build-tools/${BUILD_TOOLS_VERSION}/d8 \
--lib $ANDROID_HOME/platforms/android-34/android.jar \
--output build/dex
mkdir -p build/res-compiled
$ANDROID_HOME/build-tools/${BUILD_TOOLS_VERSION}/aapt2 compile \
--dir res \
-o build/res-compiled/
mkdir -p build/apk
$ANDROID_HOME/build-tools/${BUILD_TOOLS_VERSION}/aapt2 link \
--manifest AndroidManifest.xml \
-I $ANDROID_HOME/platforms/${PLATFORM_VERSION}/android.jar \
--auto-add-overlay \
--java build/gen \
--no-version-vectors \
-o build/apk/app-unaligned.apk \
--allow-reserved-package-id \
--package-id 0x7f \
build/res-compiled/*.flat
cd build/dex
zip -g ../apk/app-unaligned.apk classes.dex
cd ../..
find assets -type f -exec zip myapp.apk {} \;
for how to build native library, refer to this page
cd build/native_lib
mkdir -p lib/arm64-v8a
mv libmain.so lib/arm64-v8a
zip -g ../apk/app-unaligned.apk lib/arm64-v8a/libmain.so
cd ../..
$ANDROID_HOME/build-tools/34.0.0/zipalign \
-f 4 \
build/apk/app-unaligned.apk \
build/apk/app-aligned.apk
keytool -genkeypair \
-alias mykey \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
-keystore mykey.jks \
-storepass android \
-keypass android \
-dname "CN=,OU=,O=,L=,S=,C=US"
$ANDROID_HOME/build-tools/34.0.0/apksigner sign \
--key-pass pass:android \
--ks-pass pass:android \
--ks mykey.jks \
--out build/apk/app-signed.apk \
build/apk/app-aligned.apk
adb install build/apk/app-signed.apk