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,注意层级[不要多套一层])