记一次排坑:Unity2020.3.6接Google AdMob打apk

发布时间 2023-10-09 17:11:13作者: 嗜可乐的王梓

Unity版本:2020.3.6

AdMob版本:8.3.0

 

过程比较折腾,原先项目中使用的IronSource可打包成功,之后移除IronSource接了Admob,可能会存在旧插件影响。且两次打包间隔较久,机器的环境可能会存在问题,特别是gradle。大约折腾了2天多。过程中出现java报错、gradle打包报错等各种问题。

 

先记录最终成功时的环境及配置:

1、Edit-Preferences中 JDK、AndroidSDK、NDK均使用unityEditor自带版本;Gradle使用新版,Unity默认应该是5.6.4(我使用的6.9,没有尝试更高版本)。Editor中配置gradle安装路径

注释:Unity默认的gradle编译Admob时会有各种奇葩报错,网上查找资料后需要升级gradle的androidTool插件版本,unity2020.3的gradle版本5.6.4,插件是3.4.0。我使用了一个较为新的gradle6.9,对应插件4.2.0(毕竟unity版本也有点老了,没有使用最新进行测试)。插件版本配置后文说明

gradle版本对应表: https://developer.android.com/studio/releases/gradle-plugin?hl=zh-cn#updating-gradle

记其中一个相关错误:

Unable to make field private final java.lang.String java.io.File.path

默认gradle版本过低有错误:

java.lang.UnsupportedOperationException: This feature requires ASM7

链接: https://github.com/googleads/googleads-mobile-unity/issues/2559

 

2、ProjectSetting中指定API Level,ARMv7 ARM64也需要勾选。需指定为31

 注释:

API Level最初设置为0(本机highest level),后设置为30,最终设置为31。为解决一个报错:

编译器 (1.8.0-adoptopenjdk) 中出现异常错误。如果在 Bug Database (http://bugs.java.com) 中没有找到该错误, 请通过 Java Bug 报告页 (http://bugreport.java.com) 建立该 Java 编译器 Bug。请在报告中附上您的程序和以下诊断信息。谢谢。
java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.tools.javac.util.UnsharedNameTable

参考链接:https://blog.csdn.net/f_957995490/article/details/126769305 的第一段

参考链接:https://www.wilker.cn/20220123153310/yangx/note/Unity3d/unity-android%E5%92%8Cgradle%E5%8D%87%E7%BA%A7.html 的现象与我一致java.lang.AssertionError: annotationType(),文中有原因分析

 

3、设置之后打包,会报一个错误:

 As Android 12 has updated behaviours and requires android:exported on all activities with intent filters

 即需要在AndroidManifest.xml中为标签<service> <receiver> <activity> 都加上android:exported="true" (或false)属性。所以需要用到模板文件,这里都勾上,然后按这个路径,去修改模板

 

 

 

但最终生成的unityLibrary/src/main/AndroidManifest.xml没有提供模板应用,故而需要我们将unity编译Export成gradle项目,然后去里面手动修改。

注释:

build.gradle中注释的部分为aliyun的maven镜像源,原想不想挂代理,但build gradle时各种卡住(可能是其它依赖源的包需要代理)。故而后面全部设置代理下载,(路径:C:\Users\Administrator\.gradle\gradle.properties,多数情况打开as时会问你是否需要把as的代理同步给gradle)

 此外,代理设置时请使用http(s)端口,我原先反骨上身故意配置成socks端口,各种奇葩错误

Export出来

 

4、导出后,as打开项目,检查build.gradle里的插件版本、CompileSdkVersion、targetSdkVersion

 检查gradle.properties的设置

 

 

 网上有文章指出需要这样设置,解决一个报错:Unable to make field private final java.lang.String java.io.File.path(未验证是否必要)

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMEDz

 

 gradle-wrapper.properties中指定distributionUrl(感觉不需要这一步,因为并没有下载7.1.1版本)


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

 

手动修改遗漏的AndroidManifest.xml,加上android:exported="true",(false未试过)

 然后就可以构建项目了

 

其它:

清理缓存

1、as终端——./gradlew clean 在切换了gradle版本之后运行一下。

2、C:\Users\{你的id}\.gradle文件夹下cache文件夹可以删

 

总结一下:引入admob后整体思路就是——配置一个匹配的gradle版本——通过指定API Level避免java编译报错

而后将Unity自动打apk的过程拆成2步——通过Export导出gradle项目——修改其中的编译错误——打包成apk