位置: 编程技术 - 正文

ActivityManagerService (三)

编辑:rootadmin

推荐整理分享ActivityManagerService (三),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

文章出处: (一)

ActivityManagerService (二)

接着总结:

ActivityManagerService.installSystemProviders()

从函数表面是看,获取system进程的providers,然后过滤出system的providers进行install。

1)这里的app是在之前ActivityManagerService (二)setSystemProcess中提到过的:

显然app.processName就是system,app.uid指的也是system_uid。2)通过函数generateApplicationProvidersLocked获取providers(1)AppGlobals.getPackageManager()接着:&#;曾相识过吧,在ActivityManagerService (二)setSystemProcess中提到过:不过这里是通过context获取PMS:不过最终还是会调用到ActivityThread.getPackageManager();我想这里没有用AMS中mSystemThread应该是为了区分system和非system的app吧。所以用的是一个PMS。

(2)queryContentProviders

这个函数中:

final Iterator<PackageParser.Provider> i = mProviders.mProviders.values().iterator();

不知道怎么来的,需要跟一下PMS.main,对于PMS详细过程,后期会总结,这里应该是通过PMS解析后搜集了所有的providers。

过滤条件比较多,authority不能为null,processName是system,uid是system_uid,flags的第0 bit位是FLAG_SYSTEM。

(3)app.pubProviders.ensureCapacity(N &#; app.pubProviders.size());

更新pubProviders的size。

(4)处理provider

mProviderMap.putProviderByClass(comp, cpr);//加到AMS中的ProviderMap中

app.pubProviders.put(cpi.name, cpr);//加到ProcessRecord里面的pubProviders

app.addPackage(cpi.applicationInfo.packageName, mProcessStats);//将package加到ProcessRecord中的pkgList

结合之前的AMS.setSystemProcess,这时ProcessRecord就有两个package在里面了,一个是framework-res.apk中所指的android package,另一个就是这里的process name 是system,uid是system_uid的provider。

看一下AMS和ProcessRecord中保存SettingsProvider的数据结构。

弄了半天,这样的provider在andorid系统有中有哪些呢?为什么要在AMS初始化的前期一定要初始化提出来这些provider,经过检查发现了这样的provider:

看到package name就知道了,是SettingsProvider.apk。至于SettingsProvider具体作用这里不做解释,一些系统的默认参数都是通过这里设置,通过db来实现进程间数据共享等等。

3)mSystemThread.installSystemProviders(providers);

context是上面传进来的mInitialApplication,其实就是mSystemContext。先不管ContextProviderHolder是什么,来看看获取这个cph的地方,installProvider:(1)传进来的holder是null,所以,直接进入if条件语句块。

然后试图确认packageName是否和mSystemContext的packageName一样,显然不一样,一个是com.android.providers.settings,一个android。所以,索性创建了provider自己的context:

这个函数不去详细说明,主要就是通过packageName构造一个LoadedApk,通过context init来创建一个context返回。(2)provider = localProvider.getIContentProvider();//localProvider完全可以看成是SettingsProvider集合provider定义的地方:

IContentProvider provider;

provider是个Binder,后面继续说明。

ActivityManagerService (三)

(3)localProvider.attachInfo(c, info);

创建AppOpsManager,设置SettingProvider的mMyUid,设置读写权限,设置path权限,设置mExported,最后回调SettingsProvider的onCreate函数。原来SettingsProvider在这里就创建ok了。

(4)IActivityManager.ContentProviderHolder retHolder;可以说之前的都是初始化准备工作,这里才第一次创建ContentProviderHolder 对象。当然,局部的对象,是不可能直接返回的。

(5)ProviderClientRecord pr = mLocalProvidersByName.get(cname);

之前分析过了,在generateApplicationProvidersLocked中解析Provider的时候,只是在AMS和ProcessRecord里面有保存,ActivityThread里面是没有保存的,所以这里pr是null。

所以,会实例一个ContentProviderHolder。最后installProvider方法调用installProviderAuthoritiesLocked方法构造一个ProviderClientRecord对象,并添加到mProviderMap、mLocalProviders和mLocalProvidersByName中,这三个ArraryMap可以通过不同键&#;快速找到对象的ProviderClientRecord对象。最后返回ContentProviderHolder。AcitivytThread中保存SettingsProvider的信息如下:

返回installContentProviders,既然ContentProviderHolder已经ok了,接着看下一步:

(1)第一个参数getApplicationThread()

在构造mSystemThread的时候构造的,具体的在 ActivityManagerService (二)中提到过。

(2)第二个参数就是之前创造的ContentProviderHolder

getRecordForAppLocked从mLruProcesses链表中查找并返回我们前面创建的ProcessRecord对象,我们知道在generateApplicationProvidersLocked方法中,我们将从PMS

得到的SettingsProvider信息已经添加到ProcessRecord的pubProviders数组中了,这里将provider信息添加到mProviderMap中,并从mLaunchingProviders(表示待启动的

provider列表)中移除已经启动的provider。

最后回到installSystemProviders方法中,注册一个ContentObserver来监听Settings.Secure.LONG_PRESS_TIMEOUT的变化并调用UsageStatsService去监听package的使用状态。

到这里AMS的installSystemProviders就总结完了。后期会进一步的完善。

第一章,listview的简易用法(Android) 这篇文章主要是练习了安卓listview的arrayadapter和baseadapter的简单填充。1.arrayadapter填充布局:RelativeLayoutxmlns:android=

Android调用font-awesome字体图标 spanstyle=font-family:Arial,Helvetica,sans-serif;background-color:rgb(,,);由于每次到网上找图片太麻烦,想在Android项目上调用web上的font-awesome字体库做为图标,

Android 蓝牙移植笔记 在android平台中,经常出现外围设备的移植,其中涉及到比较多模块的修改,比如kernnel,android(hardware,external,package)等模块都可能需求动。(1)驱动的添

标签: ActivityManagerService (三)

本文链接地址:https://www.jiuchutong.com/biancheng/385960.html 转载请保留说明!

上一篇:ActivityManagerService (二)

下一篇:第一章,listview的简易用法(Android)(第一章阎王点卯的小说名字)

  • 即征即退进项税额转出
  • 农业企业免哪些税款
  • 车船税每年都要交吗,一般是多少钱交强险可以晚交吗
  • 委托加工物资贷方
  • 出口资质需要哪些资质
  • 房地产企业毛利率计算公式是什么
  • 个体工商户生产经营所得怎么申报
  • 小规模纳税人无进项票怎么办
  • 建筑工人的工资应该怎样支付
  • 应收账款平均占用资金的变动额
  • 税务登记法人变更后多久生效
  • 企业网银电子商务收入是什么
  • 多出来的费用
  • 辅助生产车间最后结转到哪里
  • 高新技术企业一定是先进制造业吗
  • 如何才能成为一个好老师
  • 购买的车位应如果要进行税务处理需注意什么?
  • 企业所得税一般纳税人是怎么缴纳的
  • 国家金库为什么扣我银行里的钱
  • 房地产公司的广告语
  • 待摊费用报价变更的会计处理怎么做?
  • 凭证制单和审核可以是一个人吗
  • 流动资产的损失计入哪里
  • 公司收到境外付款的人民币
  • 工会经费的优惠政策2020
  • 平销返利税率
  • 原材料计入什么账本
  • 电脑屏幕突然黑屏怎么回事
  • 新版edge浏览器兼容模式怎么设置
  • 专家咨询费应如何支付
  • 以前年度进项税额转出会计分录怎么做
  • 预付账款流程
  • linux的ip查看
  • 贷款房屋评估费用
  • 查补以前年度收入
  • wordpress用什么语言开发
  • 照片文件夹如何压缩
  • 电脑硬盘数据恢复一般需要收费多少钱
  • Thinkphp+smarty+uploadify实现无刷新上传
  • 电影剧本如何代替
  • php限制登录次数
  • 从小规模纳税人购进农产品进项税怎么计算
  • 小规模纳税人避税
  • php比较大小
  • 什么是民办非企业属于民营经济吗
  • 伯里圣埃德蒙兹的人口
  • 店面装修费怎么算
  • 增值税纳税申报表在哪里查询
  • 基于SadTalker的AI主播,Stable Diffusion也可用
  • 人工费和劳务费怎么算
  • 应付职工薪酬属于什么会计科目
  • mongodb管理工具
  • 新建账簿的具体步骤
  • 印花税减免税优惠政策2019
  • 账面价值与计税基础的区别和联系
  • 加油站充值套路
  • 出口退税没有进项就退不了税吗?
  • 进项税转出怎样做账务处理
  • 债权资产包括哪些科目内容
  • 金税盘不申报会不会罚款
  • 挂靠企业电费如何处理?
  • 固定资产清理是资产吗
  • 建账选用什么会计制度
  • sql基础问题
  • sql平均数函数
  • win10 没有用户
  • 如何解决工作
  • win10累积更新 卡住
  • centos支持中文
  • yosemite 10.10.3 beta4 下载地址 os x10.10.3beta4官方下载
  • linux 排序统计
  • win7到欢迎界面卡半天
  • win7格式化怎么操作?
  • perl 特殊字符转义
  • javascript definitive guide
  • three.js 教程
  • 广东省电子税务局app下载手机版
  • 国家税务总局安徽省税务局公告
  • 水电费的增值税专用税可抵扣进项
  • 港股印花税什么时候下调
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设