Unity2018,Android平台 Target API level 升级到 31以上,在Android 12上启动黑屏卡死【完美解决办法】

Unity2018及以下,Android平台 Target API level 升级到 31以上,在Android 12上启动黑屏卡死,包括重新编译unity-classes.jar详细教程

这里先说原因:

是因为TelephonyManager的listen函数在Android 12过期了,如果没有授权READ_PHONE_STATE权限,此函数会抛出一个SecurityException。而Unity在启用了自带的音频系统的情况下,恰巧在启动时机会去调用这个方法以实现“在用户接电话时游戏静音”的功能,抛出的异常影响了后续的流程导致卡死。

解决办法

1:升级Unity
2:其他
**升级Unity没什么好说的,这里重点说第二种**

原理介绍

	//重写UnityPlayer类的addPhoneCallListener函数,当
	@Override
    protected void addPhoneCallListener()
    {
        if (Build.VERSION.SDK_INT >= 31)
        {
            return;
        }
        super.addPhoneCallListener();
    }

准备工具

jbe下载 这个用于修改字节码
jd-gui下载 (可选)这个用于修改查看jar包原码

解包并编辑

解压unity-classes.jar,用jbe打开解压好的文件中的UnityPlayer.class,双击Methods/addPhoneCallListener/[0]Code,开始编辑,上面提到解决办法是加入 if (Build.VERSION.SDK_INT >= 31) return; 但是打开后显示的是字节码,然后IDEA建了一个同名的UnityPlayer.java,把addPhoneCallListener 复制一下再加入if (Build.VERSION.SDK_INT >= 31) return;在添加引用。转成.class。用jbe打开后和解压好后的文件中UnityPlayer.class对比发现前面多了下面这些这些。

	getstatic android/os/Build$VERSION/SDK_INT I
	bipush 31
	if_icmplt 5
	return
在最前面加上这4行字节码,点击“Save method”保存。

在这里插入图片描述

重新压缩

将修改后的unity-classes重新压缩回jar(直接用压缩软件压缩回去就行,后缀名修改为jar,注意层级[不要多套一层])
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值