android学习记录图
2023-02-03 17:28:50 0 举报
记录了android设计到的大部分知识体系,包括handler,looper,binder等
作者其他创作
大纲/内容
接口定义
进程1
Instrumentation
送到:句柄2
平台应用程序
内核
ActivityManagerService
10.newActivity
ActivityStack
对象1b
ActivityThread(主线程)
BinderProxy(句柄2)
MessageHandler
+handleMessage()
Looper Native的UML
跨进程的Binder调用
数据
App
对象1a
线程池
ContextImpl
-mPackageInfo:LoadedApk-mMainThread:ActivityThread-mBasePackageName:String-mOuterContext:Context
+getOuterContext()+getApplicationContext()+getApplicationInfo()+createPackageContext()
3.系统会通过getResource获取资源,重载了该方法返回插件的Resource,便能够访问插件的资源
句柄3
msg.when > now
ApplicationThread
句柄1
进程2
处理IdleHandler
WeakMessageHandler
#mHandler:wp<MessageHandler>
+HandleMessage()
ContextThemeWrapper
-mThemeResource:int-mTheme:Reources.Theme-mResources:Resources-mInflater:LayoutInflater+mOverrideConfiguration:Configuration
-attachBaseContext()
Context的UML图
1. exscStartActivity
findViewById
否
mMessages==null(没有消息可处理)
事务
app
zygote
1
方法调用
进入等待循环epoll
内核标记来自哪里,同时映射找到对象1,具体怎么找到后边讲到
Looper.loop()
onTransact()
这个for循环里实际上做了3个事情:1.通过MessageQueue.next 获取一个消息2.通过hadler.dispatchMessage分发处理消息3.通过message.recycleUnchecked() 做到消息的循环使用
启动虚拟机
Binder IPC 体系结构
ioctl()
循环
binder进程通信
Activity1
否mblocked=ture
Handler
Handler的UML类图结构
AMS
送到:句柄2来自:进程1
7. ScheduleLancheActivity
句柄2
Application
+mLoadedApk:LoadedApk
-attach()
对象2a
ActivityRecord
送到:对象1(数据)
Binder1b
T2
注册系统JNI函数
2. startActivity
onCreate
Zygote启动流程的调用流程图
preload
runOnce()
是
main()
1. BinderProxy继承自IBinder,实际上就是一个句柄 ,发送事务2. Binder2a继承自Binder,只要是处理onTransact()方法3. 进程1和进程2都通过 Binder2a,Binder1b 来处理事务;BinderProxy来发送事务,达到两边相互通信的目的
插件
4. startActivityMayWait
init
Binder2a
MessageQueue
#mLooper:Looper
+getLooper(rtn_looper:Looper
setContentView
getResources
Looper
#sThreadLocal:ThreadLocal<Looper>-mMainLooper:static Looper#mQueue:MessageQueue#mThread: Thread
+ preapre()+loop()+myLooper()+quit()
Context
+getApplicationContext()+getApplicationInfo()
在进程之间传输Binder对象流程
ProxyActivity
T1
对象2b
forkAndSpecialize
for()循环
+Message有一个Handler对象
msg.markInUse()
4
+Looper有一个mQueue消息队列
idleHandler数量>0
1)IBinder是Binder对象的抽象接口。其关键方法是transact,它将一个事物提交给对象。接收事务的对象可能是本地进程,也可能是另一个进程的对象;如果是另一个进程对象,则会通过前边的Binder内核模块交付给它。
1.根据Intent信息,创建插件的ClassLoader和Resource,通过反射创建PluginActivity
命令代码
4. 转发生命周期
Parcel
1. 句柄是按需分配的;2. 不用进程,句柄值相同并不意味着对应的相同
Zygote.java
startSystemServer
Binder用户空间API
返回msg
送到:对象2a来自:进程1
Ta
nextPollTimeoutMillis = msg.when - now
3)Parcel(包) 是一个容器,用于读写Binder事务中的数据。它拥有用于读和写类型化数据(整数、字符串、数组)的方法,但是更加重要的是它可以读和写对任何IBinder对象的引用,是用适当的数据结构供内核跨进程理解和传输改引用
startVm()
ActivityManagerProxy
App_man.cpp
5
onResume/onStart/onStop/onDestroy
送到:Binder2a来自:进程1
CallBack
Activity2
获取第一个异步消息
ContextWrapper
-mBase: Context
-attachBaseContext()+getBaseContext()+getApplicationContext()+getApplicationInfo()
Handler有mQueue和mLooper对象
收到信号
启动socket服务
对象1
startReg()
transact()
forkSystemServer
8
nextPollTimeoutMillis = 0
+pollOnce()+pollAll()+wake()+addFd()+sendMessage()+removeMessages()+prepare()+getForThread()+setForThread()
runSelectLoop()
AndroidRuntime.cpp
主工程
Binder用户空间
nextPollTimeoutMillis = -1
2)进程1提交事物到内核
1)进程1创建一个初始的食物结构,其中包含对象1b的本地地址2)进程1提交事物到内核3)内核查看事务中的数据,找到地址对象1b,并且创建一个针对它的新条目,因为以前并不知道该地址(进程1中的对象1b映射)4)内核利用事物的目标句柄2来确定它已在进程2中的对象2a5)内核现在将事物头重写,使其适合进程2,改变其目标为地址对象2a6)内核同样为目标进程重写事务数据;此处发现对象1b还不能被进程2识别,所以它创建一个新的句柄3,指向对象1b7)重写的事务被交付给进程2来执行8)一旦接收到事务,进程2会发现新的句柄3,并添加到句柄表中
Activity启动流程图 - 源码角度分析
送到:对象1来自:进程1(数据)
Binder分层结构图
Activity
-mApplication:Application-mWindow:Window-mHandler:Handler-mUiThread:Thread
+getApplication()+setContentView()-attach()
ActivityStackSupervisor
2
ZygoteInit.java
7
ApplicationThreadProxy
android启动流程
ZygoteConnection.java
BinderProxy(句柄3)
2)Binder是一个具体的Binder对象。实现一个Binder的子类将给你一个可以从其他进程调用的类。其关键方法是onTransact,它接收发送给它的一个事务。Binder子类的主要责任是查看它接收的事物数据,并执行适当的操作
RefBase
9.handleLaunchActivity
registerZygoteSocket
Binder内核模块(Binder Driver)
msg.target==null(是否为屏障消息)
start()
6
预加载系统资源
Message
+what:int+arg1: int+arg2:int+obj: Object#when:long#target:Handler#next:Message
+Obtain():Message+recycle()
8.handleMessage
结果代码
3. startActivity
Binder 跨进程对象映射
servicemanager
#mMessages:Message
ClassLoader
IBinder/Binder
PluginManager.startActivity(Intent)
阻塞唤醒
5. 处理Activity栈
Service
-mApplication:Application-mClassname:String-mToken:iBinder
+attach()+getApplication()
PluginActivity
接口/AIDL
11.onCreate
system_server
3
#mQueue:MessageQueue#mLooper:Looper
+dispatchMessage(msg:Message)+handleMessage(msg:Message)+obtainMessage():Message+sendMessage(msg:Message)+removeMessages()
android插件化中启动activity 的流程
6. ScheduleLancheActivity
2。调用ProxyActivity的SetContentView和findeViewById,因为PluginActivity本身的Context没有意义的
+MessageQueuey有一个mMessages消息
启动System_server
基本的Binder IPC 事务
NativeMessageQueue
+pollOnce()+wake()+handleEvent()
MessageQueue.next()
socket进程通信
0 条评论
下一页