AMS和PMS过程

当activity跳转到另一个app的activity时,或者应用内activity跳转时所发生的事情大致如下

1.遍历data/app下所有的app

2.解压apk

3.dom解析AndroidManifest.xml 得到activity标签等

4.得到入口activity的全类名 或其他activity的全类名 进行反射构建对象

5.得到activity的实例

这个过程非常耗时 所以将他给PMS,和AMS管理

PMS管理 (1)(2)(3)三个步骤  AMS管理(4,5)两个步骤

(1-3)发生在开机的时候 只需要运行一次

(4-5)需要的时候

PMS:作用 包管理,包解析,结果缓存,提供查询接口


Android 7.0 PackageManagerService源码地址

android-7.0.0_r1\frameworks\base\services\core\java\com\android\server\pm

app的安装路径  mAppInstallDir 找到这个作为入口来看 如何对这个里面的文件进行操作

mAppInstallDir =new File(dataDir, "app");

找到 scanDirTracedLI(mAppInstallDir)方法中使用了该路径





上面的PackageParser 是一个重要的类.主要用来解析Package

android.content.pm.PackageParser.java

之后就调用PackageParser.java中的内容

这里的packageFile有可能是单独的base.apk文件 也有可能是一个APKs的文件夹

Parse the package at the given location. Automatically detects if the package is a monolithic style (single APK file) or cluster style (directory of APKs).

我这里简单的看一下单个目录 的形式


进入parseBaseApk()方法看一下


这里的ANDROID_MANIFEST_FILENAME 就是对应的AndroidManifest.xml 文件

这里会开始解析AndroidManifest.xml 获取到manifest标签中的versionCode versionName等信息

parseBaseApkCommon()方法中 有对应解析application标签的内容.


parseBaseApplication()方法中可以得到application标签中的内容

eg :theme,descriptionRes,taskAffinity等等

同时 application内部的标签 如 activity也在这里解析  parseActivity()方法


同時

将解析出来的结果加入了owner.activies

可以看到这里的是四大组件解析出的内容 以及其他AnroridManifest.xml中解析的内容

需要注意的是 这里的Activity不是android.app.Activity 而是PackageParser的内部类相当于一个ActivityBean存放activity的相关信息

Provider,Service,Permission 也是一样的 都是PackageParser的内部类




private ActivityparseActivity(Package owner, Resources res,

        XmlResourceParser parser, int flags, String[] outError,

        boolean receiver, boolean hardwareAccelerated)

throws XmlPullParserException, IOException { 方法就是具体解析activity/receiver的具体内容

解析<activity>过程中也会解析其子标签 如<intent-filter>

这个内容会放到ActivityIntentInfo



最终将结果缓存到mPackages中 供以后使用

final ArrayMap   <String,PackageParser.Package>mPackages = new ArrayMap();


以上是PMS的相关内容

下面看一下AMS(以API28为例)

AMS 是由Activity的启动开始  这里由启动Activity开始

startActivity  最终调用的是Activity类中的startActivity()方法

startActivity 中调用 startActivityForResult()

startActivityForResult 中 调用  Instrumentation 

mInstrumentation.execStartActivity(

this, mMainThread.getApplicationThread(), mToken, this,

    intent, requestCode, options);

Instrumentation.java 中的  execStartActivity()方法中重要 内容如下 :


int result = ActivityManager.getService()

.startActivity(whoThread, who.getBasePackageName(), intent,

            intent.resolveTypeIfNeeded(who.getContentResolver()),

            token, target !=null ? target.mEmbeddedID :null,

            requestCode, 0, null, options);


其中  ActivityManager.getService()



singleTon是一个单例模式 它的get() 对象返回的就是 它的实现类中对应的create()方法返回的内容.

所以这里的getDefault()返回的就是

final IActivityManager am = IActivityManager.Stub.asInterface(b);

这里进行了进程间通信  .这里由activty转到了AMS


也就是说调用了ActivityManagerService中的startActivity()




调用几个重载方法后  mActivityStartController.obtainStarter(intent, "startActivityAsUser") .. .execute()

其中注意这里 setMayWait(userId)将 myWait设置为true了 


obtainStarter() 返回的是ActivityStarter

也就是 后面调用ActivityStarter的 execute()方法

startActivityMayWait()方法中 重点为


ActivityStackSupervisor.java 中 resolveIntent()中涉及到了 PackageManagerService


这里的   final ActivityManagerService  mService


所以调用的是ActivityManagerService.java中的 getPackageManagerInternalLocked()方法


PackageManagerInternal 是PackageManagerService的内部类 其实现类为PackageManagerInternalImpl

private class PackageManagerInternalImpl extends PackageManagerInternal {


也就是调用这里的resolveIntent方法


这里返回的ResolveInfo就包括 应用中的一下信息等。


这样就AMS就由PMS中获取了应用的相关信息.


回到ActivtyStarter的startActivityMayWait()方法

ResolveInfo rInfo =mSupervisor.resolveIntent(intent, resolvedType, userId,

        0 /* matchFlags */,

                computeResolveFilterUid(

callingUid, realCallingUid, mRequest.filterCallingUid));

通过的该代码获取到rInfo 后,

ActivityInfo aInfo =mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);

得到 aInfo


这里开始启动activity 连续几个重载的startActivity方法


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,671评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,442评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,524评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,623评论 1 275
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,642评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,584评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,953评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,621评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,865评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,608评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,698评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,378评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,958评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,940评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,173评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,419评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,425评论 2 342

推荐阅读更多精彩内容