为 Android 构建 Unity

每个 Unity 编辑器版本只能与特定版本的 Gradle 兼容。较早版本的 Unity 编辑器使用较早版本的 Gradle,而较早版本的 Gradle 与最新版 Google 移动广告不兼容。

下表显示了不同 Unity 编辑器版本所兼容的 Google 移动广告插件最高版本:

Unity 编辑器 Google 移动广告 Unity 插件版本
2023.1 或更高版本 最新版本
2021.3.41f1 - 2022.3 9.1.0
2021.3.37f1 或更低版本 8.5.3

您可以手动更新 Gradle 以使用最新的 Google 移动广告 Unity 插件,包括旧版 Unity 编辑器。如需构建 Android 应用,请选择您偏好的 Unity 编辑器版本:

2023.1 或更高版本

启用自定义 Gradle 模板

依次前往 Project Settings(项目设置)> Player(可执行游戏文件)> Android > Publishing Settings(发布设置)> Build(构建),然后启用 Custom Main Gradle TemplateCustom Gradle Properties Template

启用自定义 Gradle 模板

将目标 API 级别设置为 34

在主菜单中,依次打开 Edit(编辑)> Project Settings(项目设置)> Player(可执行游戏文件)> Android > Other Settings(其他设置),并将 Target API Level(目标 API 级别)设置为 API Level 34(API 级别 34)或更高级别。

设置目标 API 级别

2021.3.41f1 - 2022.3

启用自定义 Gradle 模板

依次前往 Project Settings(项目设置)> Player(可执行游戏文件)> Android > Publishing Settings(发布设置)> Build(构建),然后启用 Custom Main Gradle TemplateCustom Gradle Properties Template

启用自定义 Gradle 模板

将目标 API 级别设置为 34

在主菜单中,依次打开 Edit(编辑)> Project Settings(项目设置)> Player(可执行游戏文件)> Android > Other Settings(其他设置),并将 Target API Level(目标 API 级别)设置为 API Level 34(API 级别 34)或更高级别。

设置目标 API 级别

将 Jetifier 屏蔽名单添加到“gradleTemplate.properties”

修改 Assets/Plugins/Android/gradleTemplate.properties,在其中添加下面这行内容:

  android.jetifier.blacklist=annotation-experimental-1.4.0.aar

从“AndroidManifest.xml”中移除“minSDKVersion”

修改 Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/AndroidManifest.xml,从 uses-sdk 节点中移除 android:minSdkVersion="21"。您的 AndroidManifest.xml 应该如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.unity.ads"
    android:versionName="1.0"
    android:versionCode="1">
  <uses-sdk />
  <application>
    <uses-library android:required="false" android:name="org.apache.http.legacy"/>
  </application>
</manifest>

2021.3.37f1 - 2019.4

前提条件

在继续操作之前,请务必做好以下准备:

启用自定义 Gradle 模板

依次前往 Project Settings(项目设置)> Player(可执行游戏文件)> Android > Publishing Settings(发布设置)> Build(构建),然后启用 Custom Main Gradle TemplateCustom Gradle Properties Template

启用自定义 Gradle 模板

将目标 API 级别设置为 34

在主菜单中,依次打开 Edit(编辑)> Project Settings(项目设置)> Player(可执行游戏文件)> Android > Other Settings(其他设置),并将 Target API Level(目标 API 级别)设置为 API Level 34(API 级别 34)或更高级别。

设置目标 API 级别

导出到 Android Studio

依次选择 File(文件)(在 MacOS 上为 Unity 编辑器)> Build Settings(构建设置)以修改 Android 构建设置,然后勾选“Export Project”(导出项目):

导出项目

如果您收到有关 Android SDK 平台 API 级别 34 缺失的警告,请选择 Update Android SDK(更新 Android SDK)选项。

打开 Android Studio

本部分包含在 Android Studio 中执行的步骤。

更新 Gradle JDK 配置

依次选择 File(文件)(在 MacOS 上为 Android Studio)> Settings(设置)> Build(构建)> Execution(执行)> Deployment(部署)> Build Tools(构建工具)> Gradle,打开 Gradle 设置。找到 Gradle JDK 下拉菜单,并将 Gradle JDK 设置为使用 JDK 17 或更高版本。

更新 Gradle JDK 配置

如果您尚未安装 JDK 17,请从 Gradle JDK 菜单栏中选择 Download JDK(下载 JDK)选项,然后下载兼容的版本。我们建议使用支持 aarch64 的 JetBrains 运行时环境供应商,以便与 Android Studio 分发的运行时环境保持一致。

更新项目级 build.gradle

将 Gradle 工具版本设置为 8.1.1 或更高版本。

plugins {
    id 'com.android.application' version '8.1.1' apply false
    id 'com.android.library' version '8.1.1' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

更新 /gradle/gradle-wrapper.properties

distributionUrl 设置为使用 Gradle 8.1.1 或更高版本。

distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip

更新 launcher/build.gradle

  • 使用 launcher/AndroidManifest.xmlpackage 属性的值设置 namespace 属性
  • sourceCompatibilitytargetCompatibility 设置为 Java 17
apply plugin: 'com.android.application'

dependencies {
    implementation project(':unityLibrary')
}

android {
    namespace "com.google.android.gms.example"
    compileSdkVersion 35
    buildToolsVersion '35.0.0'

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    defaultConfig {
        minSdkVersion 28
        targetSdkVersion 35
        applicationId 'com.google.android.gms.example'
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }
        versionCode 1
        versionName '1.0'
    }

    aaptOptions {
        noCompress = ['.unity3d', '.ress', '.resource', '.obb', '.bundle', '.unityexp']
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
    }

    lintOptions {
        abortOnError false
    }

    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt')
            signingConfig signingConfigs.debug
            jniDebuggable true
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt')
            signingConfig signingConfigs.debug
        }
    }

    packagingOptions {
        doNotStrip '*/armeabi-v7a/*.so'
        doNotStrip '*/arm64-v8a/*.so'
        doNotStrip '*/x86/*.so'
        doNotStrip '*/x86_64/*.so'
        jniLibs {
            useLegacyPackaging true
        }
    }

    bundle {
        language {
            enableSplit = false
        }
        density {
            enableSplit = false
        }
        abi {
            enableSplit = true
        }
    }
}

apply from: '../unityLibrary/GoogleMobileAdsPlugin.androidlib/packaging_options.gradle'

更新项目级 settings.gradle

设置 pluginManagementdependencyResolutionManagement 部分。

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

include ':launcher', ':unityLibrary'
include 'unityLibrary:GoogleMobileAdsPlugin.androidlib'

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
    repositories {

        google()
        mavenCentral()
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
    }
}

更新 unityLibrary/build.gradle

  • 设置 namespace,值为 "com.unity3d.player"
  • sourceCompatibilitytargetCompatibility 设置为 JavaVersion.VERSION_17
    apply plugin: 'com.android.library'

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        // Android Resolver Dependencies Start
        implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
        implementation 'com.google.android.gms:play-services-ads:23.6.0'
        implementation 'com.google.android.ump:user-messaging-platform:3.1.0'
        // Android Resolver Dependencies End
        implementation(name: 'googlemobileads-unity', ext:'aar')
        implementation project('GoogleMobileAdsPlugin.androidlib')
    }

    // Android Resolver Exclusions Start
    android {
      packagingOptions {
          exclude ('/lib/armeabi/*' + '*')
          exclude ('/lib/mips/*' + '*')
          exclude ('/lib/mips64/*' + '*')
          exclude ('/lib/x86/*' + '*')
      }
    }
    // Android Resolver Exclusions End

    android {
        namespace "com.unity3d.player"
        compileSdkVersion 34
        buildToolsVersion '30.0.2'

        compileOptions {
            sourceCompatibility JavaVersion.VERSION_17
            targetCompatibility JavaVersion.VERSION_17
        }

        defaultConfig {
            minSdkVersion 28
            targetSdkVersion 34
            ndk {
                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
            }
            versionCode 1
            versionName '1.0'
            consumerProguardFiles 'proguard-unity.txt'
        }

        lintOptions {
            abortOnError false
        }

        aaptOptions {
            ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
        }

        packagingOptions {
            doNotStrip '*/armeabi-v7a/*.so'
            doNotStrip '*/arm64-v8a/*.so'
            doNotStrip '*/x86_64/*.so'
        }
    }


    apply from: 'GoogleMobileAdsPlugin.androidlib/packaging_options.gradle'
    gradle.projectsEvaluated { apply from: 'GoogleMobileAdsPlugin.androidlib/validate_dependencies.gradle' }

更新 unity/Library/GoogleMobileAdsPlugin.androidlib/build.gradle

namespace 属性的值设置为 "com.google.unity.ads"

apply plugin: 'android-library'

dependencies {
    implementation fileTree(dir: 'bin', include: ['<em>.jar'])
    implementation fileTree(dir: 'libs', include: ['</em>.jar'])
}

android {
    namespace "com.google.unity.ads"
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            //java.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
        }
    }

    compileSdkVersion 34
    buildToolsVersion '30.0.2'
    defaultConfig {
        targetSdkVersion 31
    }

    lintOptions {
        abortOnError false
    }
}

运行 Android 项目

在 Android Studio 中,运行 Gradle 同步,然后运行项目