1、ActivityManager: Unable to start service Intent { act=c } U=10: not found
搜索Unable to start service,找到/frameworks/base/services/core/java/com/android/server/am/下的ActiveServices.java
2、在函数retrieveServiceLocked内部
出现Unable to start service的log,那么sInfo是null。所以问题在
ResolveInfo rInfo =
mAm.getPackageManagerInternalLocked().resolveService(service,resolvedType, flags, userId, callingUid);
3、继续找getPackageManagerInternalLocked,这个函数返回一个PackageManagerInternal的类变量,找到/frameworks/base/services/core/java/android/content/pm/下的PackageManagerInternal.java;找到resolveService的实现
这个其实是在PackageManagerService.java中实现的。
4、找到resolveService
5、找到resolveServiceInternal
6、返回null那么就是query有问题;查queryIntentServicesInternal的部分实现
7、经过加log发现,问题在getServiceInfo,找到具体实现:
8、经过加log发现问题在mSettings.isEnabledAndMatchLPr(pkg, s, flags, userId),具体实现在frameworks/base/services/core/java/com/android/server/pm下的Settings.java
9、经过加log发现问题在userState.isMatch(pkg.isSystem(), pkg.isEnabled(), component, flags);,具体实现在:frameworks/base/core/java/android/content/pm下的PackageUserState.java
10、经过加log发现:
isSystem=true,isPackageEnabled=true,isComponentEnabled=true,isComponentDirectBootAware=false,flags=0x10080400
MATCH_DIRECT_BOOT_UNAWARE = 0x00040000;
MATCH_DIRECT_BOOT_AWARE = 0x00080000;
所以问题就在isComponentDirectBootAware=false
11、查资料发现:android N的AndroidMainfest.xml加入一种新特性即:
android:directBootAware
可以看到原生蓝牙设置了android:directBootAware="true"
参考网上的说法:
Android N 引入了一个新的特性 Direct Boot Mode ,设备启动后进入一个新的模式,直到用户解锁后,此模式才会消失。此时若想启动应用,应用必须先向系统注册其组件,然后才能在Direct Boot Mode 模式下运行或访问设备加密存储。 应用通过将组件标记为“加密感知”来注册系统。 若要将您的组件标记为加密感知,请在AndroidManifest.xml中将 android:directBootAware 属性设为 true。
应用在Direct Boot Mode模式中 会收到开机广播 Intent.ACTION_LOCKED_BOOT_COMPLETED
用户解锁手机后,APP会收到另一条开机广播: Intent.ACTION_BOOT_COMPLETED