王者荣耀崩溃解决记录

王者荣耀竟然崩溃了

上周玩王者荣耀,突然就进不去了,点击开始游戏后应用直接就崩溃退出了。

第一反应,肯定是反馈给游戏客服。但是果然腾讯的游戏是找不到真客服的,全部都是机器人处理的,给了我一个毫无用处的官方回复。而且就算是人工智能也有点太弱了,最基本上的安卓和IOS设备类型都不能区分。

所以求人不如求己,既然是突然的崩溃,那么我推测一定是最近的某个操作导致的,只要回退掉这个操作,那么崩溃应该就可以解决,本着这种想法,开始尝试解决掉这个崩溃。

崩溃视频:

46_1672057418

分析崩溃日志

通过adb,抓取崩溃日志,果然抓到了对应的崩溃日志,如下:

12-21 19:58:59.291  2909  2909 D AndroidRuntime: Shutting down VM
--------- beginning of crash
12-21 19:58:59.291  2909  2909 E AndroidRuntime: FATAL EXCEPTION: main
12-21 19:58:59.291  2909  2909 E AndroidRuntime: Process: com.tencent.tmgp.sgame, PID: 2909
12-21 19:58:59.291  2909  2909 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Throwable android.os.ParcelableException.getCause()' on a null object reference
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at android.telephony.TelephonyManager$1.lambda$onError$2(TelephonyManager.java:5335)
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at android.telephony.-$$Lambda$TelephonyManager$1$DUDjwoHWG36BPTvbfvZqnIO3Y88.run(Unknown Source:6)
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at android.os.Handler.handleCallback(Handler.java:883)
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:100)
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:227)
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7544)
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
12-21 19:58:59.291  2909  2909 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953)

看似好像和王者荣耀APP没有关系,但是进程却是是APP进程,所以推测,应该是王者荣耀调用了一个系统API,但是API返回值有问题,从而导致崩溃了。

我的手机是android10的,所以我们把API切换到29看崩溃处的代码:

 @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
    public void requestCellInfoUpdate(
            @NonNull @CallbackExecutor Executor executor, @NonNull CellInfoCallback callback) {
        try {
            ITelephony telephony = getITelephony();
            if (telephony == null) return;
            telephony.requestCellInfoUpdate(
                    getSubId(),
                    new ICellInfoCallback.Stub() {
                        public void onCellInfo(List<CellInfo> cellInfo) {
                            Binder.withCleanCallingIdentity(() ->
                                    executor.execute(() -> callback.onCellInfo(cellInfo)));
                        }

                        public void onError(int errorCode, android.os.ParcelableException detail) {
                            Binder.withCleanCallingIdentity(() ->
                                    executor.execute(() -> callback.onError(
                                            errorCode, detail.getCause())));
                        }
                    }, getOpPackageName());

        } catch (RemoteException ex) {
        }
    }

看起来,应该是请求一个定位权限,权限请求失败后恰好返回的detail对象为空,从而导致的崩溃。所以这应该是一个系统的问题,系统兼容没有做好,从而导致APP崩溃了。但是,升级系统不靠谱,王者荣耀又不管,那我们该如何解决这个崩溃呢?

既然是请求定位的崩溃,这里看代码,是一个跨进程的请求,向系统进程请求权限失败。那么,我们只要修改系统的返回值,让其detail不为空即可。

解决崩溃问题

按照上面猜测的思路,最终我们也是这么改的。把王者荣耀这个应用的定位权限,从询问改为了不允许,这样就不会走onError的逻辑,自然也走不到崩溃的点了。

然后重启启动,正常启动成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失落夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值