導航:首頁 > 源碼編譯 > ams源碼詳解

ams源碼詳解

發布時間:2022-10-18 14:27:35

android N 四大組件的工作原理

本文側重講解android N 系統中四大組件的工作原理,不同系統原理略有差別。通過分析四大組件的工作流程加深對Android Framework的理解,也為插件化開發打下基礎。

Activity
展示一個界面並和用戶交互,它扮演的是一個前台界面的角色。

Service
計算型組件,用於後台執行一系列計算任務,工作在主線程,耗時操作需要另起線程, 分為啟動狀態和綁定狀態。

BroadcastReceiver
消息型組件,主要用於不同組件或者不同應用之間的消息傳遞,它工作在系統內部,不適合執行耗時操作,操作超過5s,會出現ANR。

ContentProvider
數據共享型組件,用於向其他組件或者應用共享數據,主要執行CURD操作。

我們啟動一個activity有兩種方法,
第一種(Activity直接啟動方式):
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

第二種(Context啟動方式)
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);

不同的啟動方式Activity的工作流程有點差別。

兩種啟動都會調用到Instrumentation類中的execStartActivity的方法,系統最終是通過ActivityThread中的performLaunchActivity完成Activity的創建和啟動。
performLaunchActivity方法主要完成以下工作:
1、通過ActivityClientRecord對象獲取啟動activity的組件信息
2、通過mInstrumentation對象的newActivity方法調用classloader完成activity的創建
3、通過r.packageInfo(LoadedApk 對象)的makeApplication方法嘗試創建Application對象
4、創建ContextImpl對象並調用Activity的attach方法完成一些數據的初始化
5、調用Activity的onCreate方法

在Activity啟動的過程中,App進程會頻繁地與AMS進程進行通信:

App進程會委託AMS進程完成Activity生命周期的管理以及任務棧的管理;這個通信過程AMS是Server端,App進程通過持有AMS的client代理IActivityManager完成通信過程;
AMS進程完成生命周期管理以及任務棧管理後,會把控制權交給App進程,讓App進程完成Activity類對象的創建,以及生命周期回調;這個通信過程也是通過Binder完成的,App所在server端的Binder對象存在於ActivityThread的內部類ApplicationThread;AMS所在client通過持有IApplicationThread的代理對象完成對於App進程的通信。

Service有兩種啟動方式,startService()和bindService(),兩種狀態可以並存:
startService流程

bindService流程

BroadcastReceiver的工作過程主要包括廣播的注冊、發送和接收:

動態注冊過程:

發送過程

靜態注冊是由PackageManagerService(PMS)在應用安裝的時候完成整個注冊過程的,除廣播以外,其他三大組件也都是在應用安裝時由PMS解析並注冊的。

每個進程的入口都是ActivityThead.main(),App的啟動流程如下:

源碼中可以看出:
應用啟動的入口為ActivityThread的main方法,main方法會創建ActivityThread實例並創建主線程消息隊列。
attach方法中遠程調用AMS的attachApplication方法,並提供ApplicationThread用於和AMS的通信。
attachApplication方法會通過bindApplication方法和H來調回ActivityThread的handleBindApplication,這個方法會先創建Application,再載入ContentProvider,然後才會回調Application的onCreate方法。

由上圖可以看出,在ContentProvider的啟動過程中伴隨著app進程的啟動。

ContentProvider的其他CURD操作如insert,delete,update跟query的流程類似。

linux怎麼啟動 ams服務

時間:2016-03-23來源:linux網站 作者:meteorite91

最近需要使用rtmp伺服器,在red5和AMS之間選擇了AMS來搭建,說先說明一下AMS全稱是adobe media server,在5.0版本之前名稱是FMS(flash media server)。

搭建的環境:64位的centos6.5,PS:AMS只支持64位的系統,不管是windows還是Linux都只有64位,安裝之前要安裝好64位的Linux環境。

在http://www.adobe.com/support/flashmediaserver/downloads_updaters.html下載5.0.3版本的源碼包,在centos切換root許可權,解壓,進入AMS_5.0.3_r3029目錄,運行./installAMS,後面根據提示按enter等鍵即可,需要注意的是在提示輸入IP的時候最好使用自己想用的IP而不是自動檢測,默認的埠是1935和1111,其他都可以默認執行。

⑶ 為什麼在清華鏡像下載的frameworks/base的Android源碼中找不到AMS、WMS這些類

Android是一種基於Linux的自由及開放源代碼的操作系統,主要使用於移動設備,如智能手機和平板電腦,由Google公司和開放手機聯盟領導及開發。Android操作系統最初由Andy Rubin開發,主要支持手機。

⑷ AMS時間詳解

AMS規定是在船離開亞洲最後一個港口前24小時,那船公司都會提前一些,比如規定船離開亞洲最後一個港口前48小時

⑸ Android 10.0 ActivityManagerService的啟動流程

我們講完了SystemServer的啟動過程,本節主要來講解ActivityManagerService的啟動過程。ActivityManagerService簡稱AMS,管理Activity行為,控制Activity的生命周期,派發消息事件,內存管理等功能。

ActivityManagerService啟動由SystemServer中startBootstrapService啟動

ATM啟動最終調用的是ActivityTaskManagerService.Lifecycle.onStart()來啟動ATM服務的
源碼:ActivityTaskManagerService.java#Lifecycle.class

將ActivityTaskManagerInternal添加到本地服務的全局注冊表中。
ActivityTaskManagerInternal為抽象類,其實現類為ActivityTaskManagerService#LocalService.class

構造函數初始化主要工作就是初始化一些變數,供之後的service,broadcast,provider的管理和調度

start中做了兩件事

AMS的systemReady處理分為三個階段

同時獲取一些配置參數。 需要注意的是,由於只有Java進程才會向AMS注冊,而一般的Native進程不會向AMS注冊,因此此處殺死的進程是Java進程。

主要是調用一些關鍵服務的初始化函數,然後殺死那些沒有FLAG_PERSISTENT 卻在AMS啟動完成前已經存在的進程,同時獲取一些配置參數。需要注意的是,由於只有Java進程才會向AMS注冊,而一般的Native進程不會向AMS注冊,因此此處殺手的進程是Java進程。

執行goingCallback的處理,主要的工作就是通知一些服務可以進行systemReady相關的工作,並進行啟動服務或應用進程的工作

監控Native的crash,啟動WebView,執行一些服務的systemReady和systemRunning方法

啟動Home Activity,當啟動結束,發送ACTION_BOOT_COMPLETED廣播時,AMS的啟動過程告一段落

啟動Home Activity

AMS的啟動主要經歷了如下幾個階段:

⑹ App啟動流程

源碼標准:API : 29「Android 10.0」
補充知識點:
上一篇講了 Android開機流程 ,就是Zygote開始fork出SystemServer進程。
在SystemServer中會創建一個socket介面來監聽請求以及初始化AMS。
根據請求,Zygote會基於自身,預先載入的虛擬機來創建一個新的虛擬機,創建一個新的進程,來管理新的App進程。

屏幕本質上就是一個程序app,當我們安裝好app後就會出現一個圖標。

Launcher「桌面」 進程通過 Binder ICP 機制,通知ActivityManagerService「 AMS 」來創建新的進程。
也就是ActivityThread「 UI線程 」(Activity運行在ActivityThread實例中)。

ActivityThread通過 Binder ICP 機制將Binder對象傳遞給AMS,彼此進行通信。

當點擊app圖標。

這里定位到具體的點擊holder類。

真是從里尋他千網路,我快進入死循環里出不來了,多少有點費勁。
最後通過 startActivitySafely 方法,在新的Task中啟動MainActivity。

⑺ Activity的啟動流程

公眾號

面試官:說說 startActivity 吧

🤔️:startActivity 主要就是應用進程與 system_server 進程的 AMS 通信,AMS 是實際來管理 Activity 組件的,負責處理啟動模式,維護 Activity 棧等工作。startActivity 的大概流程就是由應用進程 IPC 調用到 AMS,AMS 處理完這些工作後再 IPC 回到應用進程,創建 Activity 的實例,回調 Activity 的生命周期。

面試官:通過什麼實現跨進程的呢?

🤔️:都是通過 AIDL 介面,App 進程到 systemserver 進程是通過 IActivityServerManager.aidl ,systemserver 到 App 進程通過 IApplicationThread.aidl

面試官:startActivity 時前後 Activity 的生命周期是怎樣的?

🤔️:舊 Activity 的 onPause 會先執行,然後新 Activity 依次執行 onCreate、onStart、onResume,隨後再執行舊 Activity 的 onStop...

面試官:舊 Activity 的 onPause 一定會先執行嗎,為什麼?

🤔️:這主要是 AMS 來控制的,它會先後將前一個 Activity 的 onPause 事務和新 Activity 的啟動事務發送給 App 進程,而在 App 端由 IApplicationThread.aidl 接受到後,會入隊到 ActivityThread.H 的消息隊列中,這個也是主線程消息隊列,在隊列上自然就實現了先後順序的控制

面試官:了解插件化嗎,知道怎麼啟動一個插件中的 Activity 嗎?

🤔️:主要需要解決的問題是 Activity 未在 manifest 中注冊的問題,因為在 AMS 中會檢查 Activity 是否注冊,而這個檢查邏輯處於 systemserver 進程,我們是無法 hook 的,可以在 manifest 中提前注冊一個佔位 Activity,然後 startActivity 時進入到 systemserver 進程之前,hook 把未注冊的 Activity 改為佔位 Activity,AMS 檢測就可以通過,然後再回到 App 進程後,把這個佔位 Activity 再換成插件 Activity

1.從本質來看,它不是一個線程,而是一個Java類;
2.需要在主線程的方法中被運行;
3.運行時,首先調用main方法,其中也會調用:OnAttatch,loop方法;
4.AMS--->ActivityManagerService;
5.ActivityManagerService;
5.一個線程中,只有一個Looper對象;

ActivityInfo 也是對Activity信息的描述,如主題,許可權,啟動方式,任務棧等

– ActivityRecord:可以從它的類命名知道,這個記錄Activity信息的類,主要記錄一個Activity的所有信息。一個ActivityRecord只能對應一個Activity,但是一個Activity在系統中可以存在多份實例,所以一個Activity可以對應多個ActivityRecord記錄
– TaskRecord:TaskRecord由一個或者多個ActivityRecord組成,TaskRecord就是常說的任務棧,用來記錄一個task裡面的調用Activity的相關信息
– ActivityStack:是用來管理TaskRecord的,一個ActivityStack會包含多個TaskRecord

1、Application的創建。
2、生命周期的管理。
3、啟動Activity。

ActivityManagerNative是遠程代理對象。通過ActivityManagerNative來操縱ActivityManagerService進行通信。客戶端需要和ActivityManagerService進行通信,但是它們在不同的進程中,需要進行跨進程間進行通信,底層是用Binder實現。

H類(Handler類的子類)會處理大量的ActivityManagerServer跨進程發送過來的消息,如啟動Activity,暫停Activity等等

Activity的attach方法實現了與Window對象的關聯

Activity中的Context對象向外關聯了Activity本身

ContextImpl appContext = ContextImpl.createActivityContext(this,r.packageInfo,r.token);

appContext.setOuterContext(activity);

Activity中的Context對象是每個Activity中自己的ContextImpl 類的實例對象,與Application中的Context不是同一個對象

Application 對象創建完成後會通過mInstrumentation調用自己的onCreate生命周期方法

window 給自己這只WindowManager對象

WindowManager 對象通過(WindowManager)context.getSystemService(Context.WINDOW_SERVICE)獲得

DecorView 繼承自FrameLayout的View

Activity的attach方法源碼解讀

將Context對象attachBaseContext(context);

setContentView方法源碼解析

調用PhoneWindow的setContectView

getWindow().setContentView

instrumentation.callApplicationOnCreate(app);

'app.oncreate()'

Application的真實創建過程

通過反射創建並將ContextImpl attach給自己

Application app = (Application) clazz.newInstance();

app.attach(context);

ContextImpl對象的創建時在makeApplication方法中創建的

通過ActivityThread中的Instrumentation的newApplication方法創建

Application對象並關聯了ContextImpl對象

ContextImpl appContext = ContextImpl.createAppContext(mActivityThread,this);

app = mActivityThread.mInstrumentation.newApplication(cl,appClass,appContext)

Application 的創建位置

Application app = r.packageInfo.makeApplication(false,mInstrumentation)

Activity的創建

通過類載入器載入完整的Activity類名反射創建Activity的類實例

cl.loadClass(className).newInstance();

Activity的創建機制是通過Java的反射機制創建的

handleLaunchActivity調用performLaunchActivity方法創建Activity對象

ActivityThread中的handleLaunchActivity方法中就啟動、創建第一個Activity的

在Activity的performCreate中調用自己的onCreate方法

mH當中的handleResumeActivity方法處理ActivityManagerService返送的消息

Activity的performResume()方法通過mInstrumentation.callActivityOnResume(this)方法調用到Activity的onResume()方法

WindowManager 介面,繼承與ViewManager介面

調用Activity的onResume方法後View並沒有立即被顯示在屏幕上

而是執行到mWindow.addView(decor)時

WindowManagerImpl是WindowManager的真實實現類

WindowManagerGlobal 類是具體實現對Window的管理

WindowManagerGlobal中創建了ViewRootImpl 對象root

ViewRootImpl是管理每一View的,是負責與遠程的ActivityManagerServer進行交互的

ViewRootImpl 對象的創建

root = ViewRootImpl(view.getContext(), display);

W extends IWindow.Stub

W的對象實現了與遠程ActivityManagerServer的交互

ViewRootImpl 的setView方法實現與要顯示的View進行關聯

每個View都有一個Parent,此Parent就是ViewRootImpl,ViewRootImpl負責View的繪制

當Activity的onResume 執行後,程序繼續向後執行直到執行了Activity的makeVisible()時View才真正的顯示到了屏幕上

mDecor.setVisibility(View.VISIBLE);

通過ActivityManagerNative.getDefault().activityResumed(token);

通知遠程的ActivityManagerServer當前Activity為可見狀態

destory實際並沒有直接銷毀掉activity (8.1源碼)

通過performDestroyActivity()執行相應的生命周期方法performPauseActivityIfNeeded()、callActivityOnStop()、callActivityOnDestroy和移除它的IBinder

通過WindowManager的實現類WindowManagerImpl調用removeViewImmediate(),拿到activity的實際控制類ViewRootImpl對象將他的父窗口(父布局)的指定分派為null

將activity的content清理

⑻ 亞馬遜送達ams下一步是什麼

AMS是亞馬遜提供給平台供應商的一組營銷服務。由於這是一個面向供應商的項目,所以它只能通過亞馬遜的Vendor Central(供應商中心)平台提供,賣家不能從Seller Central訪問。因此,要使用AMS,你需要收到來自Amazon to Vendor Central的邀請,或者注冊Vendor Express項目。《亞馬遜ASIN反查供應商(Beta)功能詳解》

AMS提供的廣告類型

基本上,AMS提供了三種可用的廣告類型:

1、Sponsored Procts (有時也被稱為關鍵字廣告)

2、Headline Search Ads(標題搜索廣告)

3、Proct Display Ads(產品展示廣告)

利用Sponsored Proct廣告,你可以選擇你要進行推廣的產品、關鍵字和每日預算。然後,根據你提供的關鍵字出價,與其他供應商競爭以贏得廣告展示位置。Sponsored Proct會在亞馬遜商店的關鍵字搜索結果中顯示,如下圖:

⑼ Activity、View、Window的理解一篇文章就夠了

要了解這三者之間的關系,我們帶著問題通過分析源碼一步一步來揭開它們的神秘面紗!
文章有點長,首先要理解Activity、View、Window,我提出了一些問題,這篇文章可以解答如下問題:
1、為什麼要設計Activity、View、Window?
2、Activity工作過程是什麼樣的?(理解Activity)
3、Window是什麼?它的職能是什麼?
4、View跟Window有什麼聯系?
5、Activity、View、Window三者如何關聯?

用一句話來聯系他們之間的關系:

一張圖理清所有層級關系:

好了,接下來一步一步的分析,首先從大家最熟悉的Activity開始:

一個應用程序里所有的界面展示都來自於Activity,那Activity是如何工作的呢?
Activity工作過程:
要了解Activity工作過程,首先從啟動開始,下面沒有貼源碼,因為本文章主題是三者之間的關系,而Activity東西太多了,就簡單的講一下。
啟動:
從startActivity開始,它會調用到Instrumentation,然後Instrumentation通過Binder向AMS(ActivityManagerService)發請求,通過PIC啟動Activity。而這個AIDL操作的方法定義在ApplicationThread中(裡麵包括了Activity所有的生命周期方法的調用)。然後通過Handle回到主線程啟動activity。
因為中間流程太多,詳細寫出來容易造成「見其樹木,而不見其森林」的局面。

啟動Activity所執行的操作:
1、從ActivityClientRecord中獲取待啟動的Activity組件信息
2、通過Instrumentation的newActivity方法使用類載入器創建Activity對象
3、通過LoadedApk的mackApplication方法來嘗試創建Application對象(如果Application已經創建,則不會重復創建)
4、創建ContextImpl對象,並通過Activity的attach方法來完成一些重要數據的初始化(包括讓Activity跟Window關聯)
5、調用Activity的onCreate方法

Activity其他生命周期的調用都是通過Binder向AMS發請求,然後執行的PIC操作,最後從ApplicationThread對生命周期調用。
下面是重點:Activity、View、Window三者的關系。

View如何跟Activity關聯起來的?
其實View並不是直接跟Activity關聯起來的,而是通過Window這個中間人。如前面所說,View只是窗花,Window才是直接關聯到Activity上的。那麼:
View如何跟Window關聯起來呢?

下面先了解一下Window,就可以理解這個問題了

Window如何跟Activity關聯?
每一個Activity都包含了唯一一個PhoneWindow,這個就是Activity根Window(之所以是說根Window是因為在它上面可以增加更多其他的Window,例如:彈出框(dialog))

那麼,PhoneWindow如何跟Activity關聯起來的呢?
來個最簡單的,setContentView其實就讓View與Window關聯,Window跟Activity關聯起來了。

那setContentView不是View跟Activity關聯嗎?
真相見Activity源碼:

明顯是將layout設置到Window上了,那這個 getWindow() 返回的Window是誰呢? 是不是前面提及PhoneWindow?

這么說來setContentView其實就是將View設置到Window上,Activity展示的其實是PhoneWindow上的內容。那麼其實 setContentView 實際上是調用的 getWindow().setContentView。

PhoneWindow是個什麼東西?它作為Activity跟View的中間人,它做了哪些工作?

首先 PhoneWindow 本身就是一個 Window。

從setContentView來分析:

這里的 mContentParent 其實是一個 ViewGroup。這么看來就簡單了。PhoneWindow裡麵包含了一個ViewGroup,setContentView其實就是將layout設置到了這個ViewGroup上了。

我們再看看這張圖:

DecorView是啥?
它直接跟PhoneWindow關聯起來的,有了mContentParent,為啥還需要DecorView?
如圖所見,DecorView它不僅包含了我們自己的布局,它還包含了titleBar。為啥需要?結構上的需要,更好的管理布局。

Window作為中間人,已經關聯了Activity跟View了,那麼如果處理Activity跟View之間的關系呢?
是時候揭開Window這個神秘面紗了:
之前提的PhoneWindow是繼承於Window的,它是連接Activity跟View之間的橋梁。所有對View的一些操作都需要藉助這個橋梁。

為了更好的理解Window,我們先從Dialog入手。在Activity中展示一個對話框的流程是怎樣的?
為啥從Dialog入手,因為它裡麵包含了Window,而且可以直接操作Window裡面的View,這樣就能了解Window是如何控制View的,以及自定義Window怎麼展示到Activity上(因為了解Dialog,就知道怎麼讓自定義的Window與Activity關聯了)

我們省去所有的Dialog build的方法。直接從AlertDialog.show()方法開始:

AlertDialog構造方法裡面最後執行的是這個構造方法,這里找到了亮點:
1、mWindow是啥?是不是PhoneWindow?
首先AlertDialog是繼承Dialog的,mWindow就是Dialog裡面初始化的對象,看看是不是PhoneWindow,如果是,那麼就可以猜到通過在PhoneWindow添加View就可以在Activity上展示了,因為經過上面分析Activity是跟PhoneWindow有關聯的。帶著問題繼續分析源碼:

2、AlertController是啥?

從這兩個屬性就知道了,設置Title、Message的。用過Dialog的人都知道他們是啥,就不多說了。

既然這樣關聯起來了,那麼Window怎麼對View操控的呢?

WindowManager是主角。
在Dialog build之後就將View設置進來了,繼續追蹤Dialog show()這個方法,這個方法會將View與Window相互聯系:

mWindowManager.addView,看到這個方法,可以猜想到WindowManager是個啥玩意了。

總結:
1、為什麼要設計Activity、View、Window?
Activity就像工匠,Window就像是窗戶,View就像是窗花,LayoutInflater像剪刀,Xml配置像窗花圖紙。
Android根據他們不同的職能讓他們各斯其活,同時也相互配合展示給我們靈活、精緻的界面。為啥這樣設計?因為這樣的結構更好管理。就像為啥需要使用MVP、MVVM、各種設計模式一樣。

2、Activity工作過程是什麼樣的?
以Activity啟動過程為例,Activity啟動時是通過Binder向AMS(ActivityManagerService)發請求,通過PIC啟動Activity的。

3、Window是什麼?它的職能是什麼?
Activity要管理View需要通過Window來間接管理的。Window通過addView()、removeView()、updateViewLayout()這三個方法來管理View的。

4、View跟Window有什麼聯系?
View需要通過Window來展示在Activity上。

5、Activity、View、Window三者如何關聯?
Activity包含了一個PhoneWindow,而PhoneWindow就是繼承於Window的,Activity通過setContentView將View設置到了PhoneWindow上,而View通過WindowManager的addView()、removeView()、updateViewLayout()對View進行管理。Window的添加過程以及Activity的啟動流程都是一次IPC的過程。Activity的啟動需要通過AMS完成;Window的添加過程需要通過WindowSession完成。

你竟然看完了,非常感謝你的支持,希望這篇文章對你有幫助~

————2020年3月11日 更新
最近建了微信公眾號和微博,由我(卷子)和我的好朋友(櫻桃)兩只小程序媛經營的。
我們都喜歡程序員這個呆萌的群體,我們希望能給你帶來技術上的幫助以及生活上的快樂。嘿嘿~唯一的私心就是 希望你能喜歡我們咯。
大哥,我先敬你一瓶,先干為盡

⑽ ams中編譯如何生成目標文件

o文件是不能被執行的, c的源碼要經過編譯和鏈接才能生成可執行文件,

閱讀全文

與ams源碼詳解相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:422
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:192
pdf劈開合並 瀏覽:28
不能修改的pdf 瀏覽:752
同城公眾源碼 瀏覽:489
一個伺服器2個埠怎麼映射 瀏覽:298
java字元串ascii碼 瀏覽:79
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:946
安卓導航無聲音怎麼維修 瀏覽:333
app怎麼裝視頻 瀏覽:431
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491