從零開始建立 Hello World Android App(無需 Android Studio)
最後更新:2026-10-15
你需要準備的東西:一台 Linux 主機(或 EC2)、Java 17+、Android SDK
完成後你會有:一個可安裝的 Android APK(Hello World App)
預估時間:約 30 分鐘(含下載依賴)
# 安裝 OpenJDK 17
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk
# 確認版本
java -version
javac -version
應該看到類似 openjdk version "17.x.x" 的輸出。
# 建立 SDK 目錄
mkdir -p ~/android-sdk/cmdline-tools
# 下載 Android Command-line Tools(Linux 版)
cd /tmp
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
# 解壓並放到正確位置
unzip commandlinetools-linux-11076708_latest.zip
mv cmdline-tools ~/android-sdk/cmdline-tools/latest
# 設定環境變數(加到 ~/.bashrc)
cat >> ~/.bashrc << 'EOF'
export ANDROID_HOME=~/android-sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
EOF
source ~/.bashrc
# 接受所有授權
yes | sdkmanager --licenses
# 安裝 Platform(API 34)和 Build Tools
sdkmanager "platforms;android-34" "build-tools;34.0.0" "platform-tools"
# 建立專案根目錄
mkdir -p ~/hello_world
cd ~/hello_world
# 建立 app 模組的 src 目錄
mkdir -p app/src/main/java/com/example/helloworld
mkdir -p app/src/main/res/layout
mkdir -p app/src/main/res/values
# 建立 Gradle wrapper 目錄
mkdir -p gradle/wrapper
完成後的目錄結構:
hello_world/
├── app/
│ ├── build.gradle.kts
│ └── src/main/
│ ├── AndroidManifest.xml
│ ├── java/com/example/helloworld/
│ │ └── MainActivity.java
│ └── res/
│ ├── layout/activity_main.xml
│ └── values/strings.xml
├── build.gradle.kts
├── settings.gradle.kts
├── gradle/wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradle.properties
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "HelloWorld"
include(":app")
plugins {
id("com.android.application") version "8.2.2" apply false
}
org.gradle.jvmargs=-Xmx2048m
android.useAndroidX=true
plugins {
id("com.android.application")
}
android {
namespace = "com.example.helloworld"
compileSdk = 34
defaultConfig {
applicationId = "com.example.helloworld"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
}
buildTypes {
release {
isMinifyEnabled = false
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
dependencies {
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
}
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
從 Gradle 官方 GitHub 下載:
wget -O gradle/wrapper/gradle-wrapper.jar \
https://raw.githubusercontent.com/gradle/gradle/v8.5.0/gradle/wrapper/gradle-wrapper.jar
no main manifest attribute 錯誤:
# 錯誤寫法 — 不要用這個!
#!/bin/sh
exec java -jar "$(dirname "$0")/gradle/wrapper/gradle-wrapper.jar" "$@"
原因:gradle-wrapper.jar 的 MANIFEST.MF 中可能缺少 Main-Class 屬性,
使用 java -jar 會因為找不到進入點而失敗。
正確寫法:使用 -classpath 並明確指定主類別:
#!/bin/sh
APP_HOME=$(cd "$(dirname "$0")" && pwd)
CLASSPATH="$APP_HOME/gradle/wrapper/gradle-wrapper.jar"
exec java -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
建立後記得加上執行權限:
chmod +x gradlew
-classpath 可以但 -jar 不行?
java -jar 需要 JAR 的 META-INF/MANIFEST.MF 中有 Main-Class 屬性gradle-wrapper.jar(或自行打包的)可能只有 Implementation-Title 而缺少 Main-Classjava -classpath ... org.gradle.wrapper.GradleWrapperMain 直接指定入口類別,繞過 manifest 限制./gradlew放在 app/src/main/AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
放在 app/src/main/java/com/example/helloworld/MainActivity.java:
package com.example.helloworld;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:textSize="24sp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hello World</string>
<string name="hello_world">Hello World!</string>
</resources>
# 確認在專案根目錄
cd ~/hello_world
# 執行 debug 編譯
./gradlew assembleDebug
第一次執行會下載 Gradle 8.5 distribution 和所有依賴(約 5~10 分鐘),之後再跑就很快了。
看到 BUILD SUCCESSFUL 就成功了。
APK 產出位置:
app/build/outputs/apk/debug/app-debug.apk
方法 A:使用 ADB(手機接 USB)
adb install app/build/outputs/apk/debug/app-debug.apk
方法 B:傳到手機後手動安裝
把 app-debug.apk 透過 Email、雲端硬碟或傳輸線傳到手機,打開檔案即可安裝。
hello_world/ ← 專案根目錄
│
├── build.gradle.kts ← 根建置腳本(宣告 Android plugin 版本)
├── settings.gradle.kts ← 專案設定(模組名稱、Repository)
├── gradle.properties ← Gradle 全域設定(JVM 記憶體等)
├── gradlew ← Gradle Wrapper 啟動腳本(Linux/Mac)
│
├── gradle/wrapper/
│ ├── gradle-wrapper.jar ← Wrapper 引導程式(下載 Gradle)
│ └── gradle-wrapper.properties ← 指定 Gradle 版本 & 下載來源
│
└── app/ ← App 模組
├── build.gradle.kts ← App 建置腳本(SDK 版本、依賴)
└── src/main/
├── AndroidManifest.xml ← App 的「身分證」(Activity 宣告等)
├── java/.../
│ └── MainActivity.java ← 主畫面邏輯
└── res/
├── layout/
│ └── activity_main.xml ← 畫面 UI 排版
└── values/
└── strings.xml ← 文字資源(App 名稱等)
./gradlew 報 no main manifest attribute原因:gradlew 腳本使用 java -jar 執行 gradle-wrapper.jar,但 JAR 檔的 META-INF/MANIFEST.MF 缺少 Main-Class 屬性。
診斷方式:
# 檢查 JAR 的 manifest
unzip -p gradle/wrapper/gradle-wrapper.jar META-INF/MANIFEST.MF
如果只看到 Implementation-Title: Gradle Wrapper 而沒有 Main-Class,就是這個問題。
修正方式:修改 gradlew,改用 -classpath 並直接指定入口類別:
#!/bin/sh
APP_HOME=$(cd "$(dirname "$0")" && pwd)
CLASSPATH="$APP_HOME/gradle/wrapper/gradle-wrapper.jar"
exec java -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
gradle-wrapper.jar(從 Gradle 官方下載的)應該有 Main-Class: org.gradle.wrapper.GradleWrapperMain。
如果你的 JAR 沒有這個屬性,可能是手動打包時遺漏了,或從非官方來源取得。
使用 -classpath 是最穩定的做法,無論 manifest 有沒有設定都能正常運作。
ANDROID_HOME 未設定# 確認環境變數
echo $ANDROID_HOME
# 如果是空的,手動設定(根據你安裝的位置)
export ANDROID_HOME=~/android-sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools
SDK location not found在專案根目錄建立 local.properties 檔:
echo "sdk.dir=$ANDROID_HOME" > local.properties
調整 gradle.properties 中的 JVM 記憶體:
org.gradle.jvmargs=-Xmx4096m
# 清除所有編譯產出
./gradlew clean
# 清除後重新編譯
./gradlew clean assembleDebug
# ============================
# Step 1: 安裝 Java 17
# ============================
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk
# ============================
# Step 2: 安裝 Android SDK
# ============================
mkdir -p ~/android-sdk/cmdline-tools
cd /tmp
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
unzip commandlinetools-linux-11076708_latest.zip
mv cmdline-tools ~/android-sdk/cmdline-tools/latest
export ANDROID_HOME=~/android-sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools
yes | sdkmanager --licenses
sdkmanager "platforms;android-34" "build-tools;34.0.0" "platform-tools"
# ============================
# Step 3: 建立專案 & 編譯
# ============================
cd ~/hello_world
chmod +x gradlew
./gradlew assembleDebug
# ============================
# Step 4: 取得 APK
# ============================
ls -lh app/build/outputs/apk/debug/app-debug.apk