记录untiy适配android12
我的小米手机升级了最亲的Miui113,也就是android12.升级后 ,unity app在手机上无法安装,提示:安装失败(-22)打不开了,但是在android12以下的版本可以正常安装。
初步定位为android12加了什么新的特性导致无法安装。以下为排错记录:
- 网上搜索了一下android12新特性,好像和Unity没多大关系。
- 再搜索错误信息: 安装失败(-22),也没有找到多少信息。
- 搜索unity适配android12,无果。
- 搜索unity build for android12,无果。
- 为了排除是unity的问题,我用android studio写了一个空的android项目,生成app后,可以在手机上打开,说明应该是Unity的问题。
- 继续搜索unity适配android12,搜索到一点有用信息,说android12需要配置 manifest中的android:exported="false"。刚好,因为我的unity项目中使用android特性,Plugins下面也有manifest.xml,无是在activity上加了 android:exported="false". 增加后再次打包,果然安装成功。
- 虽然安装成功了,但是打开后,直接黑屏。没有任何反应,于是接上数据线,打开android studio看日志,没有找到有用信息
- 于是搜索 unity android12 黑屏,无果。
- 继续去google上搜索 unity android12 black screen, 在youtube上看到一个小哥说要设置ar core,也试了一下,无果。
- 继续搜索 unity 黑屏,有人说是unity bug,需要打补丁。于是我换了Unity版本,还是不行。去unity官网找相关补丁,无果。
- 我怀疑是不是我的项目有问题,于是 新建了一个空的unity项目,打包,安装不上,提示: 安装失败(-22),于是在/assets/plugins/android/下加上 AndroidManifest.xml,并在activity中增加 android:exported="false" 。重新打包,安装成功,不黑屏,成功了?于是试了一下原来的Unity项目,不行。
- 开始对比两个项目的配置,发现新项目用的是.net 2.x来编译。把原项目改为.net 2.x,结果无法打包,因为项目用了很多.net 4.x特性,包括插件也是.net 4.x的版本。看来不行。
- 于是把空项目的.net 2.x改为.net 4.x,打包成功,但是启动后黑屏。不行。
- 于是继续搜索android12 黑屏,有人说是target api太高,把auto target改为低版本的。于是我在Unity 中设置 player setting中设置target api level为android8(API 26),重新打包并安装,OK了。在手机上正常安装,并能启动这个demo空unity项目。
- 于是我把原项目target api level改为26,打包,出错。提示gradle版本不一致。
- 搜索 dupicate gradle,有人说需要为unity项目设置mainTemplate.gradle,设置后,打包报错,提示这个mainTemplate.gradle里面的各种属性无法识别。不行。
- 后来感觉头大了,于是休息了一会,搞了一上午,也该吃中午饭了。
- 吃完午饭后,休息了一会。
- 下午,我重新梳理了一篇。既然demo空项目能成功,那肯定就是原项目的问题。
- 我把原项目.net改为.net4.x,api level 改为26 ,其它所有配置和 demo项目一致。打包,打包成功,安装也安装成功,但是打开黑屏。
- 于是我寻找两个项目之间的区别,原项目用了一个android aar包,于是我把这个aar包放到demo项目里面,重新打包demo项目,打包成功,但是安装后打开也黑屏了,看来问题定位到是这个aar包的问题。
- 于是打开aar包原android项目,检查代码,发现用了一个androidx.core的包来请求用户权限。这个包也自带了一个core-1.0.2.aar,也打包到Unity项目时面了,于是我把这个aar删除,重新打包,打包成功,安装成功,也不黑屏了。成功了?但是运行Unity app的过程中,发现不弹出请求权限了,因为没有权限,搜索wifi的功能也无法正常使用。看来是这个包还不能删除。
- 于是我尝试看能不能不用这个包,于是网上搜索了一段申请权限的代码,如下:
-
- if (android.os.Build.VERSION.SDK_INT >= 23) {
- if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
- // You can use the API that requires the permission.
- if (ptWifiAdministrator == null)
- ptWifiAdministrator = new PTWifiAdministrator(this);
- ptWifiAdministrator.StartScanWifi();
- //ptWifiAdministrator.GetScanResults();
- String ScanList = ptWifiAdministrator.LookUpScan();
- UnityPlayer.UnitySendMessage(unitygameobjectName, "PTUnityWifiReceive", ScanList);
- } else {
- // You can directly ask for the permission.
- this.requestPermissions(
- new String[]{
- android.Manifest.permission.ACCESS_COARSE_LOCATION,
- android.Manifest.permission.ACCESS_FINE_LOCATION,
- },
- 102);
- }
- }
- 修改后,重新生成aar,并打包到unity项目里面,打包成功,安装成功,wifi搜索功能正常。搞定了?虽然成功了,但是api level=26,并不是最新的android12=31。
- 先这样吧,等有时间再来解决。
总结:
- unity api level改为26
- unity在/assets/plugins/android/下加上 AndroidManifest.xml,并在activity中增加 android:exported="false"
- 第三方android包,不要使用androidx特性,即移出androidx.core依赖,因为和unity有冲突(需要重写申请权限的代码)。
晚上,凭记忆写下日志,希望能帮到有用的人。有什么不对的地方,请指出,谢谢。
============ 欢迎各位老板打赏~ ===========
与本文相关的文章
- · Unity中将3D模型显示在UI上或者显示在UI前面
- · 3dmax模型导入unity后很昏暗,对比度低怎么办?
- · unity中的简单延时方法
- · unity发布后无法连接sqlite数据库,在Editor中可以
- · Mixamo生成人物动画并导入Unity
- · sdk tool version 0.0<26.1.1 | android sdk is outdated unity
- · unity pro 2019.4.9破解版下载(win/mac)
- · unity改变UI透明度
- · 史上最简单的Unity Hub破解教程(win&mac)
- · unity 让物体上下来回移动
- · Unity2D 平台类游戏 人物移动
- · unity3d mysql error: The given key was not present in the dictionary.