Android4.2 原生bug,Daydream 中 点击DeskClock 中的settings button crash

DisplayàDaydream勾选Clock,点击旁边的Settings button,出现”Settings已终止”;
 

解决思路

1. 进入package/apps/Settings/src/com/android/settings/DisplaySettings.java

找到他加载的preference.xml  为display_settings

2 查找xml/display_setting内容   很明显可以知道 Daydream对应的preference为screensaver

其对应的标签fragement 为"com.android.settings.DreamSettings" 说明点击Daydream会直接进入这个类

3 查看com.android.settings.DreamSettings 因为界面内容类似ListView,所以找到相关Adapter的getView,从中找到相应的setting button

   对应的事件时调用DreamBacked.launchSettings

4 进入DreamBacked.java 中的launchSettings方法,直接通过设置Compoment启用intent,Compoment数据从getSettiingsCompoment获取

getSettiingsCompoment 执行 XmlResourceParser parser = resolverInfo.serviceinfo.loadXmlMedaData(pm.DreamService.Dream.META_DATA)

加载相关xml,解析其中的数据v

其中 resolver 在getDreamInfos函数中是过滤了Intent action为DreamService.SERVICE_Interface(android.service.dreams.DreamService)

和PackageManager.get_META_DATA,

然后就去系统所有的AndroidManifest搜索Intent 为"android.service.dreams.DreamService" ,DeskClock正好找到,并且meta_data 中指定了所需解析的xml文件,在xml/dream_info中的内容就是需要的compoment

我们发现其内容为“com.google.android.deskclock/com.android.deskclock.ScreensaverSettingsActivity”

很明星包名中的红色字体是多余的

收获:从解这个问题,也可以知道Android中的某个app是可以解析其他app的xml文件的  通过intent和meta_data来关联

posted @ 2013-03-22 18:02  xumin_minzi  阅读(514)  评论(0)    收藏  举报