王者荣耀竟然崩溃了
上周玩王者荣耀,突然就进不去了,点击开始游戏后应用直接就崩溃退出了。
第一反应,肯定是反馈给游戏客服。但是果然腾讯的游戏是找不到真客服的,全部都是机器人处理的,给了我一个毫无用处的官方回复。而且就算是人工智能也有点太弱了,最基本上的安卓和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的逻辑,自然也走不到崩溃的点了。
然后重启启动,正常启动成功。