亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

APP啟動時Activity的進程間通訊Binder機制

2019-11-09 15:34:12
字體:
來源:轉載
供稿:網友

一 . 理論基礎

在Android中,由于Binder通信機制的存在,進程遷移使用的非常非常頻繁,Android四大組件都可以進行進程間數據通訊。

對于Binder Service端:

(1) 定義AIDL文件來公開服務的接口(比如 scheduleLauncherActivity,bindapplication,shceduleReceiver或者mic,打開camera,點燈等等) (2)編譯AIDL生成對應的接口interface的java文件 (3)實現自定義Android系統 Service的java類,該類要求繼承(2)步中的interface的stub子類(eg:public static abstract class Stub extends android.os.Binder implements android.os.ILedService) 這樣該自定義服務變具備的 1. 硬件操控功能(實現了interface) 2.進程間通訊功能 (因為繼承了Binder) (4).將該service添加到SystemServer ( eg:ServiceManager.addService("lcled", new LedService());)

對于Binder Client端

(1)通過ServiceManager.getService("lcled")獲取遠程服務的Binder,也即是遠程Stub。(如Binder Service端(3)所示這個Stub需要實現功能接口Ixxx,又要繼承Binder類) (注意系統中首先要有ILedService 1. 可以利用mmm命令自編androdid系統生成相應的class.jar,然后以jar的形式導入android studio并在PRoject Structure設置Dependency 然后在APP中import android.os.ILedService; 2 . 可以仿造應用層,拷貝Service第一步aidl文件來生成相應的java接口類 ) (2)利用ILedService.Stub.asInterface(第(1)步的Binder) ;轉成了對應硬件功能接口的代理Proxy。因為該Proxy在aidl生成java接口類時,作為Stub的內部類已經實現了外部 父類接口,那么便可以利用Proxy擁有的成員方法訪問遠程服務,這樣實現了ipC通訊

總結: AIDL只是一個類似Webservie的功能清單接口,繼承了它的類便可以擁有對應的服務功能。

真正實現夸進程通訊的是Binder,也就是該AIDL內部的Stub類。(類似具體的SOAP了)服務的主調方獲取該Stub,然后利用該Stub內部的代理Proxy調用功能接口。

二. 開始分析Activity的啟動過程

主要涉及兩個方向的IPC通訊,分別對應不同的功能的Binder實現類

當APP代碼中調用startActivity時, startActivitForResult mInstrumentation.execStartActivity(this,mainThread.getApplicationThread(),x,x,x,x,x) { IApplicationThread whoThread =( IApplicationThread ) mainThread.getApplicationThread() //這里的 IApplicationThread 就是一個AIDL生成的功能接口類

ActivityMannagerNative.getDefault().startActivity(whoThread,x,x,x,x,x......) }

*Note** :至此出現了第一個IPC通訊,ActivityMannagerNative( ActivityManagerNative extends Binder implements IActivityManager因此這個 ActivityManagerNative對應是AIDL中的Stub)

APP端作為Binder的Client 在 ActivityMannagerNative.java的ActivityMannagerNative.getDefault()方法中

IBinder b = ServiceManager.getService("activity"); (這里獲取的是ActivityMannagerService這個Binder) if (false) { Log.v("ActivityManager", "default service binder = " + b); } IActivityManager am = asInterface(b); if (false) { Log.v("ActivityManager", "default service = " + am); } return am;我猜測這里返回了ActivityMannagerProxy,注意這個ActivityMannagerProxy肯定是ActivityMannagerNative的內部類,并且肯定實現了IActivityManager,看代碼果不其然那么繼續可以猜測ActivityMannagerService肯定繼承了ActivityMannagerNative,看源碼可以得到證實。(這里的ActivityMannagerService是具體實現IActivityManager接口功能java類,相當于繼承AIDL中內部stub的Ledservice這些具體功能類,見理論基礎第(3)步)這樣通過IPC,代碼從APP的進程切換到AMS進程system_process繼續執行

現在到AMS的startActivity

startActivity(IApplicationThread caller,x,x,x.....) startActivityAsUser(IApplicationThread caller,x,x,x.....) mStackSupervisor.startActivityMayWait(IApplicationThread caller,x,x,x.....) startActivityLocked startActivityUncheckedLocked resumeTopActivityLocked resumeTopActivityLockedInnerLocked startSpecificActivityLocked realStartActivityLocked { app.thread.scheduleLaunchActivity(new Intent(r.intent),x,x,x.....) }

Note: 這里的app.thread類型為 IApplicationThread,分析源碼發現其繼承了IInterface接口,因此也是一個Binder, 而其實app.thread就是ActivityThread.ApplicationThread,這個Binder是ActivityThread與AMS進程通信的時候傳過去的參數,也就是上面IApplicationThread whoThread 至此,第二個Binder出現了,只不過這次是以client binder出現,而APP的主線程ActivityThread的內部類ApplicationThread才是這里的stub,那么可以猜測ApplicationThread一定繼承了Binder并且是實現了IApplicationThread,觀察源碼在ActivtyThread中有內部類 ApplicationThread extends ApplicationThreadNative而 public abstract class ApplicationThreadNative extends Binder implements IApplicationThread { ,//真是果不其然

總結,app調用了startActivity后,先從ActivityThread主線程通過第一個Binder(ActivityMannagerService)切入系統system_process調用AMS功能。而后又通過第一次RPC遠程調用傳過去的Binder(ApplicationThread)切換回了APP的進程,繼續執行。而真正啟動Activiy的功能代碼肯定還是在主線程ActivitThread的內部類ApplicationThread中。

最終得到應用APP啟動的一個過程:

系統得到啟動某個APP的命令后,主動去啟動Action為android.intent.action.MAIN. category ="android.intent.category.LAUNCHER"的Activity接著通過Binder ActivityMannagerService 將該請求發給在System_process執行一些處理后,通過 ApplicationThread 這個Binder返回APP所在進程,然后在進程的主線程ActivityThread中通過給主線程的Handle發消息調用其handleLanucherActivity方法,

這里會 一. (1)獲取新Activity組件信息。 (2)利用類加載器ClassLoader創建新Activity (3)通過LoadedApl的makeApplicaotion方法創建Application(已經存在則直接返回) (4)創建contextimpl并attach到新的activity (5)將activity與window關聯 (6)mInstrumentation.callActivityOnCreate方法調用activity的onCreate方法 二. handleResumeActivity,最終調用activity的onResume方法


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成网在线播放| 久久久精品影院| 久久中文字幕国产| 久久久久久久999精品视频| 成人性生交大片免费观看嘿嘿视频| 97视频在线看| 88xx成人精品| 欧美巨乳在线观看| 亚洲电影免费观看高清完整版在线观看| 国产精品一区av| 中文字幕亚洲一区在线观看| 国产美女91呻吟求| 日韩在线视频一区| 国产日韩欧美电影在线观看| 91亚洲va在线va天堂va国| 精品亚洲国产成av人片传媒| 久久理论片午夜琪琪电影网| 色七七影院综合| 最近日韩中文字幕中文| 亚洲有声小说3d| 91久久在线视频| 国产精品精品国产| 国产精品视频1区| 亚洲人成啪啪网站| 成人网在线免费观看| 97在线观看免费| 中文字幕免费国产精品| 久久精品视频va| 一本色道久久88精品综合| 91九色单男在线观看| 欧美性精品220| 正在播放欧美一区| 97国产一区二区精品久久呦| 国产精品老女人视频| 久久夜色精品亚洲噜噜国产mv| 久久99精品久久久久久青青91| 亚洲精品国产精品乱码不99按摩| 日本国产精品视频| 欧美电影在线免费观看网站| 日韩电视剧在线观看免费网站| 国产精品免费福利| 欧美精品中文字幕一区| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲福利视频二区| 日韩一区二区三区xxxx| 欧美怡春院一区二区三区| 日韩电视剧在线观看免费网站| 国内精品视频一区| 日韩国产高清视频在线| 久久久久99精品久久久久| 国产日韩av在线播放| 一区二区在线免费视频| 欧美一级bbbbb性bbbb喷潮片| 色先锋资源久久综合5566| 欧美猛男性生活免费| 欧美野外猛男的大粗鳮| 国产不卡视频在线| 欧美专区福利在线| 日韩av免费在线看| 日韩欧美在线视频免费观看| 国产日韩亚洲欧美| 欧美wwwxxxx| 亚洲一区二区三区毛片| 欧美—级a级欧美特级ar全黄| 国产精品18久久久久久首页狼| 92国产精品久久久久首页| www.国产一区| 尤物九九久久国产精品的分类| 欧美精品18videos性欧| 日韩欧美在线网址| 日韩成人黄色av| 欧美激情视频在线免费观看 欧美视频免费一| 久久久久久久av| 欧美在线www| 7m第一福利500精品视频| 亚洲韩国青草视频| 色婷婷久久一区二区| 亚洲国产精品电影在线观看| 亚洲永久免费观看| 日韩美女在线观看一区| 亚洲久久久久久久久久| 午夜精品久久久99热福利| 国产精品狠色婷| 日韩色av导航| 国产婷婷成人久久av免费高清| 亚洲第一页在线| 亚洲va男人天堂| 欧美黑人一区二区三区| 2018国产精品视频| 日韩最新免费不卡| 91久久久久久久久久久| 亚洲欧洲午夜一线一品| 国产精品视频大全| 91免费精品国偷自产在线| 久久久中精品2020中文| 国产日韩在线亚洲字幕中文| 超碰97人人做人人爱少妇| 国产精品成人一区二区三区吃奶| 亚洲欧美国产一区二区三区| 色综合老司机第九色激情| 亚洲片国产一区一级在线观看| 91久久精品一区| 麻豆乱码国产一区二区三区| 欧美黑人巨大xxx极品| 一级做a爰片久久毛片美女图片| 久久91超碰青草是什么| 午夜精品久久久久久久久久久久久| 中文字幕欧美日韩va免费视频| 一本色道久久综合狠狠躁篇怎么玩| 国产中文字幕91| 欧美老女人性生活| 98视频在线噜噜噜国产| 蜜臀久久99精品久久久无需会员| 日韩精品视频在线免费观看| 成人h视频在线观看播放| 久久香蕉国产线看观看网| 国模精品系列视频| 国产一区二区三区精品久久久| 国产精品电影久久久久电影网| 亚洲视频第一页| 国产主播在线一区| 久久久久久久影院| 95av在线视频| 性欧美办公室18xxxxhd| xxxxxxxxx欧美| 日韩欧美在线视频免费观看| 亚洲精品久久久久久下一站| 日本视频久久久| 亚洲精品免费一区二区三区| 韩国福利视频一区| 成人高h视频在线| 91免费观看网站| 日韩在线观看精品| 欧美精品成人91久久久久久久| 日本一区二区三区在线播放| 午夜精品久久久久久久久久久久久| 色爱av美腿丝袜综合粉嫩av| 国产精品久久久久免费a∨| 亚洲美女视频网| 久久人人爽亚洲精品天堂| 欧美性猛交xxxx富婆弯腰| 国产精品成人一区二区三区吃奶| 国产成人精品在线视频| 中国china体内裑精亚洲片| 欧美成人免费网| 亚洲欧美在线x视频| 91精品免费久久久久久久久| 欧美亚洲国产视频小说| 国产精品都在这里| xxx一区二区| 中文字幕久精品免费视频| 欧美性猛交xxx| 国产精品爽爽ⅴa在线观看| 久久久久久久久久久网站| 亚洲第一区中文字幕| 亚洲网在线观看| 欧美美最猛性xxxxxx| 国产午夜精品一区二区三区| 欧美激情一区二区三级高清视频| 欧美色图在线视频| 日韩人在线观看| 欧美日韩亚洲91| 亚洲国产婷婷香蕉久久久久久| 97在线观看视频国产|