<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      Android Activity啟動流程, app啟動流程,APK打包流程, APK安裝過程

      1.Activity啟動流程 (7.0版本之前)

      從startActivity()開始,最終都會調用startActivityForResult()

      在該方法里面會調用Instrumentation.execStartActivity()執行(Instrumentation主要用來監控應用程序和系統的交互)啟動,execStartActivity()方法里面有2個方法,一個是ActivityManagerNative.getDefault().startActivity()這個方法是執行act啟動的,另外還有一個方法checkStartActivityResult(result, intent),這個方法是用來檢測啟動結果的。

      再回到啟動流程上,ActivityManagerNative.getDefault()返回的是IActivityManager,IActivityManager也是一個接口,他是實現類是一個代理類ActvityManagerProxy(他是AMS的代理,他會獲取到IBinder類型的AMS的引用),他通過IBinder向ActivityManagerService(以下簡稱AMS)發送啟動Act請求,
      接著AMS會經過一系列處理,中間會將需要創建的activity的具體信息初始化,并將其一路傳下去。最后通過app.thread.scheduleLauncherActivity來實現進程切換,啟動activity;

      app.thread指的是IApplicationThread,它的實現是ActivityThread的內部類ApplicationThread,其中ApplicationThread繼承了IApplicationThread.Stub。app指的是傳入的要啟動Activity所在的應用程序(就是你自己當前的app進程)。因為當前的AMS代碼運行在SystemServer進程中,通過這里切換回來。同時也說明ApplicationThread是應用程序與SystemServer進程溝通的橋梁。

      ApplicationThread通過scheduleLauncherActivity()向名為H的hadnler發送類型為LAUNCH_ACTIVITY的消息(此方法會將啟動act的參數封裝為ActivityClientRecord并傳遞過去),H的handleMessage里最后調用performLauncherActivity來完成act的啟動。

      先獲取ActivityInfo(用于存儲代碼已以及manifest信息,比如theme和launchmode),獲取LoadedApk,獲取ComponentName(包含Act的包名類名),啟動act上下文環境,根據ComponentName獲取類名,用類加載器創建該activity實例,創建application(如果沒有的話),接著初始化act調用activity.attach(args...),這個方法會創建window對象,然后會將Decorview添加到window中,同時會創建viewRootImpl,將Decorview和viewRootImpl關聯起來。這個viewRootImpl是完成view繪制的三大流程的(具體的時機是onResume方法第一次執行后,這時候會調用WindowManager的addView()方法,這個方法里會創建viewRootImpl對象,隨后將他跟decorview關聯起來,然后調用setview(方法),這里面調用requestlayout()來執行繪制三個流程)。

      AMS內部維護者ActivityStack(act棧),同時AMS通過ActivityThread同步activity的生命周期。

      2. app啟動流程:

      ①點擊桌面App圖標,Launcher進程采用Binder IPC向system_server進程發起startActivity請求;
      ②system_server進程接收到請求后判斷,如果不存在目標進程則通過AMS向zygote進程發送創建進程的請求(通過Socket);
      ③Zygote進程fork出新的子進程,即App進程;
      ④App進程,通過Binder IPC向sytem_server進程發起attachApplication請求;
      ⑤system_server進程在收到請求后,進行一系列準備工作后(同上),再通過binder IPC向App進程發送scheduleLaunchActivity請求;
      ⑥App進程的binder線程(ApplicationThread)在收到請求后,通過handler向主線程發送LAUNCH_ACTIVITY消息;
      ⑦主線程在收到Message后,通過反射機制創建目標Activity,并回調Activity.onCreate()等方法。
      ⑧到此,App便正式啟動,開始進入Activity生命周期,執行完onCreate/onStart/onResume方法,UI渲染結束后便可以看到App的主界面。

      相關知識:

      1.zygote

      zygote意為“受精卵“。Android是基于Linux系統的,而在Linux中,所有的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外。
      在Android系統里面,zygote是一個進程的名字。Android是基于Linux System的,當你的手機開機的時候,Linux的內核加載完成之后就會啟動一個叫“init“的進程(安卓的第一個進程)。在Linux System里面,所有的進程都是由init進程fork出來的,我們的zygote進程也不例外。
      我們都知道,每一個App其實都是
      ● 一個單獨的dalvik虛擬機
      ● 一個單獨的進程
      所以當系統里面的第一個zygote進程運行之后,在這之后再開啟App,就相當于開啟一個新的進程。而為了實現資源共用和更快的啟動速度,Android系統開啟新進程的方式,是通過fork第一個zygote進程實現的。所以說,除了第一個zygote進程,其他應用所在的進程都是zygote的子進程,這下你明白為什么這個進程叫“受精卵”了吧?因為就像是一個受精卵一樣,它能快速的分裂,并且產生遺傳物質一樣的細胞!

      2.system_server

      SystemServer也是一個進程,而且是由zygote進程fork出來的。
      知道了SystemServer的本質,我們對它就不算太陌生了,這個進程是Android Framework里面兩大非常重要的進程之一——另外一個進程就是上面的zygote進程。
      為什么說SystemServer非常重要呢?因為系統里面重要的服務都是在這個進程里面開啟的,比如 ActivityManagerService、PackageManagerService、WindowManagerService等等。

      3.ActivityManagerService

      ActivityManagerService,簡稱AMS,服務端對象,負責系統中所有Activity的生命周期。
      ActivityManagerService進行初始化的時機很明確,就是在SystemServer進程開啟的時候,就會初始化ActivityManagerService。

      3.APK打包流程:

      1.資源文件打包(布局文件xml,manifest),生成R.java。
      2.AIDL文件生成對應的java文件
      3.編譯項目源碼,生成.class文件
      4.將java文件轉換成dex文件,將java字節碼轉化為Dalvik自己餓啊,壓縮常量池
      以及清除冗余信息等。
      5.通過該APKBuilder將資源文件,dex生成apk文件
      6.keystore對apk簽名
      7.如果是正式版的apk,還會作對齊處理,就是將所有的資源文件其實距離4字節
      的整數倍,這樣通過內存訪問apk文件會更快。

       

       

      4. APK安裝過程

      1、復制APK到/data/app目錄下,解壓并掃描安裝包。
      2、資源管理器解析APK里的資源文件。
      3、解析AndroidManifest文件,并在/data/data/目錄下創建對應的應用數據目錄。
      4、然后對dex文件進行優化,并保存在dalvik-cache目錄下。
      5、將AndroidManifest文件解析出的四大組件信息注冊到PackageManagerService中。
      6、安裝完成后,發送廣播。



      posted on 2019-12-11 10:57  安卓筆記俠  閱讀(1861)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 久久综合婷婷成人网站| 成人自拍小视频免费观看| 好男人官网资源在线观看| 无码人妻aⅴ一区二区三区69岛| 99视频在线精品国自产拍| 深夜宅男福利免费在线观看 | 91精品国产自产91精品| 国产av亚洲精品ai换脸电影| 亚洲精品乱码久久久久久中文字幕| 九色综合国产一区二区三区| 护士的小嫩嫩好紧好爽| 国产熟女50岁一区二区| 国产999久久高清免费观看| 国产精品一区二区三区卡| 国产亚洲精品AA片在线播放天| 亚欧洲乱码视频在线专区| 国产在线线精品宅男网址| 中文字幕av中文字无码亚| 成人无码午夜在线观看| 人人超碰人摸人爱| 国产一区二区精品偷系列| 久久影院九九被窝爽爽| 无码福利写真片视频在线播放| 久久人人妻人人爽人人爽| 精品亚洲没码中文字幕| AV秘 无码一区二| 中文字幕人妻有码久视频| 99久久精品费精品国产一区二 | 国产激情一区二区三区午夜| 成人午夜在线观看日韩| 制服丝袜美腿一区二区| 亚洲色欲色欱WWW在线| 国产日产欧产精品精品| 久久精品国产亚洲av天海翼 | 国精偷拍一区二区三区| 中文字幕在线精品国产| 亚洲中文字幕人妻系列| 丰满人妻熟妇乱精品视频| 国产精品ⅴ无码大片在线看| 中文字幕人妻互换av久久| 久久96热在精品国产高清|