关于 Unity 2019.2 版本升级到 Unity 2019.4 后导出 Android 工程的记录

由于发行的需求,原本的 Unity 2019.2 版本要升级到 Unity 2019.4 版本(为了要适配 Android 12)。

原因是 Unity 2019.2 打包后的项目在 Android 12 设备打开后白屏无法运行,于是使用空工程进行了测试,发现 Unity 2019.4 以后的版本都可以正常运行(没有测试 Unity 2019.3,但感觉应该也可以运行)。

在经过比对后还是决定使用 2019.4 版本。

由于发行那边的 sdk 只有安卓源生版本,所以我们为了方便集成其他的 sdk,采用的方式是先通过 Android Studio 把需要的 sdk 都集成到一个 AAR 包,之后将这个 AAR 包放入 Unity 工程。而由于项目本身需要添加 Firebase,所以还需要把 Untiy 工程导出成 Android 工程,之后把那个 google-service.json 文件放到 Android 工程目录中。(因为不使用 Unity 版的 firebase 插件的话,我不知道应该如何直接在 Unity 中整合这个 json 文件。。。)

于是问题来了。Unity 2019.3 以后的版本,在导出 Android 工程时的目录结构发生了改变。。。
在这里插入图片描述
如图所示,左边为 Unity 2019.2 以前的版本导出的 Android 工程。右边是 Unity 2019.3 以后的版本导出的 Android 工程,官方说是为了方便 Android 端的调用所以单独将 Unity 相关内容搞成了个模块,也就是 unityLibrary。具体相关内容可以参考官方链接,或者这篇文章

以下主要记录 Unity 2019.2 升级到 Unity 2019.4 以后,导出 Android 工程时需要注意的一些操作。具体的 Unity 和 Android 对接的内容依然可以参考以下文章:
Unity 工程对接 Android SDK 聚合广告


1、Android 导出 AAR 包时的问题

Android 端在制作 AAR 包时需要一个 Unity 端提供的 class.jar 文件,根据不同的 Unity 版本需要给出不同的 jar 文件,这个文件在 Unity 2019.4 中的目录为:
F:\Program Files\Unity 2019.4.38f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes

此路径前面的 F:\Program Files\ 是 Unity 的安装目录。而从 Unity 2019.3 以后,这个 class.jar 文件出现了一个变化,其中不再包括 UnityPlayerActivity.java 这个文件,此文件需要我们手动将其复制到 Android 项目中,其位置为:
F:\Program Files\Unity 2019.4.38f1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player

为了区分方便和看起来整齐,可以选择直接将
F:\Program Files\Unity 2019.4.38f1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com
这个文件夹复制过去,因为这个文件夹里只有 UnityPlayerActivity.java这么一个文件。

此外,之前我都直接将程序的 Icon 直接放在 AAR 包内,但是因为新版本改动的原因,可以不用再将 Icon 放在 AAR 包内了,因为可以将其放在 Unity 导出的安卓工程的 launcher 项目内。

而在制作成 AAR 包后,需要将其内部的 class.jar 以压缩文件方式打开,然后将其中的 UnityPlayerActivity.java 删除,防止之后 Unity 导出 Android 工程时打包发生的文件重复问题。

至此,AAR 包的准备工作就结束了。


2、Unity 工程内的一些设置

在之前的版本,可以通过在 Unity 工程的 Plugins\Android\ 目录目录下配置一个叫 mainTemplate.gradle 的文件来将一些打包的依赖项同步到导出的 Android 工程中。而新版本中,这个 gradle 被拆分成了三部分:
1、launcherTemplate.gradle
2、baseProjectTemplate.gradle
3、mainTemplate.gradle

这些文件的位置在:
F:\Program Files\Unity 2019.4.38f1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates 中,可以直接复制过来后进行改写。

baseProjectTemplate.gradle 是项目最外层的 gradle 文件,其中配置远程依赖的仓库地址

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

allprojects {
    
    
    buildscript {
    
    
        repositories {
    
    **ARTIFACTORYREPOSITORY**
            google()
            jcenter()
            mavenCentral()
	
			// 添加项目需要依赖的远程库文件的地址,根据自身需求修改和添加
            maven {
    
     url 'xxx' }
          
        }

        dependencies {
    
    
            // If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
            // See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
            // See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
            // To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
            
            classpath 'com.android.tools.build:gradle:4.0.1'
            // 对接 google 相关 sdk 需要的配置
            classpath 'com.google.gms:google-services:4.3.5'
            **BUILD_SCRIPT_DEPS**
        }
    }

    repositories {
    
    **ARTIFACTORYREPOSITORY**
        google()
        jcenter()
        flatDir {
    
    
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
        mavenCentral()
        
       // 添加项目需要依赖的远程库文件的地址,根据自身需求修改和添加
       maven {
    
     url 'xxx' }
    }
}

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

mainTemplate.gradle 是模块 unityLibrary 中的 gradle 文件,其中配置项目的依赖项

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

apply plugin: 'com.android.library'
**APPLY_PLUGINS**

dependencies {
    
    
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    // 添加各种依赖项,根据需求修改和添加
    implementation 'xxx'

    // 为了防止出现 Error: Cannot fit requested classes in a single dex file
    implementation 'com.android.support:multidex:1.0.3'

    implementation 'android.arch.work:work-runtime:1.0.1'

    // 为了解决一个和 guava 有关的重复引用 bug 而添加此依赖
    implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

**DEPS**}

android {
    
    
    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'

    compileOptions {
    
    
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
    
    
        minSdkVersion **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        ndk {
    
    
            abiFilters **ABIFILTERS**
        }
        versionCode **VERSIONCODE**
        versionName '**VERSIONNAME**'
        consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**

        // 为了防止出现 Error: Cannot fit requested classes in a single dex file
        multiDexEnabled true
    }

    lintOptions {
    
    
        abortOnError false
    }

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

剩下的就配置到 launcherTemplate.gradle

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

apply plugin: 'com.android.application'

dependencies {
    
    
    implementation project(':unityLibrary')

    // 为了防止出现 Error: Cannot fit requested classes in a single dex file
    implementation 'com.android.support:multidex:1.0.3'

    implementation 'android.arch.work:work-runtime:1.0.1'

    // 为了解决一个和 guava 有关的重复引用 bug 而添加此依赖
    implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

}

android {
    
    
    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'

    compileOptions {
    
    
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
    
    
        minSdkVersion **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        applicationId '**APPLICATIONID**'
        ndk {
    
    
            abiFilters **ABIFILTERS**
        }
        versionCode **VERSIONCODE**
        versionName '**VERSIONNAME**'

        // 为了防止出现 Error: Cannot fit requested classes in a single dex file
        multiDexEnabled true
    }

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

    lintOptions {
    
    
        abortOnError false
    }

    buildTypes {
    
    
        debug {
    
    
            minifyEnabled **MINIFY_DEBUG**
            useProguard **PROGUARD_DEBUG**
            proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG**
            jniDebuggable true
        }
        release {
    
    
            minifyEnabled **MINIFY_RELEASE**
            useProguard **PROGUARD_RELEASE**
            proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG**
        }
    }**PACKAGING_OPTIONS****PLAY_ASSET_PACKS****SPLITS**
**BUILT_APK_LOCATION**
    bundle {
    
    
        language {
    
    
            enableSplit = false
        }
        density {
    
    
            enableSplit = false
        }
        abi {
    
    
            enableSplit = true
        }
    }
}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP**

// Add the following line to the bottom of the file:
apply plugin: 'com.google.gms.google-services'  // Google Play services Gradle plugin

3、导出 Android 工程后的操作

google-service.json 文件放到 launcher 目录中,配置好 Icon 后,就可以正常打包了。

猜你喜欢

转载自blog.csdn.net/EverNess010/article/details/124813909