DrawableRequestBuilder
startActivityLocked
ApkBundleLauncher.loadBundle(构建 sLoadedApks 列表,每一项对应一个 LoadedApk 对象)
ActivityThread
handleCreateService
RequestManagerRetriever.get()
XXXContentProvider
startActivityMayWait
installProvider
nextWaiter
[Step 3]expandNativeLibraryDirectories
firstWaiter
startActivityForResult
ActivityLauncher.preloadBundlereturn pkg == null || pkg.equals(\"main\")
ActivityThread#handleLaunchActivity
ActivityStackSupervisor
pre
通过 localProvider 的 getIContentProvider 返回 provider,其类型为 Transport
WebBundlerLauncher
ApplicationThreadProxy
Task(表示用户设置的一个任务项)
mId : StringmTitle : StringmDescription : StringmCompleted : boolean
ResourcesImpl[ResourcesImpl 再通过 AssetManager 去访问资源]
- mAssets : AssetManager
forkAndSpecialize该方法会调用一次,返回两次,根据 pid 判断是否是 fork 出的子进程
创建 RequestManager,并将它作为 Fragment 的一个成员变量
ApkBundleLauncher
ZygoteConnection
DrawableOptions
AssetBundleLauncher
DexFile
static loadDex()
Set
DexClassLoader
retrieveServiceLocked
目标 Service 所在进程的 ActivityThreadProxy
调用 ActivittThread 的 main 方法
ContentResolver
zygote
scheduleCreateServicescheduleBindService
调用 startProcessLocked 方法,先启动所有者的进程
AQS
3.安装
AQS.Node
ActivityManagerProxy
返回 ContentProviderHolder
BundlerLauncher.preloadBundle,如果返回值为 false,那么就不执行下面的方法,默认是返回 true
BaseDexClassLoader
- pathList : DexPathList
+ findClass+ findResource+ findResources+ findLibrary
startProcessLocked
socket 通信,通知其从阻塞上返回
[Step 2]expandDexPathList
HashSet
调用对应 ActivityThread的 getTopLevelResources 方法
ActivityLauncher.setUp通过 PackageManager 构建sActivityClasses
ApplicationContentResolver
- mMainThread : ActivityThread- mUser : UserHandler
MutableList
app.thread.scheduleCreateService
ApkBundleLauncher.postSetUp
接口
Scheduler computation(); Scheduler io(); Scheduler ui();
head
realStartActivityLocked
加入到等待启动的队伍中,等待进程启动完毕之后,再启动该 Service
遍历 sBundleLaunchers 的 setUp 方法
ActivityManagerProxy
直接返回 IActivityManager.ContentProviderHolder 对象,给调用者进程
Binder
2.将返回的结果封装成为 ServiceLookupResult
startActivityAsUser
ActivityManagerService
startService
创建 Context 并且赋值
TaskDataSource(数据源的抽象接口)
ObservableList getTasks(); Observable getTask(@NonNull String taskId); void saveTask(@NonNull Task task); void completeTask(@NonNull Task task); void completeTask(@NonNull String taskId); void activateTask(@NonNull Task task); void activateTask(@NonNull String taskId); void clearCompletedTasks(); void refreshTasks(); void deleteAllTasks(); void deleteTask(@NonNull String taskId);
startServiceInnerLocked
创建 Application
ArrayList
execStartActivity
调用 AMS 的 publishContentProviders 进行安装
ContextWrapper
- mBase : ContextImpl
getResources() : Resources
system_server
ContentProviderNative
如果没有创建进程,那么先创建进程
nativeForkAndSpecialize
AssetBundleLauncher.loadBundle调用 bundle.setURL(url) 方法
通过 FragmentManager 将 Fragment 添加到布局中
通过 Start 方式启动的服务
startActivityUncheckedLocked
ContextImpl
- mResources : Resources- mPackageInfo : LoadedApk
创建返回给调用者的 IActivityManager.ContentProviderHolder 实例
tail
resumeTopActivitiesLocked
sendServiceArgsLocked
ContentProvider 所在进程已经启动,并且已经该 ContentProvider 已经被安装
startPausingLocked
handleInstallProvider(ProviderInfo info)
SchedulerProvider
Zygote
bringUpServiceLocked
ActivityBundleLauncher
IActivityManager.ContentProvderHolder
info : ProviderInfoprovider : IContentProviderconnection : IBindernoReleaseNeeded : boolean
fork 子进程
TasksLocalDataSource
Transport
2.返回 ContentProviderHolder
LoadedApk
调用 AMS 的 getContentProvider 方法
List
- mResources- mMainThread : ActivityThread
getResources(ActivityThread)
startActivityLockedstartWindow 创建的地方
[Step 5]调用插件的 Application 的 onCreate 方法
checkAppSwitchAllowedLocked
ApkBundleLauncher.setUp设置动态代理 IMPL
NativeLibraryElement
ResourcesManager
遍历 sBoundleLaunchers 的 resolveBundle(Bundle) 方法,参数为this
localProvider.attachInfo 在进行完权限检查之后检查它的 onCreate 方法
attachApplicationLocked
进程存在,并且 Service 已经启动
attachApplication
bindApplication
startSpecificActivityLocked
requestServiceBindingsLocked
mResources 的赋值,来自于与该 ContextImpl 所关联的 LoadedApk
lastWaiter
Collection
向主线程发送 H.SET_CORE_SETTINGS 和 H.BIND_APPLICATION 消息
startActivity
3.开始启动 Service的流程
next
ResourcesManager 负责管理应用程序内的资源获取类 Resources
如果 Service 所在进程已经启动
调用 ApplicationThread 调用到 ContentProvider 实现进程的 scheduleInstallProvider 方法中
main
invokeStaticMain
调用本地的 installProvider 方法
DexPathList
- definingContext : ClassLoader- dexElements : Element[]- nativeLibraryPathElements : NativeLibraryElement[]- nativeLibraryDirectories : List- dexElementsSuppressedExceptions : IOException[]
MutableSet
Small.setUp
AssetManager[资源访问的执行者]
addAssetPath(String) : int
provider 变量
BundlerLauncher.loadBundle
IInterface
目标 Service 所在进程的 ApplicationThread
- mService : ActiveService
bindService
doPendingActivityLaunchesLocked
start
Bundle.loadBundles(Context)
[Step 3]Bundle.loadBundles(List)
Process.start()返回 Process.ProcessStartResult
1.如果在调用者进程当中,已经存在缓存,那么直接返回即可。
[Step 4]installContentProviders
applicationInit
resolveActivity通过 PMS resolveIntent 找到目标 Activity
pauseBackStacks
[Step 2]Bundle.setupLaunchers(Context)
realStartServiceLocked
Element
- path : File- dexFile : DexFile
[Step 1]mergeResources
通过反射创建 localProvider,其类型为 ContentProvider,也就是我们所实现的 ContentProvider 的子类。
DownloadOptions
runOnce
获取 IServiceConnection
Binder 通信
ResourcesKey[作为缓存的 key 值]
- mResDir : String[]
ClassLoader
+ loadClass
IContentProvider
+ query()+ update()+ delete()+ insert
ImmediateSchedulerProvider
handleBindApplication
MutableIterable
SoBundleLauncher.preloadBundle一系列逻辑判断,因为继承关系,该函数决定了 ApkBundleLauncher 和 WebBundleLauncher 会不会执行
在 ActivityThread 中有一个单例实现的 ResourcesManager,最后是通过它的 getResources 方法获取的
遍历 sBundleLaunchers 的 postSetUp 方法
- mResourcesManager : ResourcesManager
Iterable
+ query() : Cursor
ZygoteInit
WebBundleLauncher.setUp执行 new android.webkit.WebView 操作
PathClassLoader
被唤醒后创建连接
TasksRepository
mTasksRemoteDataSource : TaskDataSource 远程数据源mTasksLocalDataSource : TaskDataSource 本地数据源
zygoteSendArgsAndGetResult通过 socket 通道向 zygote 发送一个参数列表,然后进入阻塞等待状态,直到远端的 socket 服务器返回新创建进程的 pid 才返回。
App
Condition
调用者进程的 AcitivityManagerProxy
MutableCollection
目标 Service
如果 Service 所在的进程没有启动
BundlerLauncher
ContentProvider 所在进程没有启动
BitmapOptions
openZygoteSocketIfNeeded(abi)根据当前的 abi 来选择是和 zygote 还是 zygote64 通信
LoadApk.makeApplication
通过 mH 变量回调到主线程的ActivityThread 当中
app.thread.scheduleServiceArgs
2.如果不存在缓存,那么需要通过 AMS 调用
1.请求
Resources[外部调用者的接口,调用内部的 ResourcesImpl]
- mResourcesImpl : ResourcesImpl- mTypedArrayPool : SynchronizedPool
Transport 是其内部变量
[Step 1]解析 Bundle.json 文件,封装成一个 Manifest 对象,包含版本号,以及一个 List 列表
Activity
+ acquireProvider : IContentProvider
mPendingServices.add(r)
requestServiceBindingLocked
ProviderClientRecord
+ mNames : String[]+ mProvider : IContentProvider+ mLocalProvider : ContentProvider+ mHolder : IActivityManager.ContentProviderHolder
resumeTopActivityLocked
r.app.thread.scheduleBindService
- mContentResolver : ApplicationContentResolver
+ getContentResolver()
ContentProvider 所在进程已经启动,但是该 ContentProvider 没有被安装
mHolder 变量
BundlerExtractor
installContentProviders
1.根据 Intent 查找目标 Service
mProvider 变量
resumeTopActivityInnerLocked
attach(false)
ActiveService
bindServiceLocked
返回单例的 RequestManagerRetriver 对象
Bundle.loadLaunchableBundles(OnCompleteListener)
回调对应的生命周期
ApplicationThread
遍历每个 Bundle 的 prepareForLaunch 方法
调用 mBase 的对应方法
SoBundlerLauncher
handleChildProc
startService的调用者所在进程
ZygoteHooks#postForkCommon重新启动 4 个 Daemon 子线程
DrawableTypeRequest
getContentProviderImpl 根据所有者进程所处的状态,返回一个 ContentProviderHolder 对象给调用者
Process
mLocalProvider 变量
进程存在,但 Service 没有启动
ActivityStack
如果是子进程
Zygote fork
进程不存在
Instrumentation
zygoteInit
通过 Bind 方式启动的服务
ZygoteHooks#preFork停止 4 个 Daemon 子线程的运行,等待并确保 Zygote 是单线程,并等待这些线程的停止,初始化 gc 堆的工作,将线程转换为 long 并保存到 token