Android源码配置第三方应用电池白名单流程分析笔记

这里以MTK6765 Android S举例说明,Android系统在加载客户应用白名单的过程。

首先Android系统可以根据不同手机厂商的需要进行源码的定制,当然定制应用白名单也是可以的,一般情况下在Android源码目录下存在一个Vendor文件夹,该文件夹是Android专门为不同手机厂商定制使用的文件夹,我们可以在里面做一些定制的操作。

Android源码配置第三方应用电池白名单流程分析笔记

一般情况下不同的项目对于白名单的需要是不一样的,所有这里只针对我们公司的某个项目而言其白名单的所在路径是/vendor/xxxxx/product/common_req/xxxx/etc/deviceidle.xml,其内容如图,好了现在我们知道了这个xml里的配置是什么样的了,问题了接下来我们要怎么在系统中去解析这个xml文件哩/p>

Android源码配置第三方应用电池白名单流程分析笔记

一般情况下我们在编译Android源码的时候是使用脚本命令去编译的,这里我展示我们公司脚本命令的一部分,就是通过PRODUCT_COPY_FILES将/vendor/xxxxx/product/common_req/xxxx/etc/deviceidle.xml的配置文件copy到手机的system/etc文件夹下为接下来framework层的解析做好准备。

Android源码配置第三方应用电池白名单流程分析笔记

 好了之前做了做了这么多的事情终于要到解析的环节了,在Android S解析白名单与之前有一些不同,Android S 使用DeviceIdleController.java中来解析/deviceidle.xml的配置(这个类在 /frameworks/base/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java),可以看到DeviceIdleController是通过一个BroadcastReceiver来接收解析deviceidle,case  Intent.ACTION_PACKAGE_ADDED为我司根据需求解析白名单的逻辑,在收到ACTION_PACKAGE_ADDED的广播之后,通过AtomicFile mConfigFileForJourney = new AtomicFile(new File(getSystemETCDir(), “deviceidle.xml”))将deviceidle.xml读取出来转换成一个AtomicFile,在通过readDefaultConfigFileLocked去解析deviceidle的格式,那么具体是怎么解析的尼/p>

 下面是该方法的具体实现,可以看见实现原理很简单,将file的输入流打开,并且将输入流传递到XmlPullParser,通过XmlPullParser来解析xml文件里的item,最后通过readConfigFileLocked函数将里面的内容读到内存里面,那么readConfigFileLocked具体干了些什么尼们继续往下看。

下面是readConfigFileLocked函数的具体实现逻辑看起来很复杂,其实没有看起来那么复杂就是按照规则去解析xml,但是我们的重点不在这里,我们接着往下看。


  1. private void readConfigFileLocked(XmlPullParser parser) {
  2. final PackageManager pm = getContext().getPackageManager();
  3. try {
  4. int type;
  5. while ((type = parser.next()) != XmlPullParser.START_TAG
  6. && type != XmlPullParser.END_DOCUMENT) {
  7. ;
  8. }
  9. if (type != XmlPullParser.START_TAG) {
  10. throw new IllegalStateException("no start tag found");
  11. }
  12. int outerDepth = parser.getDepth();
  13. while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
  14. && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
  15. if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
  16. continue;
  17. }
  18. String tagName = parser.getName();
  19. switch (tagName) {
  20. //需要加入白名单的配置
  21. case "wl":
  22. String name = parser.getAttributeValue(null, "n");
  23. 来源:勤奋的摸鱼人

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年1月22日
下一篇 2022年1月22日

相关推荐