Android平台 Target API level 升级到 31,在Android 12上启动黑屏卡死

项目的SDK要升级,要把Target API level调整31。项目使用的是Unity2017.4.x,接完SDK后打完APP包装到手机上,启动直接黑屏。看Log,也没定位到具体的原因。然后网上搜索,发现一个解决办法(网址https://answer.uwa4d.com/question/63049f1a6d82e96d844891ec)。 上面说的原因是:因为TelephonyManager的listen函数在Android12过期了,如果没有授权READ_PHONE_STATE权限,此函数会抛出一个SecurityException,而Unity在启用了自带的音频系统的情况下,恰巧在启动时机会去调用这个方法以实现“在用户接电话时游戏静音”的功能,抛出的异常影响了后续的流程导致卡死。解决办法:1.升级Unity版本,但是我们的项目升级Unity版本的成本太大啦。2.反编译classes.jar,修改UnityPlayer类的addPhoneCallListener实现,判断if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) return;再编回classes.jar。然后决定跟着这个办法操作一下。

第一次接触,也不知道用什么反编译工具,也是各种搜索,各种操作对比。最终用jd-gui直接查看.jar文件,用jbe实现对改UnityPlayer的编辑。
1.classes.jar解压,
2.用jbe打开解压好的文件中的UnityPlayer.class,找到addPhoneCallListener方法然后编辑,上面提到解决办法是加入 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) return; 但是打开后显示的是字节码,然后IDEA建了一个同名的UnityPlayer.java,把addPhoneCallListener 复制一下再加入if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) return;在添加引用。转成.class。用jbe打开后和解压好后的文件中UnityPlayer.class对比发现多了这些。
getstatic android/os/Build$VERSION/SDK_INT I
bipush 31
if_icmplt 5
return
添加完毕后点击保存。
3.用解压软件打开classes.jar,然后替换UnityPlayer.class文件。
我当时操作完重新出包,结果依旧闪退。后来才发现我修改的classes.jar文件是Window下的Unity里的,打包机是Mac,然后用Mac下的Unity中的classes.jar,进行上面相同的操作,重新出包进到游戏终于不黑屏啦。

然后在进点击进入游戏后闪退,查看日志发现报出这样的错Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specif 。 网上又一通搜,发现(网址https://www.jianshu.com/p/2ce130a96b25)这个人写我用了解决了问题。
1.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
    
     
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(getApplicationContext(), 0, alertIntent, PendingIntent.FLAG_MUTABLE)); 
        } else {
    
     
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(getApplicationContext(), 0, alertIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 
        }

2.将 implementation ‘androidx.work:work-runtime:2.7.1’ 添加到 build.gradle
3.添加权限

最终重新出包,装到手机上正常啦。

猜你喜欢

转载自blog.csdn.net/m0_73817060/article/details/127112566