android 如何使用 command 產生 .apk 檔案

在 Android 開發中,現在大多使用 Gradle 來處理編譯。如果你已經有專案原始碼,可以直接在專案根目錄使用 ./gradlew 指令。這是最常見也最推薦的做法。

使用 Gradle Wrapper 編譯

Gradle Wrapper 是一個腳本。它能確保專案在不同機器上使用相同的 Gradle 版本。打開終端機並切換到專案路徑,執行以下指令:

./gradlew assembleDebug

這個指令會編譯出一個用於測試的 Debug 版本 APK。如果你需要正式上架的版本,則改用:

./gradlew assembleRelease

執行成功後,產出的檔案通常會放在 app/build/outputs/apk/ 目錄下。你會在裡面看到 debug 或 release 資料夾,副檔名就是 .apk。


常用指令與路徑

如果你的環境是 Windows,指令要改成 gradlew.bat assembleDebug。在執行編譯前,建議先清理舊的暫存檔:

./gradlew clean assembleDebug

這樣可以避免舊的檔案影響新的編譯結果。如果你的專案有多個不同的 Product Flavors,你可以用 ./gradlew tasks 查看所有可用的編譯指令。


關於 AAB 格式

現在 Google Play 要求上架必須使用 .aab 格式。如果你是為了上架準備,指令會稍微不同:

./gradlew bundleRelease

這會產生 Android App Bundle 檔案。位置在 app/build/outputs/bundle/release/ 之下。這比傳統的 APK 能提供更小的下載體積。


如果修改了 keystore 的存放路徑,最直接的調整位置是在專案中的 build.gradle 檔案。通常這個檔案位於 app 目錄下。你需要找到 signingConfigs 區塊。

修改 build.gradle 設定

在 signingConfigs 裡面,有一個屬性叫做 storeFile。你需要把後面的路徑指向新的位置。如果路徑是相對路徑,它是以專案根目錄為基準。

android {
    signingConfigs {
        release {
            storeFile file('/新的路徑/my-release-key.jks')
            storePassword '你的密碼'
            keyAlias '你的別名'
            keyPassword '你的密碼'
        }
    }
}

建議把路徑寫成相對路徑。例如 file(‘../keystores/release.jks’)。這樣換一台電腦開發時,只要相對位置正確,就不會出錯。


使用 gradle.properties 管理

為了安全與方便,很多人會把路徑寫在 gradle.properties 檔案裡。這樣就不會把私密路徑寫死在程式碼。你可以打開 gradle.properties 調整變數值。

MYAPP_RELEASE_STORE_FILE=/新的路徑/my-release-key.jks

然後在 build.gradle 引用這個變數。改完後記得執行一次 ./gradlew clean。這能確保 Gradle 抓到最新的路徑設定。


檢查環境變數

有些團隊會把路徑放在系統環境變數。如果你的設定是透過 System.getenv 取得。那你就要去修改作業系統的環境設定。修改完後可能需要重啟終端機或 IDE 才會生效。


build.gradle 引用 gradle.properties 的變數很簡單。Gradle 會自動將 properties 檔案中的屬性載入。

引用變數的方式

假設你在 gradle.properties 設定了變數名為 MYAPP_RELEASE_STORE_FILE。在 app/build.gradle 裡,你可以直接像這樣寫:

android {
    signingConfigs {
        release {
            // 直接使用變數名稱即可
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }
    }
}

使用專案屬性檢查

有時候為了保險,會建議使用 project.hasProperty 來檢查變數是否存在。這樣即使變數沒設定,編譯也不會直接噴錯。這在多人協作時很好用。

Gradle

storeFile file(project.hasProperty('MYAPP_RELEASE_STORE_FILE') ? MYAPP_RELEASE_STORE_FILE : "default_path.jks")

關於路徑的提醒

如果你在變數中寫的是相對路徑,它是相對於專案根目錄。如果你希望路徑更靈活,可以搭配 rootDir 變數來組合:

Gradle

storeFile file("${rootDir}/keystores/${MYAPP_RELEASE_STORE_FILE}")

這樣無論在哪個層級的 gradle 檔引用,路徑都不會跑掉。改完設定後,建議執行 ./gradlew assembleRelease 測試看看能不能成功讀取。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *