Android命令行开发困境:寻求CMake/Meson等构建工具解决方案
命令行构建Android Hello World应用的可行方案
先解答你的疑惑:APK为何比Jar构建流程繁琐
APK本质上确实包含类似Jar的Dex文件,但它还需要处理大量Android专属环节:
- 必须包含
AndroidManifest.xml,定义应用权限、组件、配置等核心元信息 - 资源文件(布局、字符串、图片等)需要通过
aapt编译为二进制格式,而非直接打包 - Java代码要编译成Dalvik/ART可执行的Dex格式,而非普通Java字节码
- 最终APK必须签名才能安装到设备或发布
- 若包含Native代码,还要处理多架构编译、打包等额外步骤
这些专属流程导致APK构建比普通Jar复杂得多,不是简单的文件打包就能完成。
方案1:用Android SDK自带工具手动构建(纯命令行,无需Gradle/IDE)
以下是构建最小Hello World应用的完整步骤:
1. 准备目录结构和基础文件
创建如下目录:
helloworld/ ├── res/ │ └── values/ │ └── strings.xml ├── src/ │ └── com/ │ └── example/ │ └── helloworld/ │ └── MainActivity.java └── AndroidManifest.xml
AndroidManifest.xml内容:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloworld"> <application android:allowBackup="true" android:label="@string/app_name"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
res/values/strings.xml内容:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">HelloWorld</string> </resources>
MainActivity.java内容:
package com.example.helloworld; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello World!"); setContentView(tv); } }
2. 执行构建命令
假设ANDROID_HOME已指向你的Android SDK目录,目标API级别为34:
- 编译资源,生成R.java:
aapt package -f -m -J src -S res -M AndroidManifest.xml -I $ANDROID_HOME/platforms/android-34/android.jar - 编译Java代码到字节码:
mkdir -p bin javac -d bin -classpath $ANDROID_HOME/platforms/android-34/android.jar src/com/example/helloworld/*.java src/com/example/helloworld/R.java - 将字节码转换为Dex格式:
mkdir -p dist d8 bin/com/example/helloworld/*.class --lib $ANDROID_HOME/platforms/android-34/android.jar --output dist - 打包资源和Dex为未签名APK:
aapt package -f -M AndroidManifest.xml -S res -I $ANDROID_HOME/platforms/android-34/android.jar -F dist/unsigned.apk dist - 签名APK(先用keytool生成密钥库,再签名):
keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias apksigner sign --ks my-release-key.jks dist/unsigned.apk
完成后,dist/unsigned.apk就是可安装的签名APK。
方案2:用极简Gradle配置实现命令行构建
虽然Gradle的复杂范式让人头疼,但你可以只保留核心配置,避免冗余功能,实现轻量命令行构建:
- 在项目根目录创建
build.gradle:
plugins { id 'com.android.application' } android { namespace 'com.example.helloworld' compileSdk 34 defaultConfig { applicationId "com.example.helloworld" minSdk 21 targetSdk 34 versionCode 1 versionName "1.0" } buildTypes { debug { debuggable true } } }
- 创建
settings.gradle:
rootProject.name = "HelloWorld"
- 执行构建命令:
./gradlew assembleDebug
构建完成后,APK会生成在app/build/outputs/apk/debug/app-debug.apk,Gradle会自动处理所有资源编译、Dex转换、签名等步骤,比手动敲命令更可靠,也方便后续扩展。
关于CMake/Meson的使用建议
CMake和Meson对Android的支持主要集中在Native(C/C++)代码构建上,纯Java/Kotlin应用用它们并不合适——因为它们无法很好地处理Android的资源编译、Dex转换等Java生态专属步骤。如果你的项目未来会包含Native代码,可以用CMake配合NDK构建Native部分,再通过Gradle或手动命令将Native库打包进APK,但纯Java应用没必要硬套这类工具。
内容的提问来源于stack exchange,提问作者SmittyBoy
相关产品推荐
相关产品推荐

