国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
下接 android linux 基礎(chǔ)知識總結(jié)[下]6
int do_class_start(int nargs, char **args)
{
/* Starting a class does not start services
* which are explicitly disabled. They must
* be started individually.
*/
service_for_each_class(args[1], service_start_if_not_disabled);
return 0;
}
void service_for_each_class(const char *classname,
void (*func)(struct service *svc))
{
struct listnode *node;
struct service *svc;
list_for_each(node, &service_list) {
svc = node_to_item(node, struct service, slist);
if (!strcmp(svc->classname, classname)) {
func(svc);
}
}
}
因為在調(diào)用 parse_service() 添加服務(wù)列表的時候,所有服務(wù) svc->classname 默認取值:"default",
所以 service_list 中的所有服務(wù)將會被執(zhí)行。
參考文檔:
http://blog.chinaunix.net/u1/38994/showart_1775465.html
http://blog.chinaunix.net/u1/38994/showart_1168440.html
淺析kernel啟動的第1個用戶進程init如何解讀init.rc腳本
http://blog.chinaunix.net/u1/38994/showart_1168440.html
Zygote 服務(wù)概論:
Zygote 是android 系統(tǒng)中最重要的一個服務(wù),它將一步一步完成下面的任務(wù):
start Android Java Runtime and start system server. It’s the most important service. The source is in device/servers/app.
1. 創(chuàng)建JAVA 虛擬機
2. 為JAVA 虛擬機注冊android 本地函數(shù)
3. 調(diào)用 com.android.internal.os.ZygoteInit 類中的main函數(shù),android/com/android/internal/os/ZygoteInit.java.
a) 裝載ZygoteInit類
b) 注冊zygote socket
c) 裝載preload classes(the default file is device/java/android/preloaded-classes)
d) 裝載Load preload 資源
e) 調(diào)用 Zygote::forkSystemServer (定義在./dalvik/vm/InternalNative.c)來fork一個新的進程,在新進程中調(diào)用 
com.android.server.SystemServer 的main函數(shù)。
a) 裝載 libandroid_servers.so庫
bb) 調(diào)用JNI native init1 函數(shù) (device/libs/android_servers/com_android_server_SystemServers)
Load libandroid_servers.so
Call JNI native init1 function implemented in device/libs/android_servers/com_android_server_SystemServers. 
It only calls system_init implemented in device/servers/system/library/system_init.cpp.
If running on simulator, instantiate AudioFlinger, MediaPlayerService and CameraService here.
Call init2 function in JAVA class named com.android.server.SystemServer, whose source is in 
device/java/services/com/android/server. This function is very critical for Android because it start all of 
Android JAVA services.
If not running on simulator, call IPCThreadState::self()->joinThreadPool() to enter into service dispatcher.
SystemServer::init2 將會啟動一個新的線程來啟動下面的所有JAVA服務(wù):
Core 服務(wù):
1. Starting Power Manager(電源管理)
2. Creating Activity Manager(活動服務(wù))
3. Starting Telephony Registry(電話注冊服務(wù))
4. Starting Package Manager(包管理器)
5. Set Activity Manager Service as System Process
6. Starting Context Manager
7. Starting System Context Providers
8. Starting Battery Service(電池服務(wù))
9. Starting Alarm Manager(鬧鐘服務(wù))
10. Starting Sensor Service
11. Starting Window Manager(啟動窗口管理器)
12. Starting Bluetooth Service(藍牙服務(wù))
13. Starting Mount Service
其他services:
1. Starting Status Bar Service(狀態(tài)服務(wù))
2. Starting Hardware Service(硬件服務(wù))
3. Starting NetStat Service(網(wǎng)絡(luò)狀態(tài)服務(wù))
4. Starting Connectivity Service
5. Starting Notification Manager
6. Starting DeviceStorageMonitor Service
7. Starting Location Manager
8. Starting Search Service(查詢服務(wù))
9. Starting Clipboard Service
10. Starting Checkin Service
11. Starting Wallpaper Service
12. Starting Audio Service
13. Starting HeadsetObserver
14. Starting AdbSettingsObserver
最后SystemServer::init2 將會調(diào)用 ActivityManagerService.systemReady 通過發(fā)送
Intent.CATEGORY_HOME intent來啟動第一個 activity.還有另外一種啟動system server的方法是:
通過名為 system_server的程序(源代碼:device/servers/system/system_main.cpp)它也是通過
調(diào)用 system_init 來啟動 system services,這時候就有個問題:為什么android 有兩種方式啟動system services?
我的猜想是:
My guess is that directly start system_server may have synchronous problem with zygote because 
system_server will call JNI to start SystemServer::init2, while at that time zygote may not start 
JAVA VM yet. So Android uses another method. After zynote is initialized, fork a new process to 
start system services.
Zygote服務(wù)啟動的詳細過程:
通過啟動服務(wù)列表的 app_process 進程,實際上進入的是
App_main.cpp (frameworks\base\cmds\app_process)
main()
根據(jù) init.rc 中的 --zygote --start-system-server
分別調(diào)用的是
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
或者
runtime.start();
start()函數(shù)在 AndroidRuntime.cpp (frameworks\base\core\jni)文件中
從打印信息:
D/AndroidRuntime(56): >>>>>>>>>>>>>>AndroidRuntime START GetStaticMethodID(startClass,"main","([Ljava/lang/String;)V");
從上面的調(diào)用可以看出一類引用的過程都是從 main方法
所以接著調(diào)用了 ZygoteInit 類的main方法
main方法主要完成:
1.Register zygote socket, Registers a server socket for zygote command connections
2.Load preload classes(the default file is device/java/android/preloaded-classes).
3.Load preload resources, Load in commonly used resources, so they can be shared across processes.
4.Start SystemServer, Prepare the arguments and fork for the system server process.
具體執(zhí)行過程如下:
ZygoteInit.java (frameworks\base\core\java\com\android\internal\os)中的mian
main()
registerZygoteSocket()
preloadClasses()
loadLibrary()
Log.i(TAG, "Preloading classes...");
Runtime.loadLibrary
Dalvik_java_lang_Runtime_nativeLoad()
dvmLoadNativeCode()
LOGD("Trying to load lib %s %p\n", pathName, classLoader);
System.loadLibrary("media_jni");
preloadResources();
startSystemServer()
Zygote.forkSystemServer(parsedArgs.uid, parsedArgs.gid,parsedArgs.gids, debugFlags, null);
//Zygote.java (dalvik\libcore\dalvik\src\main\java\dalvik\system)
forkSystemServer()
forkAndSpecialize() //Zygote.java (dalvik\libcore\dalvik\src\main\java\dalvik\system)
Dalvik_dalvik_system_Zygote_forkAndSpecialize() //dalvik_system_Zygote.c (dalvik\vm\native)
Dalvik_dalvik_system_Zygote_forkAndSpecialize()
setSignalHandler()
fork()
handleSystemServerProcess() //handleChildProc(parsedArgs, descriptors, newStderr);
closeServerSocket();
RuntimeInit.zygoteInit(parsedArgs.remainingArgs);
zygoteInit() //RuntimeInit.java (frameworks\base\core\java\com\android\internal\os)
zygoteInitNative()
invokeStaticMain()
System.loadLibrary("android_servers");
//com.android.server.SystemServer startSystemServer() 函數(shù)中
m = cl.getMethod("main", new Class[] { String[].class });
//執(zhí)行的是SystemServer 類的main函數(shù) SystemServer.java (frameworks\base\services\java\com\android\server)
init1() //SystemServer.java (frameworks\base\services\java\com\android\server) 
//init1()實際上是調(diào)用android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
//com_android_server_SystemServer.cpp (frameworks\base\services\jni)
android_server_SystemServer_init1()//JNI 調(diào)用
system_init() //System_init.cpp (frameworks\base\cmds\system_server\library)
// Start the SurfaceFlinger
SurfaceFlinger::instantiate();
//Start the AudioFlinger media playback camera service
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
//調(diào)用 SystemServer 類的init2
runtime->callStatic("com/android/server/SystemServer", "init2");
init2()//SystemServer.java (frameworks\base\services\java\com\android\server)
ServerThread()
run()//在run中啟動電源管理,藍牙,等核心服務(wù)以及狀態(tài),查找等其他服務(wù)
((ActivityManagerService)ServiceManager.getService("activity")).setWindowManager(wm);
...
ActivityManagerNative.getDefault().systemReady(); 
runSelectLoopMode();
done = peers.get(index).runOnce();
forkAndSpecialize() //Zygote.java (dalvik\libcore\dalvik\src\main\java\dalvik\system)
Dalvik_dalvik_system_Zygote_forkAndSpecialize() //dalvik_system_Zygote.c (dalvik\vm\native)
forkAndSpecializeCommon() 
setSignalHandler()
RETURN_INT(pid); 
closeServerSocket();
見附A
主進程runSelectLoopMode()
5.Runs the zygote process's select loop runSelectLoopMode(), Accepts new connections as they happen, and 
reads commands from connections one spawn-request's worth at a time.
如果運行正常,則zygote進程會在runSelectLoopMode()中循環(huán):
zygote 被siganl(11)終止
在 dalvik_system_Zygote.c (dalvik\vm\native)
的 static void sigchldHandler(int s) 函數(shù)中打印: 
"Process %d terminated by signal (%d)\n",
"Exit zygote because system server (%d) has terminated\n",
startSystemServer() ZygoteInit.java (frameworks\base\core\java\com\android\internal\os)
SystemServer 的mian()函數(shù)會調(diào)用
SystemServer.java (frameworks\base\services\java\com\android\server)中的 init1()函數(shù)。
init1()實際執(zhí)行的是com_android_server_SystemServer.cpp (frameworks\base\services\jni)
中的 android_server_SystemServer_init1()。
android_server_SystemServer_init1()調(diào)用的是
System_init.cpp (frameworks\base\cmds\system_server\library) 中的 system_init()函數(shù)
system_init()函數(shù)定義如下:
extern "C" status_t system_init()
{
...
sp sm = defaultServiceManager();
...
property_get("system_init.startsurfaceflinger", propBuf, "1");
if (strcmp(propBuf, "1") == 0) {
//讀取屬性服務(wù)器,開啟啟動 SurfaceFlinger服務(wù)
//接著會開始顯示機器人圖標
//BootAnimation.cpp (frameworks\base\libs\surfaceflinger):status_t BootAnimation::readyToRun()
SurfaceFlinger::instantiate();
}
//在模擬器上 audioflinger 等幾個服務(wù)與設(shè)備上的啟動過程不一樣,所以
//我們在這里啟動他們。
if (!proc->supportsProcesses()) {
//啟動 AudioFlinger,media playback service,camera service服務(wù)
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
}
//現(xiàn)在開始運行 the Android runtime ,我們這樣做的目的是因為必須在 core system services
//起來以后才能 Android runtime initialization,其他服務(wù)在調(diào)用他們自己的main()時,都會
//調(diào)用 Android runtime
//before calling the init function.
LOGI("System server: starting Android runtime.\n");
AndroidRuntime* runtime = AndroidRuntime::getRuntime();
LOGI("System server: starting Android services.\n");
//調(diào)用 SystemServer.java (frameworks\base\services\java\com\android\server)
//中的init2函數(shù)
runtime->callStatic("com/android/server/SystemServer", "init2");

// If running in our own process, just go into the thread
// pool. Otherwise, call the initialization finished
// func to let this process continue its initilization.
if (proc->supportsProcesses()) {
LOGI("System server: entering thread pool.\n");
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
LOGI("System server: exiting thread pool.\n");
}
return NO_ERROR;
}
System server: entering thread pool 表明已經(jīng)進入服務(wù)線程 ServerThread
在 ServerThread 類的run 服務(wù)中開啟核心服務(wù):
@Override
public void run() {
EventLog.writeEvent(LOG_BOOT_PROGRESS_SYSTEM_RUN,
SystemClock.uptimeMillis());
ActivityManagerService.prepareTraceFile(false); // create dir
Looper.prepare();
//設(shè)置線程的優(yōu)先級
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
...
//關(guān)鍵(核心)服務(wù)
try {
Log.i(TAG, "Starting Power Manager.");
Log.i(TAG, "Starting activity Manager.");
Log.i(TAG, "Starting telephony registry");
Log.i(TAG, "Starting Package Manager.");
Log.i(TAG, "tarting Content Manager.");
Log.i(TAG, "Starting System Content Providers.");
Log.i(TAG, "Starting Battery Service.");
Log.i(TAG, "Starting Alarm Manager.");
Log.i(TAG, "Starting Sensor Service.");
Log.i(TAG, "Starting Window Manager.");
Log.i(TAG, "Starting Bluetooth Service.");
//如果是模擬器,那么跳過藍牙服務(wù)。
// Skip Bluetooth if we have an emulator kernel
//其他的服務(wù)
Log.i(TAG, "Starting Status Bar Service.");
Log.i(TAG, "Starting Clipboard Service.");
Log.i(TAG, "Starting Input Method Service.");
Log.i(TAG, "Starting Hardware Service.");
Log.i(TAG, "Starting NetStat Service.");
Log.i(TAG, "Starting Connectivity Service.");
Log.i(TAG, "Starting Notification Manager.");
// MountService must start after NotificationManagerService
Log.i(TAG, "Starting Mount Service.");
Log.i(TAG, "Starting DeviceStorageMonitor service");
Log.i(TAG, "Starting Location Manager.");
Log.i(TAG, "Starting Search Service.");
...
if (INCLUDE_DEMO) {
Log.i(TAG, "Installing demo data...");
(new DemoThread(context)).start();
}
try {
Log.i(TAG, "Starting Checkin Service.");
Intent intent = new Intent().setComponent(new ComponentName(
"com.google.android.server.checkin",
"com.google.android.server.checkin.CheckinService"));
if (context.startService(intent) == null) {
Log.w(TAG, "Using fallback Checkin Service.");
ServiceManager.addService("checkin", new FallbackCheckinService(context));
}
} catch (Throwable e) {
Log.e(TAG, "Failure starting Checkin Service", e);
}
Log.i(TAG, "Starting Wallpaper Service");
Log.i(TAG, "Starting Audio Service");
Log.i(TAG, "Starting HeadsetObserver");
Log.i(TAG, "Starting AppWidget Service");
...
try {
com.android.server.status.StatusBarPolicy.installIcons(context, statusBar);
} catch (Throwable e) {
Log.e(TAG, "Failure installing status bar icons", e);
}
}
// make sure the ADB_ENABLED setting value matches the secure property value
Settings.Secure.putInt(mContentResolver, Settings.Secure.ADB_ENABLED,
"1".equals(SystemProperties.get("persist.service.adb.enable")) ? 1 : 0);
// register observer to listen for settings changes
mContentResolver.registerContentObserver(Settings.Secure.getUriFor(Settings.Secure.ADB_ENABLED),
false, new AdbSettingsObserver());
// It is now time to start up the app processes...
boolean safeMode = wm.detectSafeMode();
if (statusBar != null) {
statusBar.systemReady();
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android init 啟動過程分析 - gpephone
Android 核心分析 之八------Android 啟動過程詳解
android boot 代碼流程 2
Android 系統(tǒng)啟動
Android之system_server與zygote之作用
Android啟動過程圖解
更多類似文章 >>
生活服務(wù)
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服