You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的复杂范式让人头疼,但你可以只保留核心配置,避免冗余功能,实现轻量命令行构建:

  1. 在项目根目录创建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
        }
    }
}
  1. 创建settings.gradle:
rootProject.name = "HelloWorld"
  1. 执行构建命令:
./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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:27:51