Google APK Crash 解决方案

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

本篇文章主要介绍开发中我们没有源码的GMS Crash崩溃后的解决方案,通过阅读本篇文章,您将收获以下内容:

一、gms.ui Service not registered Crash
二、gms.ui BadTokenException Crash
三、setupwizard ConcurrentModificationException Crash
四、setupwizard ActivityNotFoundException Crash
五、setupwizard On-body ActivityNotFoundException
六、Google play Service NullPointerException Crash
七、恢复出厂设置或者第一次开机,先闪壁纸再显示开机向导

GMS(GoogleMobile Service)包是出口国外手机中 Google限制必须要预制的,如果不预置无法过Google CTS 认证,会导致手机无法正常使用,并且Google会对手机厂商进行罚款。
只要是代码写出来的东西,都会有报错的概率存在,Google大牛写的代码也不理我,那么,当我们遇到Google apk Crash 时候我们改如何处理呢?由于没有Google源码,我们不能从根本上解决 Google apk Crash的问题,只能在Android原生的代码上规避 一下Google代码低概率复现问题。

一、gms.ui Service not registered Crash

1.Crash Log如下:

--------- beginning of crash
01-01 00:00:16.892 2210 2473 E AndroidRuntime: FATAL EXCEPTION: IPreferenceServiceThread
01-01 00:00:16.892 2210 2473 E AndroidRuntime: Process: com.google.android.gms.ui, PID: 2210
01-01 00:00:16.892 2210 2473 E AndroidRuntime: java.lang.IllegalArgumentException: Service not registered: wfg@202e22a
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1329)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.app.ContextImpl.unbindService(ContextImpl.java:1495)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:648)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:648)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:648)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:648)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at msl.a(:com.google.android.gms@11951440:39)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at wfh.run(:com.google.android.gms@11951440:5)
--------- beginning of system

2.Crash 原因:

当绑定服务已经解除绑定,再次解除绑定,会出现此异常。

当绑定服务已经解除绑定,再次解除绑定,会出现此异常

3.解决方案:

由于没有GMS源码,我们不能从根源上处理问题,只能尝试修改Framework代码规避此问题。
解决此问题需要修改一下两个类:

frameworks/base/core/java/android/app/ContextImpl.java
frameworks/base/core/java/android/content/ContextWrapper.java
  • 1.修改1:ContextWrapper.java

ContextWrapperunbindService 方法中try-catch住代码中抛出的异常IllegalArgumentException,抓住异常,不让异常抛出。
修改方法如下:

   
public class ContextWrapper extends Context {
... ...

@Override
public void unbindService(ServiceConnection conn) {
try {
mBase.unbindService(conn);
} catch (IllegalArgumentException e) {
//com.google.android.gms.ui Service not registered Crash
android.util.Log.e("wjwj","---ContextWrapper GMS Crash---");
e.printStackTrace();
}
}

... ...

}

在ContextWrapper的 unbindService 方法中try-catch IllegalArgumentException

  • 2.修改2:ContextImpl.java

修改方法如下:


class ReceiverRestrictedContext extends ContextWrapper {
... ...

@Override
public void unbindService(ServiceConnection conn) {
if (conn == null) {
throw new IllegalArgumentException("connection is null");
}
if (mPackageInfo != null) {
IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
getOuterContext(), conn);
try {
ActivityManager.getService().unbindService(sd);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (IllegalArgumentException e) {
//com.google.android.gms.ui Service not registered Crash
android.util.Log.e("wjwj","---ContextImpl GMS Crash---");
e.printStackTrace();
}

} else {
throw new RuntimeException("Not supported in system context");
}
}
... ...

}
  • 3.修改思路:
    ContextImplunbindService 方法中try-catch抓住代码中抛出的异常IllegalArgumentException

在ContextImpl的unbindService 方法中try-catch IllegalArgumentException

二、gms.ui BadTokenException Crash

1.Crash Log如下:

12-31 21:01:26.711  3776  3776 E AndroidRuntime: FATAL EXCEPTION: main
12-31 21:01:26.711 3776 3776 E AndroidR
<think>嗯,用户问的是关于Android Automotive OS调试APK的内容。首先,我需要明确用户的需求。他们可能是在开发车载应用,或者在调试过程中遇到了问题,需要了解如何进行调试。接下来,我得回忆一下Android Automotive OS的基本知识,它和普通Android系统有什么不同,特别是在调试APK方面。 首先,Android Automotive OS是基于Android的车载系统,所以很多Android开发工具应该适用,比如ADB。但车载系统可能有特定的限制或配置步骤。可能需要检查是否需要启用开发者选项,或者USB调试的开启方式不同。车载系统的硬件连接可能不像手机那么直接,可能需要通过特定的端口或者无线调试。 然后,调试APK的一般步骤可能包括:配置开发环境、连接设备、安装APK、使用日志工具等。但针对Automotive OS,可能需要特定的配置,比如模拟器的使用,或者真机调试时的注意事项。例如,车载系统可能没有直接的用户界面来启用开发者选项,可能需要通过多次点击版本号或者其他方法。 另外,用户可能想知道如何部署APK到车载系统,是否需要签名,或者如何查看日志。可能还需要提到车载系统的限制,比如权限问题,或者特定API的使用。还有,调试时可能需要处理不同的屏幕尺寸、输入方式(比如旋钮或触摸屏),以及车载硬件相关的功能,如CAN总线访问。 然后,考虑用户可能的身份,他们可能是开发者,正在开发车载应用,或者是测试人员,需要调试现有的APK。如果是开发者,可能需要更详细的步骤,比如使用Android Studio配置项目,处理依赖,或者使用特定的库。如果是测试人员,可能更关注如何安装APK、抓取日志、分析崩溃等。 还要想到用户可能遇到的问题,比如连接不上设备,ADB无法识别,APK安装失败,或者运行时权限不足。这时候需要给出常见问题的解决方法,比如检查USB驱动,确认开发者模式已开启,或者检查APK的targetSdkVersion是否符合车载系统的要求。 最后,是否需要推荐一些工具或资源,比如官方文档、开发者论坛,或者特定的调试工具如Logcat、ADB命令示例。可能还需要提到车载系统的模拟器设置,因为实际硬件可能不易获取,用模拟器调试可能更方便。 总结一下,回答的结构应该包括:简介Android Automotive OS,调试前的准备工作(启用开发者选项、连接设备),安装和调试APK的具体步骤(ADB命令、Logcat使用),常见问题及解决,以及相关资源和工具推荐。同时,注意使用中文,分步骤说明,确保LaTeX格式正确,如果有数学表达式的话,不过在这个主题里可能不太需要,但如果有命令行代码,需要用代码块包裹。</think>以下是关于**Android Automotive OS调试APK**的详细介绍与操作指南: --- ### 一、Android Automotive OS 简介 Android Automotive OS(AAOS)是专为汽车设计的操作系统,基于Android平台,支持车载信息娱乐系统(IVI)。 与普通Android不同,AAOS需适配车载硬件(如车辆总线、旋钮控制等),且需通过**Google Automotive Services(GAS)**认证。 --- ### 二、调试APK前的准备工作 1. **启用开发者模式** - 在车载系统设置中,多次点击**系统版本号**(通常位于“关于车辆”菜单),直到提示“开发者模式已启用”。 - 启用**USB调试**和**ADB调试**(部分车型需通过OEM设置)。 2. **连接设备** - **USB连接**:使用Type-C/USB线连接车载主机与开发电脑。 - **无线调试**:通过ADB命令配对(需在同一网络): ```bash adb connect <车载设备IP>:<端口> ``` 3. **配置ADB环境** - 安装[Android SDK Platform Tools](https://developer.android.com/studio/releases/platform-tools),确保`adb`命令可用。 --- ### 三、安装与调试APK 1. **安装APK到车载系统** ```bash adb install -t <your-app.apk> ``` - `-t`参数允许安装到Android Automotive的“汽车应用”分类中。 2. **查看已安装应用** ```bash adb shell pm list packages | grep <your-package-name> ``` 3. **启动应用** ```bash adb shell am start -n <package-name>/<主Activity类名> ``` 4. **日志抓取** - 使用`logcat`过滤日志: ```bash adb logcat -s <TAG_NAME> # 按TAG过滤 adb logcat --pid=$(adb shell pidof -s <package-name>) # 按进程ID过滤 ``` --- ### 四、常见问题与解决方法 | 问题现象 | 可能原因 | 解决方案 | |------------------------------|------------------------------|-----------------------------------| | ADB无法识别设备 | 未启用USB调试或驱动缺失 | 检查开发者选项,安装OEM USB驱动 | | APK安装失败 | 签名冲突或权限不足 | 卸载旧版本,或添加`android:sharedUserId` | | 应用在车载系统崩溃 | 未适配车载硬件特性 | 检查`uses-feature`声明,模拟车载输入测试 | --- ### 五、高级调试技巧 1. **模拟车载输入事件** - 使用ADB发送旋钮控制信号: ```bash adb shell input keyevent KEYCODE_SYSTEM_NAVIGATION_UP # 模拟旋钮上移 ``` 2. **使用Android Automotive模拟器** - 在Android Studio中下载**Automotive OS镜像**,创建虚拟设备测试APK。 3. **分析ANR/Crash** - 拉取错误日志: ```bash adb pull /data/anr/traces.txt # ANR日志 adb pull /data/tombstones/ # Native崩溃日志 ``` --- ### 六、官方资源推荐 - [Android Automotive开发者文档](https://developer.android.com/cars) - [Google Automotive Services(GAS)认证要求](https://source.android.com/docs/devices/automotive/start/gas) - [GitHub示例代码](https://github.com/android/car-samples) --- 通过以上步骤,您可高效调试Android Automotive OS的APK,并适配车载场景的特殊需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值