使用 Unity 為 Android 12 進行建構

建構指定 Android 12 (SDK 級別 31) 的 Android 專案時,可能會遇到下列錯誤:

Could not determine the dependencies of task ':launcher:compileDebugJavaWithJavac'.
> Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager.
> Configure project :launcher
WARNING: The option 'android.enableR8' is deprecated and should not be used anymore.
It will be removed in a future version of the Android Gradle plugin, and will no longer allow you to disable R8.
Build-tool 31.0.0 is missing DX at <android-sdk-path>/sdk/build-tools/31.0.0/dx
File ~/.android/repositories.cfg could not be loaded.
Build-tool 31.0.0 is missing DX at <android-sdk-path>/sdk/build-tools/31.0.0/dx

這是因為 Android Build Tools 31.0.0 版和 Unity 建構系統不相容。自 Android Build Tools 31.0.0 版起,已移除 DX 並改用 D8,導致 Android 適用的 Unity 版本出現故障。

在下列情況中,這項錯誤可能會觸發:

  • 升級至適用於 Unity AR Foundation 1.26 版的 ARCore Extensions 並
  • 在所有 Unity 專案中指定 Android SDK 級別 31 (無論 ARCore 擴充功能版本為何),
  • 無論 ARCore Extensions 版本為何,在安裝 Build Tools 31.0.0 的情況下,於任何 Unity 專案中指定 Android SDK 級別 30。

解決方法

我們正與 Unity 合作解決這項不相容的問題。在此期間,請按照以下操作說明建構以 Android 12 為目標的專案:

  1. Project Settings > Player > Android > Publishing Settings > Build 中,同時選取以下兩個項目:

    1. Custom Main Gradle Template,
    2. Custom Launcher Gradle Template.

    顯示「Publishing Settings」(發布設定) 和「Build」(建構) 窗格,同時已選取兩個 Gradle 範本選項的螢幕截圖

  2. 將下列變更套用至兩個產生的檔案:

    • Assets/Plugins/Android/mainTemplate.gradle
    • Assets/Plugins/Android/launcherTemplate.gradle

    如果檔案頂端有以下註解,請移除檔案頂端的以下註解:

    // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
    

    然後,按照下列方式修改 compileSdkVersionbuildToolsVersion

    buildToolsVersion '30.0.3'
    

建構時,Unity 會下載 Build-Tools 30.0.3 版,並使用該版本建構專案,同時維持所選的 targetSdkVersion

建立自訂 Gradle 建構作業

在使用舊版建構的 Unity 2019.42020.12020.2 版本中,您必須將自訂 Gradle 版本設為 Gradle 6.1.1 以上版本。此外,您也需要 Android Gradle 外掛程式 4.0.1 以上版本

指定 SDK 31 的應用程式必須使用 Gradle 6.1.1 以上版本

  1. 前往 Preferences > External Tools > Android > Gradle,並將自訂 Gradle 版本設為 Gradle 6.1.1 以上版本。如需下載相關資訊,請參閱 Gradle 建構工具
  2. 將下列變更套用至兩個產生的檔案:

    • Assets/Plugins/Android/mainTemplate.gradle
    • Assets/Plugins/Android/launcherTemplate.gradle
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // Must be Android Gradle Plugin 4.0.1 or later. For a list of
        // compatible Gradle versions refer to:
        // https://developer.android.com/studio/releases/gradle-plugin
        classpath 'com.android.tools.build:gradle:4.0.1'
    }
}

allprojects {
   repositories {
      google()
      jcenter()
      flatDir {
        dirs 'libs'
      }
   }
}

針對以 Android 12 為目標版本的應用程式套用變更

如果應用程式指定 Android 12 為目標,則必須明確宣告 android:exported 屬性。有關 Android 12 的所有變更,請參閱 Android 12 的行為變更

  1. Project Settings > Player > Android > Publishing Settings > Build 中選取 Custom Main Manifest

  2. 將下列變更套用至 Assets/Plugins/Android/AndroidManifest.xml

    1. 如果檔案頂端有以下註解,請移除檔案頂端的以下註解:

      <!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
      
    2. android:exported 屬性新增至 <activity> 標記:

       <application>
           <activity android:name="com.unity3d.player.UnityPlayerActivity"
                     android:theme="@style/UnityThemeSelector"
                     android:exported="true">
               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />
                   <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
               <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
           </activity>
       </application>