日韩av色在线_av不卡在线观看_亚洲国产精品第一页_在线看日本不卡_色成人综合网_国产丝袜在线视频_国产精成人品localhost_国产91富婆露脸刺激对白_韩国视频一区_国产精品人成电影

當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > Android本地服務的啟動
Android本地服務的啟動
時間:2016-12-12作者:華清遠見

通過上一節Android init進程啟動的分析可知,init進程在啟動過程中,解析并處理了init.rc和init.hardware.rc兩個初始化腳本文件,在兩個初始化腳本文件里,定義了一系列的service section,這些service在boot觸發器下,通過class_start default依次啟動,其過程總結如下:

1. init 解析init.rc

2. init 將init.rc里的service放到隊列里面等待觸發器的觸發

3. init通過 action_for_each_trigger("boot", action_add_queue_tail);觸發boot Action

4. 依次執行boot下的Commands,包括class_start default命令

5. 所有的service默認的class為默認值:default,所以,所有init.rc中的service都被啟動

zygote服務啟動

通過init.rc中對zygote服務的描述可知,其對應的程序為:/system/bin/app_process
        service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
        socket zygote stream 666
        onrestart write /sys/android_power/request_state wake
        onrestart write /sys/power/state on
        onrestart restart media

該服務會在on boot時觸發,其程序為/system/bin/app_process,服務名為zygote,-Xzygote /system/bin --zygote --start-system-server為參數列表。

在創建了zygote 服務后,在目錄下建立一個stream socket文件/dev/socket/zygote,權限為666,當zygote服務重啟時,重啟media服務

通過find ./ -name Android.mk -exec grep -l app_process {} \; 命令,查找到,它在./frameworks/base/cmds/app_process/目錄中被編譯,其主要入口文件為:

./frameworks/base/cmds/app_process/app_main.cpp

找到該程序的main入口函數,

int main(int argc, const char* const argv[])
    {
        // These are global variables in ProcessState.cpp
        mArgC = argc;
        mArgV = argv;
        mArgLen = 0;
        for (int i=0; i< argc; i++) {
            mArgLen += strlen(argv[i]) + 1;
            }
        mArgLen--;
        AppRuntime runtime;
        const char *arg;
        const char *argv0;
        argv0 = argv[0];
        // Process command line arguments
        // ignore argv[0]
        argc--;
        argv++;
        // Everything up to '--' or first non '-' arg goes to the vm
        // 在zygote服務的參數列表中,以'--和非'-'開頭的參數,是dalvik的參數:/system/bin--zygote --start-system-server,交給Vm來處理
        int i = runtime.addVmArguments(argc, argv);
        // 找到zygote的目錄:/system/bin
        if (i < argc) {
            runtime.mParentDir = argv[i++];
        }
        // 如果接下來的參數是:--zygote --start-system-server的話,設置argv0="zygote",startSystemServer= true,啟動java VM
        if (i < argc) {
            arg = argv[i++];
            if (0 == strcmp("--zygote", arg)) {
                bool startSystemServer = (i < argc) ?
                strcmp(argv[i], "--start-system-server") == 0 : false;
                setArgv0(argv0, "zygote");
                set_process_name("zygote");
                runtime.start("com.android.internal.os.ZygoteInit",
                startSystemServer);
        } else {
            set_process_name(argv0);
            runtime.mClassName = arg;
            // Remainder of args get passed to startup class main()
            runtime.mArgC = argc-i;
            runtime.mArgV = argv+i;
            LOGV("App process is starting with pid=%d, class=%s.\n",
            getpid(), runtime.getClassName());
            runtime.start();
            }
        } else {
                LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
                fprintf(stderr, "Error: no class name or --zygote supplied.\n");
                app_usage();
                return 10;
        &nbnbsp;   }
    }

根據service zygote的參數,啟動VM:

runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);

runtime是AppRuntime的對象,AppRuntime是AndroidRuntime的子類:

runtime.start方法在AndroidRuntime里實現:

void AndroidRuntime::start(const char* className, const bool startSystemServer)
    {
        LOGD("\n>>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<\n");        //logcat里顯眼的字樣
        char* slashClassName = NULL;
        char* cp;
        JNIEnv* env;
        blockSigpipe();
        /*
        * 'startSystemServer == true' means runtime is obslete and not run from
        * init.rc anymore, so we print out the boot start event here.
        */
        if (startSystemServer) {
        /* track our progress through the boot sequence */
        const int LOG_BOOT_PROGRESS_START = 3000;
        LOG_EVENT_LONG(LOG_BOOT_PROGRESS_START,
        ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
        }
        const char* rootDir = getenv("ANDROID_ROOT"); // 取得Android的根目錄:/system
        if (rootDir == NULL) {
        rootDir = "/system";
        if (!hasDir("/system")) {
        LOG_FATAL("No root directory specified, and /android does not exist.");
        goto bail;
        }
        setenv("ANDROID_ROOT", rootDir, 1);
        }
        //const char* kernelHack = getenv("LD_ASSUME_KERNEL");
        //LOGD("Found LD_ASSUME_KERNEL='%s'\n", kernelHack);
        /* start the virtual machine */
        // 啟動Dalvik虛擬機,在AndroidRuntime::startVm方法中,設備了大量VM的參數,后調用JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs),通過JNI啟動虛擬機
        if (startVm(&mJavaVM, &env) != 0)
        goto bail;
        /*
        * Register android functions.
        */
        if (startReg(env) < 0) { // 注冊系統使用的JNI函數
        LOGE("Unable to register all android natives\n");
        goto bail;
        }         jclass stringClass;
        jobjectArray strArray;
        jstring classNameStr;
        jstring startSystemServerStr;
        stringClass = env->FindClass("java/lang/String");        // 從Dalvik虛擬機里,查找到String類,
        assert(stringClass != NULL);         strArray = env->NewObjectArray(2, stringClass, NULL);        // 創建一個String數組,有兩個元素(strArray = new String[2])
        assert(strArray != NULL);
        classNameStr = env->NewStringUTF(className);        // 創建一個Java String對象,初始值為:className,其實是start第一個參數:com.android.internal.os.ZygoteInit
        assert(classNameStr != NULL);
        env->SetObjectArrayElement(strArray, 0, classNameStr);        // 設置strArray 第一個元素的值為:classNameStr (strArray[0] =classNameStr)
        startSystemServerStr = env->NewStringUTF(startSystemServer ? "true" : "false");        // 創建一個Java String對象,初始值為:startSystemServer ,其實是start第二個參數:true
        env->SetObjectArrayElement(strArray, 1, startSystemServerStr);        // 設置strArray 第二個元素的值為:strArray[1] =startSystemServerStr
        /*
        * Start VM. This thread becomes the main thread of the VM, and will
        * not return until the VM exits.
        */
        // 根據上面的解釋可知:準備啟動Java VM,并且創建VM的主線程,只要VM不退出,這個主線程一直運行。
        jclass startClass;
        jmethodID startMeth;
        for (cp = slashClassName; *cp != '\0'; cp++)        //
將com.android.internal.os.ZygoteInit中的包分隔符'.'換成'/'即:com/android/internal/os/ZygoteInit
        if (*cp == '.')
        *cp = '/';
        startClass = env->FindClass(slashClassName);         // 從VM中查找ZygoteInit類,難道它要在VM里加載這個類。。。。
        if (startClass == NULL) {
        LOGE("JavaVM unable to locate class '%s'\n", slashClassName);
        /* keep going */
        } else {
        startMeth = env->GetStaticMethodID(startClass, "main",
        "([Ljava/lang/String;)V"); //
        查找到com/android/internal/os/ZygoteInit類中的main方法ID,接合Java文件命名規則,你能更深刻的理解,為什么主類名要和文件名一致,并且main方法為static方法。
        if (startMeth == NULL) {
        LOGE("JavaVM unable to find main() in '%s'\n", className);
        /* keep going */
        } else {
        env->CallStaticVoidMethod(startClass, startMeth, strArray);        // 調用ZygoteInit類里的main方法,這不是運行ZygoteInit這個JAVA程序嗎!!
        #if 0
        if (env->ExceptionCheck())
        threadExitUncaughtException(env);
        #endif
            }
        }
        LOGD("Shutting down VM\n");
        if (mJavaVM->DetachCurrentThread() != JNI_OK)
        LOGW("Warning: unable to detach main thread\n");
        if (mJavaVM->DestroyJavaVM() != 0)
        LOGW("Warning: VM did not shut down cleanly\n");
        bail:
        free(slashClassName);
    }

由上面的分析可知,AndroidRuntime::start方法實現了下面功能:

1> 通過startVm來啟動虛擬機,并且注冊了一些系統JNI函數,由于這個時候VM里還沒有程序,只是個空的VM執行環境

2> 通過AndroidRuntime::start的參數,在JNI代碼里構建第一個Java程序ZygoteInit,將其作為VM的主線程,同時給其傳遞兩個JNI構建的參數:

"com/android/internal/os/ZygoteInit"和"true"

總結:

Android系統的啟動是由init進程加載并啟動了里面的/system/bin/app_process程序作為zygote服務,然后在zygote服務里執行runtime.start啟動Dalvik虛擬機,加載了ZygoteInit類作為Dalvik虛擬機的第一個主線程。至此,Android的Java運行環境就準備完畢了。

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
亚洲黄色一级大片| 免费看91的网站| 国产精品色视频| 狠狠综合久久av一区二区蜜桃| 日韩a在线观看| 天堂中文在线官网| 国产在线一区视频| 国产精品久久久久久久av福利| www.久久艹| 久久精品成人动漫| 欧美日韩国产小视频在线观看| www国产成人| 国产欧美亚洲一区| 粉嫩av一区二区| 狂野欧美性猛交xxxxx视频| 免费福利片在线观看| 天堂中文在线看| 黄色在线免费观看| 午夜精产品一区二区在线观看的| 国内外免费激情视频| 欧美日韩一区在线视频| 国产不卡av在线免费观看| 日韩精品日韩在线观看| 日本黄色一区二区| 国产精品嫩草影院av蜜臀| 另类小说欧美激情| 欧美日韩免费| 最新亚洲精品| 日韩精品三区| 黄色动漫在线| 视频国产在线观看| 夜色av.com| 欧美videos巨大粗暴| 国产福利小视频| av资源免费观看| 在线观看天堂av| 国产乱淫av麻豆国产免费| 成人黄色片视频| 伊人网在线免费| 日本高清一区| 高清国产一区| 国产日韩在线看片| 欧美综合在线观看| 欧美xxxx18性欧美| 国产一区二区三区在线观看视频 | 欧美日韩一卡| 成人一区而且| 免费久久精品| 加勒比久久高清| 激情视频亚洲| 免费一级欧美在线观看视频| 午夜av不卡| 丁香花视频在线观看| 在线免费观看黄色| 九一在线视频| 日韩精品系列| 午夜在线观看视频网站| 一二三区高清| 意大利激情丛林无删减版dvd| 成年网站在线在免费播放| 国产又白又嫩又紧又爽18p| 亚洲精品aaaa| 久久精品视频在线观看榴莲视频| 亚洲视频网站在线| 亚洲剧场午夜在线观看| 午夜影院免费体验区| 蜜桃av中文字幕| 黄频网站在线观看| 韩国av电影在线观看| 亚洲黄色在线免费观看| 亚洲av无码乱码国产精品| 国产高清免费在线观看| 亚洲国产一二三区| 神宫寺奈绪一区二区三区| 日本免费一区视频| 小说区图片区综合久久88| 亚洲精品午夜级久久久久| 欧美xxx另类| 美女被羞羞网站| 午夜伦伦电影理论片费看| 久久国产情侣| 国产黄色在线| 黄色羞羞视频在线观看| 亚洲妇女成熟| 亚洲成a人片777777久久| 国产日韩在线观看视频| 校园春色另类视频| 亚洲精品国产首次亮相| 午夜亚洲视频| 国产精品一区二区黑丝| 国产午夜精品在线观看| 一区二区三区**美女毛片| 欧美性开放视频| 日韩三级av在线播放| 亚洲欧洲日韩国产| 欧美激情第三页| 国产成人一区二区三区| 99www免费人成精品| 亚洲 国产 欧美一区| 国产日韩欧美精品在线观看| 色www免费视频| 屁屁影院国产第一页| 精品人妻伦九区久久aaa片| 日韩视频在线观看一区| 亚洲av无码一区二区三区性色| 最新版天堂资源中文官网| 黄瓜视频18免费观看| 在线小视频网址| 伊人在我在线看导航| 日韩福利在线观看| 欧美三级伦理在线| 裸体素人女欧美日韩| www.av精品| 偷偷要91色婷婷| 亚洲国产精品热久久| 久热精品视频在线观看一区| 国产三级精品网站| 在线观看一区二区三区三州| 国产精品嫩草影院8vv8| 国产人与禽zoz0性伦| 国产美女www爽爽爽视频| 欧美free性| 永久www成人看片| 丁香高清在线观看完整电影视频| 永久免费精品视频| 国产欧美不卡| 国产精品日产欧美久久久久| 在线播放/欧美激情| 久久成人精品电影| 国产成人免费电影| 国产69精品久久久久久久| 视频免费在线观看| 男人天堂av在线播放| 精品一区二区三区五区六区七区 | 国产一区二区三区四区老人| 国产成人一区在线| 天天色图综合网| 色偷偷偷综合中文字幕;dd| 国产精品自在线| 国产精品久久久久久久久电影网| 国产黑丝一区二区| 中文字幕欧美在线观看| 美女视频黄是免费| 欧美videos另类精品| 精品高清久久| 成人一区在线观看| 欧美性一二三区| 欧美黄色免费网站| 手机看片福利永久国产日韩| 精品影片一区二区入口| 亚洲天堂777| bbw丰满大肥奶肥婆| 国产色婷婷在线| 久久亚洲在线| 国产喷白浆一区二区三区| 精品国产一二三区| 91久久极品少妇xxxxⅹ软件| 日本一极黄色片| 久久免费激情视频| 一个人看免费www视频有多爽 | 日韩在线电影一区| 狠狠热免费视频| 国产午夜福利片| 国产激情视频一区二区| 免费成人黄色| 成人羞羞视频播放网站| 久久老女人爱爱| 精品国产一区久久| 97碰碰视频| 国产在线观看中文字幕| 亚洲无码精品一区二区三区| www.蜜桃av| 成人免费毛片嘿嘿连载视频…| 99精品国产99久久久久久福利| 亚洲人成人一区二区在线观看| 一区二区在线视频播放| 日韩在线导航| 日韩一区二区不卡视频| 国产精品视频一区麻豆| 92久久精品| 国产农村妇女毛片精品久久莱园子| 亚洲综合免费观看高清完整版在线| 久久天天躁狠狠躁夜夜av| 日韩欧美一级在线| 欧美成人综合色| 日本jizz中国| 日韩国产91| 国产成人精品一区二| 亚洲第一网中文字幕| 欧美日本韩国国产| 成人自拍小视频| 在线看av网址| 视频一区日韩精品| 久久久久久免费毛片精品| 一区二区三区动漫| 综合久久国产| 国产做受高潮漫动| 少妇**av毛片在线看| 婷婷激情久久| 亚洲色图视频免费播放| 粉嫩在线一区二区三区视频| 在线播放国产精品二区一二区四区| 91成人理论电影| 国产熟妇搡bbbb搡bbbb| xxxxaaa欧美另类| 欧美视频第一| 久久久久久毛片| 高清欧美一区二区三区| 香港日本韩国三级网站| 日本黄色大片视频| 蜜臀av在线播放| 国产一区二区在线看| 亚洲精品网站在线播放gif| 成人手机视频在线| 四虎影院在线免费播放| 日韩电影免费| 亚洲精品精选| 精品国产凹凸成av人网站| 中文字幕成人一区| 五月激情丁香网| 五月香视频在线观看| 国产视频一区免费看| 精品日韩在线一区| 日韩一区二区高清视频| 国产美女自慰在线观看| 女同一区二区免费aⅴ| 国内精品国产成人| 俺去了亚洲欧美日韩| 日本肉体xxxx裸体xxx免费| 中文字字幕一区二区三区四区五区| 韩国精品主播一区二区在线观看 | 久久男女视频| 日韩精品黄色网| 鲁一鲁一鲁一鲁一澡| 亚洲免费网站在线观看| 成人一级视频| 国产精品欧美一区二区三区| 国产精品美女网站| 四季av中文字幕| 性视频在线播放| 亚洲精品乱码| 亚洲人成在线一二| 亚洲另类第一页| 成人亚洲欧美日韩在线观看| 色综合久久中文| 日本韩国欧美国产| 一区二区日本伦理| aaa一区二区三区| 久久毛片亚洲| 国产精品久久久久久久久快鸭| 国产精品欧美亚洲777777| 免费黄色片网站| 网址你懂得在线观看| 久久精品电影| 欧美成人国产va精品日本一级| 亚洲网中文字幕| 妞干网福利视频| 天天影视综合| 精品久久国产字幕高潮| 已婚少妇美妙人妻系列| 91xx在线观看| 欧美hentaied在线观看| 一区二区久久| 亚洲国产精品一区二区三区| 2022亚洲天堂| 国产porny蝌蚪视频| 国产一区二区三区不卡视频网站| 亚洲18色成人| 色女人综合av| 女人18毛片九区毛片在线| 99re8精品视频在线观看| 亚洲电影中文字幕在线观看| 日韩免费一区二区三区| 99久久国产热无码精品免费| 精品一区二区三区中文字幕视频 | 精品一区二区三区五区六区| 青青草国产成人a∨下载安卓| 欧美一级免费大片| 中文字幕第38页| 4虎在线播放1区| 日韩国产欧美三级| 日本午夜在线亚洲.国产| 日本三级2019| 国产精品久久久久av电视剧| 五月婷婷综合在线| 粉嫩精品一区二区三区在线观看| 中文无码av一区二区三区| 99久久久国产| 欧美精品一级二级| 成人亚洲免费视频| 伊人国产在线| 久久人人爽人人爽| 日韩免费av电影| 精品视频二区三区| 亚洲国产精品一区| 欧美一级黑人aaaaaaa做受| 超碰97网站| 亚洲高清在线免费| 午夜精品久久久久99热蜜桃导演| 久久夜色精品国产亚洲aⅴ| 一区视频免费观看| 日韩av大片站长工具| 欧美午夜电影网| 热久久久久久久久| 国产精品一二三区视频| 中文字幕在线一区二区三区| 午夜久久久久久久久久久| 丰满湿润大白屁股bbw按摩| 日本视频一区二区| 国产中文欧美精品| 日韩一级片免费看| 中文字幕人成人乱码| 久久久噜噜噜久久久| 日本丰满少妇做爰爽爽| 国语一区二区三区| 国产亚洲精品va在线观看| 很污很黄的网站| av一区在线播放| 精品国产麻豆免费人成网站| 天天干天天舔天天操| 精品国产免费人成网站| 日韩午夜av一区| 永久免费看mv网站入口78| 少妇视频在线观看| 欧美日韩视频一区二区| 日韩精品视频一区二区| h片视频在线观看| 91精品国产综合久久久久久久| 一级做a爰片毛片| 99色在线观看| 91麻豆精品国产自产在线| www.超碰97| 国产高清不卡| 日韩第一页在线| 欧美成人手机视频| 91蝌蚪精品视频| 久久成年人视频| 国产又粗又黄又爽| 欧美激情亚洲| 91一区二区三区| 一个人看的日本www的免费视频| 国产精品99久久久久久宅男| 中文字幕av久久| 在线观看视频色潮| 亚洲成人免费影院| 中文字幕在线观看91| 天堂在线中文网官网| 亚洲精品wwwww| 国产尤物在线视频| 色婷婷亚洲mv天堂mv在影片| 国产精品激情自拍| 综合久久一本| 国产福利一区二区三区视频在线| 99re99热| 精品无吗乱吗av国产爱色| 日本精品一区二区三区四区的功能| 亚洲黄色在线网站| 国产一区二区三区免费观看在线 | 欧美日韩午夜精品| 永久免费看片直接| 国产一区二区三区亚洲| 97在线观看免费| 嫩草影院永久一二三入口| 国产一区二区三区不卡在线观看| 日本a级片在线观看| 可以直接在线观看的av| 欧美偷拍一区二区| 日韩一级片av| 日韩电影免费网址| 91国产在线播放| www.黄在线| 亚洲制服丝袜在线| 国产色视频一区二区三区qq号| 日韩高清二区| 国产999精品| 日本影音先锋电影| 中文字幕亚洲区| 屁屁影院国产第一页| 国产成人福利av| 国产精品三级久久久久久电影| seba5欧美综合另类| 中文字幕在线观看一区二区| 中国xxxx性xxxx产国| 亚洲日本va午夜在线电影| 日韩av不卡电影| 日本网址在线观看| 亚洲免费成人av| 日韩中文字幕电影| 亚洲成在人线免费观看| 91久色国产| 中国动漫在线观看完整版免费| 欧美综合视频在线观看| 日韩av片在线播放| 亚洲人www| 免费看欧美黑人毛片| av老司机免费在线| 欧美肥臀大乳一区二区免费视频| 欧美性xxxxx极品视频| 亚洲视频一区二区在线| 黄色片网站免费|