SystemServer程序被建立後
1.啟動Binder線程池 這樣就可以與其他程序進行通信
2.建立SystemServiceManager,用于對系統的服務進行建立、啟動和聲明周期管理
3.啟動各種系統服務
上一篇文章說到調用到了"com.android.server.SystemServer"的main方法 frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
run() frameworks/base/services/java/com/android/server/SystemServer.java
接下來分析run方法中的代碼
// The system server should never make non-oneway calls
Binder.setWarnOnBlocking(true);
這句話主要是用來設定 Binder調用時候 設定oneway 如果在系統程序發生阻塞那麼發出警告如果在此程序中生成任何阻塞綁定器事務,則發出警告。這通常隻對系統程序有用,以阻止調用外部不受信任代碼。
run() frameworks/base/services/java/com/android/server/SystemServer.java
Looper.prepareMainLooper();
這裡4兩個連結
https://blog.csdn.net/u014292433/article/details/22445293?spm=1001.2014.3001.5501
https://blog.csdn.net/u014292433/article/details/22480983?spm=1001.2014.3001.5501
run() frameworks/base/services/java/com/android/server/SystemServer.java
System.loadLibrary("android_servers");
加載so庫 查找一下看看代碼在哪
[email protected]:~/godv/AOSP/android-8.1.0_r1/frameworks$ grep "android_servers" ./ -rn
./base/services/Android.mk:68:LOCAL_MODULE:= libandroid_servers
./base/services/java/com/android/server/SystemServer.java:367: System.loadLibrary("android_servers");
Android.mk AOSP/frameworks/base/services/Android.mk
# native library
# =============================================================
include $(CLEAR_VARS)
LOCAL_SRC_FILES :=
LOCAL_SHARED_LIBRARIES :=
# include all the jni subdirs to collect their sources
include $(wildcard $(LOCAL_PATH)/*/jni/Android.mk)
LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES -DGL_GLEXT_PROTOTYPES
LOCAL_MODULE:= libandroid_servers
include $(BUILD_SHARED_LIBRARY)
就是包含在這個路徑下的 所有子產品中帶有jni的mk都包含進來了
run() frameworks/base/services/java/com/android/server/SystemServer.java
建立系統上下文
// Initialize the system context.
createSystemContext();
建立SystemServiceManager 會對系統服務進行建立、啟動、和生命周期管理
run() frameworks/base/services/java/com/android/server/SystemServer.java
// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
run() frameworks/base/services/java/com/android/server/SystemServer.java
把剛建立的 SystemServiceManager存到LocalServices中
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
run() frameworks/base/services/java/com/android/server/SystemServer.java
啟動引導服務 在這個方法中利用 建立的SystemServiceManager啟動了ActivityManagerService、PowerManagerService、PackageManagerService等服務
startBootstrapServices();
1.啟動系統服務使用 mSystemServiceManager.startService 來啟動
這裡以啟動ActivityManagerService為例
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
調用了startService其中在注釋環節已經提示這個類必須是SystemService的子類
對傳遞進來的class進行執行個體化并且調用startService方法
startService() frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
被啟動的service(例如ActivityManagerService) 需要使用自身内部一個繼承自SystemService的内部類(以下簡稱内部類)
利用SystemServiceManager(上文初始化過)對象 調用startService方法傳遞進去Class對象
此時這個對象(内部類)被存放在SystemServiceManager的mServices成員變量中 這個變量為一個ArrayList
// Services that should receive lifecycle events.
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
/**
* Creates and starts a system service. The class must be a subclass of
* {@link com.android.server.SystemService}.
* ...
*/
@SuppressWarnings("unchecked")
public <T extends SystemService> T startService(Class<T> serviceClass) {
...
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
...
startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart();
} catch (RuntimeException ex) {
...
}
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
mService.start();
}
@Override
public void onCleanupUser(int userId) {
mService.mBatteryStatsService.onCleanupUser(userId);
}
public ActivityManagerService getService() {
return mService;
}
}
mService = new ActivityManagerService(context); 這塊實際上就是new出來binder的通信類
private void start() {
...
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
...
}
run() frameworks/base/services/java/com/android/server/SystemServer.java
為系統程序設定應用程式執行個體并開始
// Set up the Application instance for the system process and get started.
traceBeginAndSlog("SetSystemProcess");
mActivityManagerService.setSystemProcess();
setSystemProcess() frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
程式在這個時候把建立好的ActivityManagerService放入ServiceManager這樣第三方應用就可以利用跨程序通信調用到了
public void setSystemProcess() {
try {
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
ServiceManager.addService("meminfo", new MemBinder(this));
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
ServiceManager.addService("dbinfo", new DbBinder(this));
...
}
對于這個服務可以使用 service list 指令檢視
generic_x86_64:/ # service list | grep activity
91 activity: [android.app.IActivityManager]
2.啟動系統服務使用PackageManagerService.main調用
這裡以PackageManagerService為例 最後也是調用了ServiceManager.addService
main() frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
public static PackageManagerService main(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
PackageManagerService m = new PackageManagerService(context, installer,
factoryTest, onlyCore);
m.enableSystemUserPackages();
ServiceManager.addService("package", m);
final PackageManagerNative pmn = m.new PackageManagerNative();
ServiceManager.addService("package_native", pmn);
return m;
}
run() frameworks/base/services/java/com/android/server/SystemServer.java
開啟消息循環
// Loop forever.
Looper.loop();
最後介紹幾個系統服務及其作用
引導服務 startBootstrapServices();
Installer 系統安裝APK時的一個服務類,啟動完成Installer服務之後才能啟動其他的系統服務
ActivityManagerService 負責四大元件的啟動、切換、排程
PowerManagerService 計算系統中和Power相關的計算,然後決策系統應該如何反應
LightService 管理和顯示背光LED
DisplayManagerService 用來管理所有的顯示裝置
UserManagerService 多使用者模式管理
SensorService 為系統提供各種感應服務
PackageManagerService 用來對apk進行安裝、解析、删除、解除安裝等操作
...
核心服務 startCoreServices();
DropBoxManagerService 用于生成和管理系統運作時的一些日志檔案
BatteryService 管理電池相關的服務
UsageStatsService 收集使用者使用每一個APP的頻率、使用時長
WebViewUpdateService WebView更新服務
其他服務 startOtherServices();
CameraService 攝像頭相關服務
AudioService 音頻相關管理服務
BluetoothService 藍牙管理服務
InputManagerService 管理輸入事件
WindowsManagerService 視窗管理服務
LocationManagerService 定位管理服務
DeviceStorageMonitorService 存儲相關管理服務
NotificationManagerService 通知管理服務
VrManagerService VR模式管理服務
AlarmManagerService 全局定時器管理服務
...