Android Studio 和 Android Gradle 外掛程式的已知問題

本頁記錄 Android Studio Bumblebee 穩定版 (2021.1.1) 和 Android Gradle 外掛程式 7.1 的已知問題。如果您遇到此處未提及的問題,請回報錯誤

升級至預先發布版:每個版本的 Android Studio 和 Android Gradle 外掛程式都旨在提高穩定性和效能,並增加新功能。如要現在體驗新版本的優點,請下載並安裝 Android Studio 預先發布版

Android Studio 的已知問題

本節說明 Android Studio 最新穩定版本中存在的已知問題。

針對金鑰和 KeyStore 使用不同密碼時會發生錯誤

從 4.2 版開始,Android Studio 是透過 JDK 11 運作。這項更新造成與簽署金鑰相關的基礎行為異動。

當您依序前往「Build」>「Generate Signed Bundle / APK」,並嘗試為應用程式套件或 APK 進行應用程式簽署設定時,為金鑰和 KeyStore 輸入不同的密碼可能會導致以下錯誤:

Key was created with errors:
Warning: Different store and Key passwords not supported for PKCS12 Key stores

為了解決這個問題,請為金鑰和 KeyStore 輸入相同的密碼。

安裝 4.2 版後無法啟動 Android Studio

Studio 會嘗試匯入先前的「.vmoptions」並進行清理作業,以便與 JDK 11 所用的垃圾收集器搭配使用。如果這項程序執行失敗,在「.vmoptions」檔案中設定了自訂 VM 選項的某些使用者可能會無法啟動 IDE。

為了解決這個問題,建議您在「.vmoptions」中,使用「#」字元註解排除自訂選項。「.vmoptions」檔案位於以下位置:

Windows

C:\Users\YourUserName\AppData\[Local|Roaming]\Google\AndroidStudio4.2\studio64.exe.vmoptions

macOS

~/Library/Application Support/Google/AndroidStudio4.2/studio.vmoptions

Linux

~/.config/Google/AndroidStudio4.2/studio64.vmoptions

如果嘗試上述解決方法後,Studio 仍無法啟動,請參閱「Studio 在升級後無法啟動」一節。

使用資料庫檢查器的應用程式在 Android 11 模擬器上當機

使用資料庫檢查器的應用程式在 Android 11 模擬器上執行時可能會當機,並在 logcat 中顯示以下錯誤訊息:

 Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)

如要解決這個問題,請前往「Tools」>「SDK Manager」,將您的 Android 11 模擬器升級至 9 或以上版本。在「SDK Platforms」分頁中,勾選標示為「Show Package Details」的方塊,然後選取 Android 11 模擬器 9 或以上版本。

Studio 升級後無法於啟動

如果 Studio 在升級後無法啟動,可能是由於從舊版 Android Studio 匯入的 Android Studio 設定無效,或外掛程式不相容。如要解決這個問題,請嘗試根據 Android Studio 版本和作業系統刪除下方目錄 (或重新命名以便備份),然後重新啟動 Android Studio。這會將 Android Studio 重設為預設狀態,並移除所有第三方外掛程式。

Android Studio 4.1 及以上版本:

  • Windows:%APPDATA%\Google\AndroidStudio<version>
    範例:C:\Users\your_user_name\AppData\Roaming\Google\AndroidStudio4.1

  • macOS:~/Library/Application Support/Google/AndroidStudio<version>
    範例:~/Library/Application Support/Google/AndroidStudio4.1

  • Linux:~/.config/Google/AndroidStudio<version>~/.local/share/Google/AndroidStudio<version>
    範例:~/.config/Google/AndroidStudio4.1~/.local/share/Google/AndroidStudio4.1

Android Studio 4.0 及以下版本:

  • Windows:%HOMEPATH%\.AndroidStudio<version>\config
    範例:C:\Users\your_user_name\.AndroidStudio3.6\config

  • macOS:~/Library/Preferences/AndroidStudio<version>
    範例:~/Library/Preferences/AndroidStudio3.6

  • Linux:~/.AndroidStudio<version>/config
    範例:~/.AndroidStudio3.6/config

請注意,Android Studio Canary 版和 Beta 版的設定目錄是 PreviewX.Y,而不是用 X.Y 來表示 <version>。舉例來說,Android Studio 4.1 Canary 版使用的是 AndroidStudioPreview4.1,而不是用於候選版和穩定版 AndroidStudio4.1 目錄。

Kotlin 多平台專案中的編譯問題

Kotlin MPP 程式碼可能會因為缺少符號而出現編譯錯誤。將 Kotlin 外掛程式升級至 1.4 版即可解決這個問題。

Linux 上的機碼對應衝突

在 Linux 中,某些鍵盤快速鍵會與預設的 Linux 鍵盤快速鍵和常見的視窗管理工具 (例如 KDE 和 GNOME) 發生衝突。這些衝突的鍵盤快速鍵在 Android Studio 中可能無法正常運作。

如要進一步瞭解這個問題 (包括可能的解決方法),請參閱 IntelliJ 錯誤追蹤工具

Chrome OS 上的小號使用者介面文字

在 Chrome OS 中,文字可能會比先前版本小得多。如要解決這個問題,請按照下列步驟操作:

  1. 依序點選「File」>「Settings」,開啟「Settings」視窗。
  2. 前往「Appearance & Behavior」>「Appearance」
  3. 選取「Use custom font」
  4. 放大字型。
  5. 在「Settings」視窗中,依序前往「Editor」>「Font」
  6. 放大字型。
  7. 按一下「OK」

程式碼編輯

本節說明程式碼編輯器的相關已知問題。

鍵盤輸入凍結 - Linux 上的「iBus」問題

Linux 上的 iBus Daemon 和 Android Studio 之間有一些已知互動行為。在某些情境下,IDE 會停止回應鍵盤輸入,或開始輸入隨機半形字元。這項錯誤是由 iBus 和 XLib + AWT 之間缺少同步所觸發,而且已回報至 JetBrainsiBus 上游。這個問題目前有三種解決方法:

  • 解決方法 1:將 iBus 強制設為同步模式。在啟動 Android Studio 之前,在指令列中執行下列指令:
    $ IBUS_ENABLE_SYNC_MODE=1 ibus-daemon -xrd
  • 解決方法 2:停用 Android Studio 中的 iBus 輸入功能。如要停用 Android Studio 的 iBus 輸入功能,請在指令列中執行下列指令:
    $ XMODIFIERS= ./bin/studio.sh
    這個解決方法只會停用 Android Studio 的輸入方法,不會停用您正在執行的任何其他應用程式。請注意,如果您在 Android Studio 執行時重新啟動 Daemon (例如執行 ibus-daemon -rd),則會有效地停用所有其他應用程式的輸入方法,甚至可能使 Android Studio 的 JVM 當機,出現區隔問題。
  • 解決方法 3:仔細檢查快速鍵繫結,確保「Next input shortcut」沒有設為 Control+Space,因為這也是 Android Studio 中程式碼完成的快速鍵。Ubuntu 14.04 (Trusty) 會將 Super+Space 設為預設的快速鍵,但先前版本的設定可能仍適用。如要檢查您的快速鍵繫結,請在指令列中執行 ibus-setup 以開啟「IBus Preferences」視窗。在「Keyboard Shortcuts」下方勾選「Next input method」。如果這個項目的設定為 Control+Space,請將其變更為 Super+Space 或您選擇的其他快速鍵。

專案設定

本節說明與專案設定和 Gradle 同步相關的已知問題。

Gradle 同步處理失敗:管線損毀

這是由於 Gradle Daemon 嘗試使用 IPv4 而非 IPv6。

  • 解決方法 1:在 Linux 中,將下列程式碼新增到您的 ~/.profile~/.bash_profile 中:
    export _JAVA_OPTIONS="-Djava.net.preferIPv6Addresses=true"
  • 解決方法 2:在 Android Studio 的 vmoptions 檔案中,將 -Djava.net.preferIPv4Addresses=true 行變更為 -Djava.net.preferIPv6Addresses=true。詳情請參閱「網路 IPv6 使用手冊」。

Gradle 同步或 SDK Manager 的「同類應用程式未驗證」錯誤

這些錯誤的根本原因是 $JAVA_HOME/jre/lib/certificates/cacerts 缺少憑證。如要解決這些錯誤,請按照下列步驟操作:

  • 如果您使用 Proxy,請嘗試直接連線。如果直接連線有用,為了透過 Proxy 連線,您可能需要使用 keytool 將 Proxy 伺服器的憑證新增至 cacerts 檔案中。
  • 重新安裝受支援、未修改的 JDK。目前有一個已知問題會影響 Ubuntu 使用者,這會導致空的 /etc/ssl/certs/java/cacerts。如要解決這個問題,請在指令列執行下列指令:
    sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

部署

本節說明將應用程式部署至連線裝置的相關已知問題。

[僅限 Mac OS] 系統不會套用漸進式更新,原因是儲存在 /System/Volumes/Data 下的專案的 Gradle 檔案監控發生問題

Gradle 問題 18149 對 Android Gradle 外掛程式 7.0 及以上版本有影響,因為它們需要 Gradle 7.0 及以上版本。從 Gradle 7.0 版開始,檔案監控預設為啟用。如果您使用的是 Mac OS 並且您的專案儲存在 /System/Volumes/Data 下,Gradle 的檔案監控功能將無法正確追蹤檔案變更。這樣會導致建構系統看不到任何檔案變更,因此不會再更新 APK。漸進式部署程式碼則不會執行任何工作,因為本機 APK 狀態與裝置相同。

如要解決這個問題,請將專案目錄移至使用者目錄,也就是 /Users/username 下。然後,建構系統將收到 Gradle 檔案監控的檔案變更相關通知,並成功套用漸進式變更。

macOS High Sierra 上的 Android Emulator HAXM

macOS High Sierra (10.13) 上的 Android Emulator 需要 HAXM 6.2.1 以上版本,才能與 macOS 實現最佳相容性和穩定性。不過,macOS 10.13 對於安裝 HAXM 等核心擴充功能有更複雜的程序。您必須手動允許核心擴充功能安裝,如下所示:

  1. 首先,請嘗試從 SDK Manager 安裝最新版本的 HAXM。
  2. 在 MacOS 中,依序前往「System Preferences」>「Security and Privacy」
  3. 如果您看到開發商「Intel 公司應用程式」的系統軟體遭阻止載入的快訊,請按一下「Allow」

如需更多詳細資訊和解決方法,請參閱此 Apple 網頁問題 62395878

套用變更

本節說明與套用變更相關的已知問題。

未套用新的應用程式名稱

如果您重新命名應用程式,然後嘗試套用變更,但是更新後的名稱沒有反映這項變更。如要解決這個問題,請按一下「Run」圖示 Run 圖示,重新部署應用程式,並查看變更。

Android 執行階段擲回錯誤問題

如果您使用的裝置搭載的是 Android 8.0 或 8.1,可能會在嘗試套用特定類型的變更時遇到「VERIFICATION_ERROR」訊息 (尤其是在使用 Kotlin 時)。這則訊息是由於 Android 執行階段發生問題導致的,在 Android 9.0 及以上版本中已修正。雖然該問題會導致套用變更失敗,但您仍可再次按下「Run」圖示Run 圖示 執行應用程式來查看變更。不過,建議您將裝置升級至 Android 9.0 或以上版本。

偵錯和測試

本節說明與偵錯及測試應用程式相關的已知問題。

當從 Android Studio 執行時,JUnit 測試類別路徑中缺少的資源

如果在 Java 模組中有特定的資源資料夾,則從 IDE 執行測試時找不到這些資源。可從指令列使用 Gradle 執行測試。也可以從 IDE 執行 Gradle check 工作。更多詳情請參閱問題 64887

之所以發生這個問題,是因為 IntelliJ 13 要求只有一個資料夾做為類別路徑。IntelliJ 的建構工具會將所有資源複製到該建構資料夾中,但 Gradle 不會複製這些資源。

  • 解決方法 1:從 IDE 執行 Gradle check 工作,而不要執行單元測試。
  • 解決方法 2:更新建構指令碼,手動將資源複製到建構資料夾中。詳情請參閱註解 #13

執行 JUnit 測試可能會編譯程式碼兩次

在建立新專案時,系統可能會使用兩個「推出前」步驟來建立範本 JUnit 設定:Make 和 Gradle-aware Make。然後這項設定會套用至所有已建立的 JUnit 執行設定。

  • 如要為當前專案修正這個問題,請依序點選「Run」>「Edit Configurations」,然後將預設的 JUnit 設定變更為僅包含 Gradle-aware Make 步驟。
  • 如要為所有未來專案修正這個問題,請依序點選「File」>「Close Project」。您應該會看到歡迎畫面。然後依序點選「Configure」>「Project Defaults」>「Run Configurations」,並將 JUnit 設定變更為只包含 Gradle-aware Make 步驟。

部分測試執行設定無法運作

在測試方法上按一下滑鼠右鍵獲得的執行設定,並非全部都有效。具體而言,以下設定是無效的:

  • Gradle 執行設定 (擁有圖示 Gradle 標誌) 無法運作。
  • JUnit 執行設定 (圖示沒有綠色 Android) 不適用於檢測設備測試,無法在本機 JVM 上執行。
Android Studio 也會記住在特定情境中所建立的執行設定 (例如,對特定類別或方法按一下滑鼠右鍵),但不會在日後在不同的設定中主動執行。如要修正這個問題,請依序按一下「Run」>「Edit Configurations」,然後移除錯誤建立的設定。

在偵錯原生程式碼時新增 Java 中斷點

當應用程式在原生程式碼的中斷點暫停時,AutoDual 偵錯工具可能無法立即辨識您設定的新 Java 中斷點。如要避免這個問題,請在啟動偵錯工作階段之前,或在應用程式在 Java 中斷點暫停時新增 Java 中斷點。詳情請參閱問題 229949

跳脫原生偵錯工具

使用 AutoDual 偵錯工具對 Java 和原生程式碼進行偵錯時,如果您是「從」Java 程式碼進入原生函式 (例如,偵錯工具會在 Java 程式碼中用來呼叫原生函式的程式碼行暫停執行,然後您點選「Step Into」圖示 ),然後您想返回 Java 程式碼,請點選「Resume Program」圖示 (而不是「Step Out」圖示 或「Step Over」圖示 )。應用程式程序仍處於暫停狀態,因此在「your-module-java」分頁標籤中按一下「Resume Program」圖示 即可繼續。詳情請參閱問題 224385

原生偵錯工具在載入程式庫時停止運作

升級至 Android Studio 4.2 及以上版本後,首次使用原生偵錯工具時,原生偵錯工具可能會在從 Android 裝置載入程式庫時停止回應。即使您停止並重新啟動偵錯工具,這個問題仍會繼續發生。如要解決這個問題,請在 $USER/.lldb/module-cache/ 中刪除 LLDB 快取。

原生偵錯工具當機,顯示「偵錯工具程序已完成,結束代碼 127」

在 Linux 平台上啟動原生偵錯工具時會發生這個錯誤。它表示本機系統未安裝原生偵錯工具所需的其中一個程式庫。缺少的程式庫名稱可能已在 idea.log 檔案中列印。如果沒有,您可以使用終端機前往 Android Studio 安裝目錄,並執行 bin/lldb/bin/LLDBFrontend --version 指令列,瞭解缺少哪些程式庫。一般來說,缺少的程式庫是 ncurses5,因為最近部分 Linux 發行版已升級至 ncurses6

分析器

本節說明分析器的已知問題。

原生記憶體分析器:應用程式啟動期間不支援剖析功能

原生記憶體分析器目前無法在應用程式啟動期間使用。我們將在日後推出的版本中提供這個選項。

您可以改為使用 Perfetto 獨立指令列分析器來擷取啟動分析。

CPU 分析器中的逾時錯誤

如果您選取「Sample Java Methods」或「Trace Java Methods」設定,Android Studio CPU 分析器可能會出現「無法停止錄音」錯誤。這些錯誤通常是逾時錯誤,尤其是您在 idea.log 檔案中看見以下錯誤訊息時:

Wait for ART trace file timed out

相較於取樣方法,逾時錯誤對追蹤方法影響更大,對長錄音的影響比短錄音更大。作為臨時解決方法,您可以先嘗試較短的錄音,看看錯誤是否消失。

如果分析器發生逾時問題,請回報錯誤,並附上裝置的廠牌/型號以及 idea.log 和 logcat 的相關項目。

偵錯或剖析時發生 ADB 例外狀況

使用 Platform Tools 29.0.3 時,原生偵錯和 Android Studio 分析器可能無法正常運作,並且在選取「Help」>「Show Log」時,idea.log 檔案中可能會顯示「AdbCommandRejectedException」或「Failed to connectport」訊息。只要將平台工具升級至 29.0.4 或以上版本即可修正這兩個問題。

如要升級平台工具,請執行下列步驟:

  1. 按一下「Tools」>「SDK Manager」或按一下工具列中的「SDK Manager」圖示 ,從 Android Studio 開啟 SDK Manager。
  2. 勾選「Android SDK Platform-Tools」旁的核取方塊,讓其顯示勾號。左欄應該會顯示一個下載圖示
  3. 按一下「Apply」或「OK」

外掛程式會禁止「Build Output」視窗運作 {:#cmake-highlighter)

使用 CMake simple highlighter 外掛程式可防止內容出現在「Build Output」視窗中。隨即會執行建構,且顯示「Build Output」分頁,但沒有列印任何輸出內容 (問題 #204791544)。

Android Gradle 外掛程式的已知問題

本節說明 Android Gradle 外掛程式的最新穩定版本所存在的已知問題。

並非所有動態功能程式庫依附元件皆有進行程式碼檢查

從應用程式模組使用 checkDependencies = true 執行程式碼檢查時, 系統不會檢查動態功能程式庫依附元件, 除非也是應用程式依附元件 (問題 #191977888)。您可以在這些程式庫執行程式碼檢查工作,藉此解決問題。

簽署名稱中含有回車字元的檔案

JAR 簽署 (v1 配置) 不支援含有回車字元的檔案名稱 (問題 #63885809)。

API 變更

Android Gradle 外掛程式 3.0.0 及以上版本引入了 API 變更,移除了某些功能,可能會影響您現有的建構。外掛程式的日後版本可能會推出新的公用 API,取代已無效的功能。

無法在建構時間修改變化版本的輸出內容

使用 Variant API 操控變化版本輸出內容對新的外掛程式無效。但仍可以執行簡單的工作,例如在建構期間變更 APK 名稱,如下所示:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

不過,涉及存取 outputFile 物件的較複雜工作將無法再運作。這是因為在設定階段中,系統不會建立特定於變化版本的工作。這會導致外掛程式無法事先瞭解所有輸出內容,但這也意味著能加快設定時間。

manifestOutputFile 已無法使用

processManifest.manifestOutputFile() 方法已無法使用,呼叫它時會出現下列錯誤:

A problem occurred configuring project ':myapp'.
   Could not get unknown property 'manifestOutputFile' for task
   ':myapp:processDebugManifest' of type
   com.android.build.gradle.tasks.ProcessManifest.

取而代之,您可以呼叫 processManifest.manifestOutputDirectory() 來傳回內含所有已產生的資訊清單的目錄路徑,而不是呼叫 manifestOutputFile() 來取得每個變化版本的資訊清單檔案。接著,您可以找出資訊清單並套用邏輯。以下範例會動態變更資訊清單的版本代碼:

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        output.processManifest.doLast {
            // Stores the path to the maifest.
            String manifestPath = "$manifestOutputDirectory/AndroidManifest.xml"
            // Stores the contents of the manifest.
            def manifestContent = file(manifestPath).getText()
            // Changes the version code in the stored text.
            manifestContent = manifestContent.replace('android:versionCode="1"',
                    String.format('android:versionCode="%s"', generatedCode))
            // Overwrites the manifest with the new text.
            file(manifestPath).write(manifestContent)
        }
    }
}

已修正的已知問題

本節說明在最近的發布版本中已修正的已知問題。如果您遇到上述任何問題,建議您將 Android Studio 更新至最新的穩定版或預先發布版

在 Android Studio 2021.1.1 中已修正

  • 缺少 Lint 輸出內容:當 Lint 工作為 UP-TO-DATE 時,不會有 Lint 文字輸出內容列印至 stdout (問題 #191897708)。已在 AGP 7.1.0-alpha05 中修正。
  • 對使用 Hilt 外掛程式的應用程式專案進行單元測試時的問題:單元測試類別包含未檢測的應用程式類別,表示 Hilt 並未檢測應用程式類別,無法在執行單元測試時處理依附插入內容 (問題 #213534628)。已在 AGP 7.1.1 中修正。

在 Android Studio 2020.3.1 中已修正

  • Kotlin 專案中的 Lint 例外狀況:設定 checkDependencies = true 的 Kotlin 專案可能會發生空值指標例外狀況或錯誤 (問題 #158777858)。

在 Android Studio 4.2 中已修正

  • macOS Big Sur 的 IDE 凍結:開啟對話方塊時,Android Studio 4.1 可能會凍結。

在 Android Studio 4.1 中已修正

  • 重新啟動以套用舊版 IDE 的記憶體設定:更新 Android Studio 後,您必須重新啟動 Android Studio,才能套用從舊版 IDE 遷移的任何記憶體設定。
  • 系統不會再預設產生含有自訂權限字串的資訊清單類別:如要產生該類別,請設定 android.generateManifestClass = true

在 Android Studio 3.6 中已修正

  • LineageOS 上的 APK 安裝錯誤:將應用程式部署至搭載特定版本 LineageOS 或 CyanogenMod 的裝置時,可能會失敗並擲回 INSTALL_PARSE_FAILED_NOT_APK 例外狀況。

    在 Android Studio 3.6 Beta 1 及以上版本中,當您將應用程式部署至 LineageOS 或 CyanogenMod 裝置時,IDE 會透過執行完整的應用程式安裝程序,來處理這個例外狀況,這可能會導致部署時間延長。

在 Android Studio 3.5.2 中已修正

  • 無效的 XML 程式碼樣式:編輯 XML 程式碼時,當從選單列中選取「Code」>「Reformat Code」 時,IDE 會套用不正確的程式碼樣式。

在 Android Studio 3.3.1 中已修正

  • 掃描 C++ 專案時發生記憶體不足錯誤:當 Gradle 掃描一個專案時,而該專案在同一個雲端硬碟中的多個位置含有 C++ 程式碼,則掃描作業包含第一個通用目錄下的所有目錄。掃描大量目錄和檔案可能會導致記憶體不足。

    如要進一步瞭解這個問題,請詳閱與該問題相關的錯誤