Android App 開發 SOP

從零開始建立 Hello World Android App(無需 Android Studio)
最後更新:2026-10-15

你需要準備的東西:一台 Linux 主機(或 EC2)、Java 17+、Android SDK

完成後你會有:一個可安裝的 Android APK(Hello World App)

預估時間:約 30 分鐘(含下載依賴)

目錄
  1. Phase 1 — 環境準備(Java & Android SDK)
  2. Phase 2 — 建立專案結構
  3. Phase 3 — 設定 Gradle 建置檔
  4. Phase 4 — 撰寫 App 程式碼
  5. Phase 5 — 編譯 & 產生 APK
  6. 疑難排解

Phase 1 — 環境準備(Java & Android SDK)

安裝編譯 Android App 所需的 Java JDK 和 Android SDK Command-line Tools。
1 安裝 Java 17
# 安裝 OpenJDK 17
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk

# 確認版本
java -version
javac -version

應該看到類似 openjdk version "17.x.x" 的輸出。

✓ 完成後你有了 Java 17 編譯環境
2 安裝 Android SDK(Command-line Tools)
# 建立 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
3 安裝必要的 SDK 元件
# 接受所有授權
yes | sdkmanager --licenses

# 安裝 Platform(API 34)和 Build Tools
sdkmanager "platforms;android-34" "build-tools;34.0.0" "platform-tools"
✓ 完成後你有了完整的 Android 編譯工具鏈

Phase 2 — 建立專案結構

建立 Android 專案的標準目錄結構,這個結構和 Android Studio 建立的專案相同。
4 建立目錄結構
# 建立專案根目錄
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

Phase 3 — 設定 Gradle 建置檔

Gradle 是 Android 的建置工具,需要設定根專案和 app 模組的建置腳本。
5 根目錄設定檔

settings.gradle.kts

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "HelloWorld"
include(":app")

build.gradle.kts(根目錄)

plugins {
    id("com.android.application") version "8.2.2" apply false
}

gradle.properties

org.gradle.jvmargs=-Xmx2048m
android.useAndroidX=true
6 App 模組設定檔

app/build.gradle.kts

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")
}
7 設定 Gradle Wrapper

gradle/wrapper/gradle-wrapper.properties

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-wrapper.jar

從 Gradle 官方 GitHub 下載:

wget -O gradle/wrapper/gradle-wrapper.jar \
  https://raw.githubusercontent.com/gradle/gradle/v8.5.0/gradle/wrapper/gradle-wrapper.jar

gradlew(Wrapper 啟動腳本)

重要:不要用簡化版的 gradlew 腳本!
常見的錯誤寫法如下,會導致 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 不行?
✓ 完成後 Gradle Wrapper 設定正確,可以執行 ./gradlew

Phase 4 — 撰寫 App 程式碼

撰寫最基本的 Android App:一個顯示 Hello World 的畫面。
8 AndroidManifest.xml

放在 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>
9 MainActivity.java

放在 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);
    }
}
10 Layout & Resources

app/src/main/res/layout/activity_main.xml

<?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>

app/src/main/res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Hello World</string>
    <string name="hello_world">Hello World!</string>
</resources>
✓ 完成後所有原始碼都就位了

Phase 5 — 編譯 & 產生 APK

使用 Gradle Wrapper 編譯專案,產生可安裝的 debug APK。
11 編譯 Debug APK
# 確認在專案根目錄
cd ~/hello_world

# 執行 debug 編譯
./gradlew assembleDebug

第一次執行會下載 Gradle 8.5 distribution 和所有依賴(約 5~10 分鐘),之後再跑就很快了。

看到 BUILD SUCCESSFUL 就成功了。

APK 產出位置:

app/build/outputs/apk/debug/app-debug.apk
✓ 完成後你得到了一個可安裝到 Android 手機的 APK
12 安裝到手機(可選)

方法 A:使用 ADB(手機接 USB)

adb install app/build/outputs/apk/debug/app-debug.apk

方法 B:傳到手機後手動安裝

把 app-debug.apk 透過 Email、雲端硬碟或傳輸線傳到手機,打開檔案即可安裝。

手機需要開啟「允許安裝未知來源 App」的設定。
恭喜!你的 Android Hello World App 已經編譯完成!
你可以在這個基礎上繼續開發,修改 layout、加入新的 Activity 或功能。

專案架構圖


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 名稱等)

疑難排解

Q: ./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 有沒有設定都能正常運作。

Q: ANDROID_HOME 未設定

# 確認環境變數
echo $ANDROID_HOME

# 如果是空的,手動設定(根據你安裝的位置)
export ANDROID_HOME=~/android-sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools

Q: 編譯報 SDK location not found

在專案根目錄建立 local.properties 檔:

echo "sdk.dir=$ANDROID_HOME" > local.properties

Q: 編譯時記憶體不足(OOM)

調整 gradle.properties 中的 JVM 記憶體:

org.gradle.jvmargs=-Xmx4096m

Q: 如何清除編譯快取重新編譯?

# 清除所有編譯產出
./gradlew clean

# 清除後重新編譯
./gradlew clean assembleDebug

全部指令總整理(懶人複製貼上版)

從頭到尾在 SSH 中依序執行,即可在 Linux 主機上編譯出一個 Hello World Android APK。
# ============================
# 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