Android8.0辅助服务AccessibilityService之巨坑-directBootAware


很久很久以前~ 这里有个坑,现在这个坑在我手上~ 怎么回事呢?

简单描述:有一个必要的服务,需要在系统启动时,在ams或者sr中直接使用startService启动,但是这个服务很遗憾的使用的是AccessibilityService(原因:历史遗留),这里面涉及到很多产品的使用,为了兼容以前的旧产品,所以不能直接修改,但是最近需要将这个应用适配至安卓8.0,那么问题来了。

启动方式是这样的:

Intent intent = new Intent();
intent.setComponent(
new ComponentName("pkg", "xxx_service"));
try {
mContext.startServiceAsUser(intent, UserHandle.OWNER);
} catch (Exception e) {
Slog.e(TAG, "Failure starting Navisetting", e);
}

放入framework,然后启动时抓了下log,看到以下两行:

01-01 01:00:08.627 2121 2121 W ActivityManager: Unable to start service Intent { cmp=pkg/.xxx.Service } U=0: not found
01-01 01:00:09.455 2121 2121 D AccessibilityManagerService: Ignoring non-encryption-aware service ComponentInfo { cmp=pkg/.xxx.Service }

容我一段时间的不知所措,什么情况,之前不好好的。问题就出在,之前也是8.0 是ok的,后面并没改什么,再编译固件发现,不ok了。

找了n久,编译了n次估计,好在公司新服务器挺快,几分钟固件就出来了,但是尝试了n次,也就只有偶然的一次成功。

然后回来仔细看日志, Ignoring non-encryption-aware service ,这个词,一看就有依据,然后去找源码,在frameworks\base\services\accessibility\java\com\android\server\accessibility\AccessibilityManagerService.java中看出了猫腻:

这里有两个条件:

if (!isUnlockingOrUnlocked && !installedService.isDirectBootAware())

第一个是是否解锁,很明显,我们肯定没解锁~解锁了还得了

第二个~ 这是什么鬼,查了一波,了解的人少之又少,这玩意根本碰不着,只知道这是Android N的新特性android:directBootAware

简单理解下, 只要isDirectBootAware() 返回true,那么这个服务就不会被忽略。去manifest找了下,确实有这么一个属性:

<service
android:directBootAware="true"

...

加上就好了。以上,浪费了我差不多一整天时间。真是浪费。

附上一篇文章,挺好的:https://www.jianshu.com/p/c84058456dbc

声明:学习路上的小脚印|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA[ZH]协议进行授权

转载:转载请注明原文链接 - Android8.0辅助服务AccessibilityService之巨坑-directBootAware


Life is very interesting. In the end, some of your greatest pains become your greatest strengths.