本發(fā)明涉及計算機(jī)應(yīng)用領(lǐng)域,特別是涉及一種獨立系統(tǒng)進(jìn)程的實現(xiàn)方法和裝置。
背景技術(shù):
隨著各種電子設(shè)備的出現(xiàn),為了保證電子設(shè)備的正常運(yùn)行,產(chǎn)生了很多控制電子設(shè)備運(yùn)行的軟件。該軟件通常是以ROM(Read-only memory,只讀內(nèi)存鏡像)image形式發(fā)布。ROM開發(fā)者定制Android OS(Operating System,操作系統(tǒng))時,往往會提供自己的系統(tǒng)服務(wù)。這些系統(tǒng)服務(wù)只能放在系統(tǒng)進(jìn)程中運(yùn)行,一旦出現(xiàn)Crash(即在正常計算機(jī)系統(tǒng)運(yùn)行過程中,因某種原因宕機(jī)或程序停止工作等情況),就會導(dǎo)致整個系統(tǒng)進(jìn)程崩潰,電子設(shè)備無法正常工作,只能重啟電子設(shè)備。
技術(shù)實現(xiàn)要素:
基于此,有必要針對電子設(shè)備使用開發(fā)者提供的ROM后出現(xiàn)錯誤,容易導(dǎo)致整個系統(tǒng)進(jìn)程崩潰,電子設(shè)備無法工作的問題,提供一種獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,能避免電子設(shè)備使用ROM出現(xiàn)錯誤后導(dǎo)致整個系統(tǒng)進(jìn)程崩潰的情況,提高電子設(shè)備的使用效率。
此外,還有必要提供一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,能避免電子設(shè)備使用ROM出現(xiàn)Crash后導(dǎo)致整個系統(tǒng)進(jìn)程崩潰的情況,提高電子設(shè)備的使用效率。
一種獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,包括以下步驟:
獲取自定義系統(tǒng)服務(wù),并在所述自定義系統(tǒng)服務(wù)中創(chuàng)建上下文;
配置所述自定義系統(tǒng)服務(wù)的進(jìn)程屬性為系統(tǒng)進(jìn)程;
獲取啟動所述自定義系統(tǒng)服務(wù)的執(zhí)行文件;
在啟動原生系統(tǒng)服務(wù)的配置文件中增加啟動所述自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼,生成包含啟動所述自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟 動系統(tǒng)服務(wù)的配置文件。
一種獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,包括以下步驟:
在系統(tǒng)啟動時,加載包含啟動自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件;
根據(jù)加載的系統(tǒng)服務(wù)的配置文件啟動原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程;
在所述自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù);
通過所述原生系統(tǒng)服務(wù)進(jìn)程中的跨進(jìn)程調(diào)用服務(wù)調(diào)用委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中,以使所述自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程運(yùn)行。
一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,包括:
自定義系統(tǒng)服務(wù)獲取模塊,用于獲取自定義系統(tǒng)服務(wù)進(jìn)程,并在所述自定義系統(tǒng)服務(wù)進(jìn)程中創(chuàng)建上下文;
配置模塊,用于配置所述自定義系統(tǒng)服務(wù)進(jìn)程的屬性為系統(tǒng)進(jìn)程;
執(zhí)行文件獲取模塊,用于獲取啟動所述自定義系統(tǒng)服務(wù)的執(zhí)行文件;
第一生成模塊,用于在啟動原生系統(tǒng)服務(wù)的配置文件中增加啟動所述自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼,生成包含啟動所述自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件。
一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,包括:
加載模塊,用于在系統(tǒng)啟動時,加載包含啟動自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件;
進(jìn)程啟動模塊,用于根據(jù)加載的系統(tǒng)服務(wù)的配置文件啟動原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程;
自定義系統(tǒng)服務(wù)啟動模塊,用于在所述自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù);
調(diào)用模塊,用于通過所述原生系統(tǒng)服務(wù)進(jìn)程中的跨進(jìn)程調(diào)用服務(wù)調(diào)用委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中,以使所述自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程運(yùn)行。
上述獨立系統(tǒng)進(jìn)程的實現(xiàn)方法和裝置,通過將自定義系統(tǒng)服務(wù)中創(chuàng)建上下文及設(shè)置進(jìn)程屬性為系統(tǒng)進(jìn)程,并將啟動自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼增加到啟動原生系統(tǒng)服務(wù)的配置文件中生成啟動系統(tǒng)服務(wù)的配置文件,如此在操作系統(tǒng)啟動時能夠啟動自定義系統(tǒng)服務(wù)中,使得自定義系統(tǒng)服務(wù)以獨立系統(tǒng)進(jìn)程運(yùn)行,因自定義系統(tǒng)服務(wù)以獨立系統(tǒng)進(jìn)程運(yùn)行,與原生系統(tǒng)進(jìn)程隔開,即使自定義系統(tǒng)服務(wù)進(jìn)程出現(xiàn)錯誤,也不會影響原生系統(tǒng)進(jìn)程,不會導(dǎo)致死機(jī),且獨立系統(tǒng)進(jìn)程出錯之后能夠自動恢復(fù),為后續(xù)繼續(xù)提供服務(wù)。
附圖說明
圖1為一個實施例中終端的內(nèi)部結(jié)構(gòu)示意圖;
圖2為一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)方法的流程圖;
圖3為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)方法的流程圖;
圖4為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)方法的流程圖;
圖5為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)方法的流程圖;
圖6為一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的結(jié)構(gòu)框圖;
圖7為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的結(jié)構(gòu)框圖;
圖8為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的結(jié)構(gòu)框圖;
圖9為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的結(jié)構(gòu)框圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
圖1為一個實施例中終端的內(nèi)部結(jié)構(gòu)示意圖。如圖1所示,該終端包括通過系統(tǒng)總線連接的處理器、存儲介質(zhì)、內(nèi)存、網(wǎng)絡(luò)接口、聲音采集裝置、顯示屏和輸入裝置。其中,終端的存儲介質(zhì)存儲有操作系統(tǒng),還包括一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,該獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置用于實現(xiàn)一種獨立系統(tǒng)進(jìn)程的實現(xiàn)方法。該處理器用于提供計算和控制能力,支撐整個終端的運(yùn)行。終端中的內(nèi) 存為存儲介質(zhì)中的獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的運(yùn)行提供環(huán)境,網(wǎng)絡(luò)接口用于與服務(wù)器進(jìn)行網(wǎng)絡(luò)通信,如發(fā)送數(shù)據(jù)請求至服務(wù)器,接收服務(wù)器返回的數(shù)據(jù)等。終端的顯示屏可以是液晶顯示屏或者電子墨水顯示屏等,輸入裝置可以是顯示屏上覆蓋的觸摸層,也可以是終端外殼上設(shè)置的按鍵、軌跡球或觸控板,也可以是外接的鍵盤、觸控板或鼠標(biāo)等。該終端可以是手機(jī)、平板電腦或者個人數(shù)字助理。本領(lǐng)域技術(shù)人員可以理解,圖1中示出的結(jié)構(gòu),僅僅是與本申請方案相關(guān)的部分結(jié)構(gòu)的框圖,并不構(gòu)成對本申請方案所應(yīng)用于其上的終端的限定,具體的終端可以包括比圖中所示更多或更少的部件,或者組合某些部件,或者具有不同的部件布置。
圖2為一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)方法的流程圖。如圖2所示,一種獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,包括以下步驟:
步驟202,獲取自定義系統(tǒng)服務(wù),并在該自定義系統(tǒng)服務(wù)中創(chuàng)建上下文。
具體地,使用Java語言編寫自定義系統(tǒng)服務(wù),并給自定義系統(tǒng)服務(wù)定義名稱,例如名稱為MySystemServer。在自定義系統(tǒng)服務(wù)中提供入口函數(shù)main,并在自定義系統(tǒng)服務(wù)中調(diào)用ActivityThread.getSystemContext創(chuàng)建一個Context(上下文),以便后續(xù)編寫程序時使用。Java語言是一種可以撰寫跨平臺應(yīng)用程序的面向?qū)ο蟮某绦蛟O(shè)計語言。在Android開發(fā)中主要使用的是Java語言。Andriod是一個基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機(jī)、平板電腦等。Context是描述一個應(yīng)用程序環(huán)境的信息,該類是一個抽象類,Android提供了該抽象類的具體實現(xiàn)類,如ContextIml類,通過Context可以獲取應(yīng)用程序的資源和類,也包括一些應(yīng)用級別操作,例如啟動Activity,發(fā)送廣播,接收Intent等。
步驟204,配置該自定義系統(tǒng)服務(wù)的進(jìn)程屬性為系統(tǒng)進(jìn)程。
具體地,進(jìn)程是計算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。系統(tǒng)進(jìn)程是指操作系統(tǒng)運(yùn)行核心代碼,提供核心服務(wù)的進(jìn)程,其為操作系統(tǒng)運(yùn)行最關(guān)鍵的部分。
自定義系統(tǒng)服務(wù)的進(jìn)程屬性設(shè)置為系統(tǒng)進(jìn)程,可讓自定義系統(tǒng)服務(wù)啟動進(jìn) 程后作為系統(tǒng)進(jìn)程運(yùn)行。
在一個實施例中,配置自定義系統(tǒng)服務(wù)的進(jìn)程屬性為系統(tǒng)進(jìn)程可采用標(biāo)記方式。
在另一個實施例中,配置自定義系統(tǒng)服務(wù)的進(jìn)程屬性為系統(tǒng)進(jìn)程包括:在活動管理服務(wù)同級目錄下增加委托類文件,并在該委托類文件中增加將當(dāng)前的進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中的配置系統(tǒng)服務(wù)函數(shù);在原生系統(tǒng)服務(wù)中增加跨進(jìn)程調(diào)用服務(wù),通過該跨進(jìn)程調(diào)用服務(wù)調(diào)用該委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中。
具體地,在Android源碼ActivityMangerService.java(活動管理服務(wù))同級目錄下增加MyDelegate.java(委托類)文件,在該委托類文件中增加將當(dāng)前的進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中的配置系統(tǒng)服務(wù)函數(shù),即在MyDelegate.java文件里面按照AcitivityManagerService.setSystemProcess編寫函數(shù)setAsSystemServer(配置系統(tǒng)服務(wù)函數(shù))。同時在原生系統(tǒng)服務(wù)中增加一個MyDaemon(跨進(jìn)程調(diào)用服務(wù)),MyDaemon用于提供一個跨進(jìn)程調(diào)用服務(wù),調(diào)用MyDelegate的setAsSystemServer。原生系統(tǒng)服務(wù)是指未經(jīng)過修改的操作系統(tǒng)自帶的底層運(yùn)行的核心系統(tǒng)服務(wù),給上層應(yīng)用程序提供各種服務(wù),比如訪問硬件等。
步驟206,獲取啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件。
具體地,將源碼中類名稱修改為自定義系統(tǒng)服務(wù)的名稱,將進(jìn)程名稱修改為自定義系統(tǒng)服務(wù)進(jìn)程名稱,再編譯生成二進(jìn)制執(zhí)行文件,得到啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件,并將自定義系統(tǒng)服務(wù)的執(zhí)行文件放入指定目錄下。
使用C/C++語言等編寫啟動MySystemServer的代碼邏輯。該代碼邏輯與Android源碼中app_process對應(yīng)的app_main.cpp基本一樣,只是啟動的ClassName(源碼中類名稱)修改為自定義系統(tǒng)服務(wù)的名稱“MySystemServer”,將進(jìn)程名稱修改為自定義系統(tǒng)服務(wù)進(jìn)程名稱“my_process”,然后編譯成二進(jìn)制執(zhí)行文件my_system_server,將my_system_server放入指定目錄下,如/system/bin/目錄下。
步驟208,在啟動原生系統(tǒng)服務(wù)的配置文件中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼,生成包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼 的啟動系統(tǒng)服務(wù)的配置文件。
具體地,在Android的啟動核心服務(wù)的配置文件(即init.rc文件或initng文件或upstart文件或runit文件或bootscripts文件等)中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼。
例如,在啟動核心服務(wù)的配置文件中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼如下:
service my_system_server/system/bin/my_system_server class main
上述配置代碼包括自定義系統(tǒng)服務(wù)的執(zhí)行文件所存儲的路徑,并提供了入口函數(shù)class main。
init.rc文件是內(nèi)核自行啟動之后,通過啟動一個用戶級程序init的方式,完成引導(dǎo)過程。
上述獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,通過將自定義系統(tǒng)服務(wù)中創(chuàng)建上下文及設(shè)置進(jìn)程屬性為系統(tǒng)進(jìn)程,并將啟動自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼增加到啟動原生系統(tǒng)服務(wù)的配置文件中生成啟動系統(tǒng)服務(wù)的配置文件,如此在操作系統(tǒng)啟動時能夠啟動自定義系統(tǒng)服務(wù)中,使得自定義系統(tǒng)服務(wù)以獨立系統(tǒng)進(jìn)程運(yùn)行,因自定義系統(tǒng)服務(wù)以獨立系統(tǒng)進(jìn)程運(yùn)行,與原生系統(tǒng)進(jìn)程隔開,即使自定義系統(tǒng)服務(wù)進(jìn)程出現(xiàn)錯誤,也不會影響原生系統(tǒng)進(jìn)程,不會導(dǎo)致死機(jī),且獨立系統(tǒng)進(jìn)程出錯之后能夠自動恢復(fù),為后續(xù)繼續(xù)提供服務(wù)。
在一個實施例中,上述獨立系統(tǒng)進(jìn)程的實現(xiàn)方法還包括:將生成的啟動系統(tǒng)服務(wù)的配置文件重新編譯生成只讀內(nèi)存鏡像文件。
具體地,將生成的包含啟動所述自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件重新編譯,生成ROM文件(只讀內(nèi)存鏡像文件),然后可將ROM文件利用工具寫入到終端中。例如,可將終端與計算機(jī)相連,在計算機(jī)安裝刷ROM的應(yīng)用程序,將生成的ROM文件寫入到終端中。
圖3為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)方法的流程圖。如圖3所示,在一個實施例中,上述獨立系統(tǒng)進(jìn)程的實現(xiàn)方法還包括:
步驟302,在系統(tǒng)啟動時,加載包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配 置代碼的啟動系統(tǒng)服務(wù)的配置文件。
具體地,加載生成的包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件,即新的init.rc。
步驟304,根據(jù)加載的系統(tǒng)服務(wù)的配置文件啟動原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程。
具體地,原生系統(tǒng)服務(wù)進(jìn)程是指未經(jīng)過修改過的操作系統(tǒng)自帶的底層運(yùn)行的核心系統(tǒng)服務(wù)進(jìn)程,給上層應(yīng)用程序提供各種服務(wù),比如訪問硬件等。自定義系統(tǒng)服務(wù)進(jìn)程是指給開發(fā)者自定義系統(tǒng)服務(wù)提供運(yùn)行環(huán)境的系統(tǒng)進(jìn)程。例如,自定義系統(tǒng)服務(wù)進(jìn)程可為my_system_server進(jìn)程。
步驟306,在該自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù)。
具體地,啟動自定義系統(tǒng)服務(wù)可為啟動MySystemServer。
步驟308,根據(jù)自定義系統(tǒng)服務(wù)進(jìn)程的屬性為系統(tǒng)進(jìn)程,將該自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程運(yùn)行。
具體地,因自定義系統(tǒng)服務(wù)進(jìn)程的屬性設(shè)置為系統(tǒng)進(jìn)程,可將自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程進(jìn)行運(yùn)行。
上述獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,在系統(tǒng)啟動時,通過加載包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件,使得原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程同時運(yùn)行,并在自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù),使得自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)服務(wù)進(jìn)程進(jìn)行運(yùn)行,與原生系統(tǒng)進(jìn)程隔開,即使自定義系統(tǒng)服務(wù)進(jìn)程出現(xiàn)錯誤,也不會影響原生系統(tǒng)進(jìn)程,不會導(dǎo)致死機(jī),且獨立系統(tǒng)進(jìn)程出錯之后能夠自動恢復(fù),為后續(xù)繼續(xù)提供服務(wù)。
圖4為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)方法的流程圖。如圖4所示,一種獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,包括以下步驟:
步驟402,獲取自定義系統(tǒng)服務(wù),并在該自定義系統(tǒng)服務(wù)中創(chuàng)建上下文。
具體地,使用Java語言編寫自定義系統(tǒng)服務(wù),并給自定義系統(tǒng)服務(wù)定義名稱,例如名稱為MySystemServer。在自定義系統(tǒng)服務(wù)中提供入口函數(shù)main,并 在自定義系統(tǒng)服務(wù)中調(diào)用ActivityThread.getSystemContext創(chuàng)建一個Context(上下文),以便后續(xù)編寫程序時使用。Java語言是一種可以撰寫跨平臺應(yīng)用程序的面向?qū)ο蟮某绦蛟O(shè)計語言。在Android開發(fā)中主要使用的是Java語言。Andriod是一個基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機(jī)、平板電腦等。Context是描述一個應(yīng)用程序環(huán)境的信息,該類是一個抽象類,Android提供了該抽象類的具體實現(xiàn)類,如ContextIml類,通過Context可以獲取應(yīng)用程序的資源和類,也包括一些應(yīng)用級別操作,例如啟動Activity,發(fā)送廣播,接收Intent等。
步驟404,在活動管理服務(wù)同級目錄下增加委托類文件,并在該委托類文件中增加將當(dāng)前的進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中的配置系統(tǒng)服務(wù)函數(shù)。
具體地,在Android源碼ActivityMangerService.java(活動管理服務(wù))同級目錄下增加MyDelegate.java(委托類)文件,在該委托類文件中增加將當(dāng)前的進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中的配置系統(tǒng)服務(wù)函數(shù),即在MyDelegate.java文件里面按照AcitivityManagerService.setSystemProcess編寫函數(shù)setAsSystemServer(配置系統(tǒng)服務(wù)函數(shù))。
步驟406,在原生系統(tǒng)服務(wù)中增加跨進(jìn)程調(diào)用服務(wù),通過該跨進(jìn)程調(diào)用服務(wù)調(diào)用該委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中。
具體地,在原生系統(tǒng)服務(wù)中增加一個MyDaemon(跨進(jìn)程調(diào)用服務(wù)),MyDaemon用于提供一個跨進(jìn)程調(diào)用服務(wù),調(diào)用MyDelegate的setAsSystemServer。原生系統(tǒng)服務(wù)是指未經(jīng)過修改的操作系統(tǒng)自帶的底層運(yùn)行的核心系統(tǒng)服務(wù),給上層應(yīng)用程序提供各種服務(wù),比如訪問硬件等。
在一個實施例中,MySystemServer.java核心參考代碼如下:
MyDelegate.java的核心參考代碼:public static void setAsSystemProcess(int pid,IApplicationThread thread)//將指定pid(進(jìn)程id)和其主線程添加到系統(tǒng)進(jìn)程中的實現(xiàn)方法
步驟408,獲取啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件。
具體地,將源碼中類名稱修改為自定義系統(tǒng)服務(wù)的名稱,將進(jìn)程名稱修改為自定義系統(tǒng)服務(wù)進(jìn)程名稱,再編譯生成二進(jìn)制執(zhí)行文件,得到啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件,并將自定義系統(tǒng)服務(wù)的執(zhí)行文件放入指定目錄下。
使用C/C++語言等編寫啟動MySystemServer的代碼邏輯。該代碼邏輯與Android源碼中app_process對應(yīng)的app_main.cpp基本一樣,只是啟動的ClassName(源碼中類名稱)修改為自定義系統(tǒng)服務(wù)的名稱“MySystemServer”, 將進(jìn)程名稱修改為自定義系統(tǒng)服務(wù)進(jìn)程名稱“my_process”,然后編譯成二進(jìn)制執(zhí)行文件my_system_server,將my_system_server放入指定目錄下,如/system/bin/目錄下。
步驟410,在啟動原生系統(tǒng)服務(wù)的配置文件中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼,生成包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件。
具體地,在Android的啟動核心服務(wù)的配置文件(即init.rc文件或initng文件或upstart文件或runit文件或bootscripts文件等)中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼。
例如,在啟動核心服務(wù)的配置文件中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼如下:
service my_system_server/system/bin/my_system_server class main
上述配置代碼包括自定義系統(tǒng)服務(wù)的執(zhí)行文件所存儲的路徑,并提供了入口函數(shù)class main。
init.rc文件是內(nèi)核自行啟動之后,通過啟動一個用戶級程序init的方式,完成引導(dǎo)過程。
上述獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,通過將自定義系統(tǒng)服務(wù)中創(chuàng)建上下文,并通過在原生系統(tǒng)服務(wù)中增加跨進(jìn)程調(diào)用服務(wù),通過該跨進(jìn)程調(diào)用服務(wù)調(diào)用委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中,使得自定義系統(tǒng)服務(wù)進(jìn)程成為系統(tǒng)服務(wù)進(jìn)程,并將啟動自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼增加到啟動原生系統(tǒng)服務(wù)的配置文件中生成啟動系統(tǒng)服務(wù)的配置文件,如此在操作系統(tǒng)啟動時能夠啟動自定義系統(tǒng)服務(wù)中,使得自定義系統(tǒng)服務(wù)以獨立系統(tǒng)進(jìn)程運(yùn)行,因自定義系統(tǒng)服務(wù)以獨立系統(tǒng)進(jìn)程運(yùn)行,與原生系統(tǒng)進(jìn)程隔開,即使自定義系統(tǒng)服務(wù)進(jìn)程出現(xiàn)錯誤,也不會影響原生系統(tǒng)進(jìn)程,不會導(dǎo)致死機(jī),且獨立系統(tǒng)進(jìn)程出錯之后能夠自動恢復(fù),為后續(xù)繼續(xù)提供服務(wù)。
圖5為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)方法的流程圖。如圖5所示, 在一個實施例中,上述獨立系統(tǒng)進(jìn)程的實現(xiàn)方法還包括:
步驟502,在系統(tǒng)啟動時,加載包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件。
具體地,加載生成的包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件,即新的init.rc。
步驟504,根據(jù)加載的系統(tǒng)服務(wù)的配置文件啟動原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程。
具體地,原生系統(tǒng)服務(wù)進(jìn)程是指未經(jīng)過修改過的操作系統(tǒng)自帶的底層運(yùn)行的核心系統(tǒng)服務(wù)進(jìn)程,給上層應(yīng)用程序提供各種服務(wù),比如訪問硬件等。自定義系統(tǒng)服務(wù)進(jìn)程是指給開發(fā)者自定義系統(tǒng)服務(wù)提供運(yùn)行環(huán)境的系統(tǒng)進(jìn)程。例如,自定義系統(tǒng)服務(wù)進(jìn)程可為my_system_server進(jìn)程。
步驟506,在該自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù)。
具體地,起點自定義系統(tǒng)服務(wù)可為啟動MySystemServer。
步驟508,通過該原生系統(tǒng)服務(wù)進(jìn)程中的跨進(jìn)程調(diào)用服務(wù)調(diào)用該委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中,以使該自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程運(yùn)行。
具體地,通過該跨進(jìn)程調(diào)用服務(wù)調(diào)用委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中,使得自定義系統(tǒng)服務(wù)進(jìn)程成為系統(tǒng)服務(wù)進(jìn)程進(jìn)行運(yùn)行。
上述獨立系統(tǒng)進(jìn)程的實現(xiàn)方法,在系統(tǒng)啟動時,通過加載包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件,使得原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程同時運(yùn)行,并在自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù),使得自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)服務(wù)進(jìn)程進(jìn)行運(yùn)行,與原生系統(tǒng)進(jìn)程隔開,即使自定義系統(tǒng)服務(wù)進(jìn)程出現(xiàn)錯誤,也不會影響原生系統(tǒng)進(jìn)程,不會導(dǎo)致死機(jī),且獨立系統(tǒng)進(jìn)程出錯之后能夠自動恢復(fù),為后續(xù)繼續(xù)提供服務(wù)。
圖6為一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的結(jié)構(gòu)框圖。如圖6所示, 一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,包括自定義系統(tǒng)服務(wù)獲取模塊602、配置模塊604、執(zhí)行文件獲取模塊606和第一生成模塊608。其中:
自定義系統(tǒng)服務(wù)獲取模塊602用于獲取自定義系統(tǒng)服務(wù)進(jìn)程,并在該自定義系統(tǒng)服務(wù)進(jìn)程中創(chuàng)建上下文。
具體地,使用Java語言編寫自定義系統(tǒng)服務(wù),并給自定義系統(tǒng)服務(wù)定義名稱,例如名稱為MySystemServer。在自定義系統(tǒng)服務(wù)中提供入口函數(shù)main,并在自定義系統(tǒng)服務(wù)中調(diào)用ActivityThread.getSystemContext創(chuàng)建一個Context(上下文),以便后續(xù)編寫程序時使用。Java語言是一種可以撰寫跨平臺應(yīng)用程序的面向?qū)ο蟮某绦蛟O(shè)計語言。在Android開發(fā)中主要使用的是Java語言。Andriod是一個基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機(jī)、平板電腦等。Context是描述一個應(yīng)用程序環(huán)境的信息,該類是一個抽象類,Android提供了該抽象類的具體實現(xiàn)類,如ContextIml類,通過Context可以獲取應(yīng)用程序的資源和類,也包括一些應(yīng)用級別操作,例如啟動Activity,發(fā)送廣播,接收Intent等。
配置模塊604用于配置該自定義系統(tǒng)服務(wù)進(jìn)程的屬性為系統(tǒng)進(jìn)程。
具體地,進(jìn)程是計算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。系統(tǒng)進(jìn)程是指操作系統(tǒng)運(yùn)行核心代碼,提供核心服務(wù)的進(jìn)程,其為操作系統(tǒng)運(yùn)行最關(guān)鍵的部分。
自定義系統(tǒng)服務(wù)的進(jìn)程屬性設(shè)置為系統(tǒng)進(jìn)程,可讓自定義系統(tǒng)服務(wù)啟動進(jìn)程后作為系統(tǒng)進(jìn)程運(yùn)行。
在一個實施例中,配置自定義系統(tǒng)服務(wù)的進(jìn)程屬性為系統(tǒng)進(jìn)程可采用標(biāo)記方式。
在另一個實施例中,配置模塊604還用于在活動管理服務(wù)同級目錄下增加委托類文件,并在該委托類文件中增加將當(dāng)前的進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中的配置系統(tǒng)服務(wù)函數(shù);在原生系統(tǒng)服務(wù)中增加跨進(jìn)程調(diào)用服務(wù),通過該跨進(jìn)程調(diào)用服務(wù)調(diào)用該委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中。
執(zhí)行文件獲取模塊606用于獲取啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件。
具體地,執(zhí)行文件獲取模塊606還用于將源碼中類名稱修改為自定義系統(tǒng)服務(wù)的名稱,將進(jìn)程名稱修改為自定義系統(tǒng)服務(wù)進(jìn)程名稱,再編譯生成二進(jìn)制執(zhí)行文件,得到啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件,并將自定義系統(tǒng)服務(wù)的執(zhí)行文件放入指定目錄下。
使用C/C++語言等編寫啟動MySystemServer的代碼邏輯。該代碼邏輯與Android源碼中app_process對應(yīng)的app_main.cpp基本一樣,只是啟動的ClassName(源碼中類名稱)修改為自定義系統(tǒng)服務(wù)的名稱“MySystemServer”,將進(jìn)程名稱修改為自定義系統(tǒng)服務(wù)進(jìn)程名稱“my_process”,然后編譯成二進(jìn)制執(zhí)行文件my_system_server,將my_system_server放入指定目錄下,如/system/bin/目錄下。
第一生成模塊608用于在啟動原生系統(tǒng)服務(wù)的配置文件中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼,生成包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件。
具體地,在Android的啟動核心服務(wù)的配置文件(即init.rc文件或initng文件或upstart文件或runit文件或bootscripts文件等)中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼。
例如,在啟動核心服務(wù)的配置文件中增加啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼如下:
service my_system_server/system/bin/my_system_server class main
上述配置代碼包括自定義系統(tǒng)服務(wù)的執(zhí)行文件所存儲的路徑,并提供了入口函數(shù)class main。
init.rc文件是內(nèi)核自行啟動之后,通過啟動一個用戶級程序init的方式,完成引導(dǎo)過程。
上述獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,通過將自定義系統(tǒng)服務(wù)中創(chuàng)建上下文及設(shè)置進(jìn)程屬性為系統(tǒng)進(jìn)程,并將啟動自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼增加到啟動原生系統(tǒng)服務(wù)的配置文件中生成啟動系統(tǒng)服務(wù)的配置文件,如此在操作系統(tǒng)啟動時能夠啟動自定義系統(tǒng)服務(wù)中,使得自定義系統(tǒng)服務(wù)以獨立系統(tǒng)進(jìn)程 運(yùn)行,因自定義系統(tǒng)服務(wù)以獨立系統(tǒng)進(jìn)程運(yùn)行,與原生系統(tǒng)進(jìn)程隔開,即使自定義系統(tǒng)服務(wù)進(jìn)程出現(xiàn)錯誤,也不會影響原生系統(tǒng)進(jìn)程,不會導(dǎo)致死機(jī),且獨立系統(tǒng)進(jìn)程出錯之后能夠自動恢復(fù),為后續(xù)繼續(xù)提供服務(wù)。
圖7為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的結(jié)構(gòu)框圖。如圖7所示,一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,除了包括自定義系統(tǒng)服務(wù)獲取模塊602、配置模塊604、執(zhí)行文件獲取模塊606和第一生成模塊608,還包括加載模塊610、進(jìn)程啟動模塊612、自定義系統(tǒng)服務(wù)啟動模塊614、調(diào)用模塊616。其中:
加載模塊610用于在系統(tǒng)啟動時,加載包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件。
進(jìn)程啟動模塊612用于根據(jù)加載的系統(tǒng)服務(wù)的配置文件啟動原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程。
具體地,原生系統(tǒng)服務(wù)進(jìn)程是指未經(jīng)過修改過的操作系統(tǒng)自帶的底層運(yùn)行的核心系統(tǒng)服務(wù)進(jìn)程,給上層應(yīng)用程序提供各種服務(wù),比如訪問硬件等。自定義系統(tǒng)服務(wù)進(jìn)程是指給開發(fā)者自定義系統(tǒng)服務(wù)提供運(yùn)行環(huán)境的系統(tǒng)進(jìn)程。例如,自定義系統(tǒng)服務(wù)進(jìn)程可為my_system_server進(jìn)程。
自定義系統(tǒng)服務(wù)啟動模塊614用于在該自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù)。
具體地,啟動自定義系統(tǒng)服務(wù)可為啟動MySystemServer。
調(diào)用模塊616用于根據(jù)自定義系統(tǒng)服務(wù)進(jìn)程的屬性為系統(tǒng)進(jìn)程,將該自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程運(yùn)行。
具體地,因自定義系統(tǒng)服務(wù)進(jìn)程的屬性設(shè)置為系統(tǒng)進(jìn)程,可將自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程進(jìn)行運(yùn)行。
上述獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,在系統(tǒng)啟動時,通過加載包含啟動該自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件,使得原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程同時運(yùn)行,并在自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù),使得自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)服務(wù)進(jìn)程進(jìn)行運(yùn)行,與原生系統(tǒng)進(jìn)程隔開,即使自定義系統(tǒng)服務(wù)進(jìn)程出現(xiàn)錯誤,也不會影響原生系統(tǒng) 進(jìn)程,不會導(dǎo)致死機(jī),且獨立系統(tǒng)進(jìn)程出錯之后能夠自動恢復(fù),為后續(xù)繼續(xù)提供服務(wù)。
配置模塊604還用于在活動管理服務(wù)同級目錄下增加委托類文件,并在該委托類文件中增加將當(dāng)前的進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中的配置系統(tǒng)服務(wù)函數(shù);以及在原生系統(tǒng)服務(wù)中增加跨進(jìn)程調(diào)用服務(wù),通過該跨進(jìn)程調(diào)用服務(wù)調(diào)用該委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中;
調(diào)用模塊616還用于通過該原生系統(tǒng)服務(wù)進(jìn)程中的跨進(jìn)程調(diào)用服務(wù)調(diào)用該委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中,以使該自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程運(yùn)行。
圖8為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的結(jié)構(gòu)框圖。如圖8所示,一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,除了包括自定義系統(tǒng)服務(wù)獲取模塊602、配置模塊604、執(zhí)行文件獲取模塊606和第一生成模塊608,還包括第二生成模塊618。其中:
第二生成模塊618用于將生成的啟動系統(tǒng)服務(wù)的配置文件重新編譯生成只讀內(nèi)存鏡像文件。
在其他實施例中,一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,可包括自定義系統(tǒng)服務(wù)獲取模塊602、配置模塊604、執(zhí)行文件獲取模塊606、第一生成模塊608、加載模塊610、進(jìn)程啟動模塊612、自定義系統(tǒng)服務(wù)啟動模塊614、調(diào)用模塊616和第二生成模塊618的任意可能組合。
圖9為另一個實施例中獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置的結(jié)構(gòu)框圖。如圖9所示,一種獨立系統(tǒng)進(jìn)程的實現(xiàn)裝置,包括加載模塊902、進(jìn)程啟動模塊904、自定義系統(tǒng)服務(wù)啟動模塊906和調(diào)用模塊908。其中:
加載模塊902用于在系統(tǒng)啟動時,加載包含啟動自定義系統(tǒng)服務(wù)的執(zhí)行文件的配置代碼的啟動系統(tǒng)服務(wù)的配置文件。
進(jìn)程啟動模塊904用于根據(jù)加載的系統(tǒng)服務(wù)的配置文件啟動原生系統(tǒng)服務(wù)進(jìn)程和自定義系統(tǒng)服務(wù)進(jìn)程。
自定義系統(tǒng)服務(wù)啟動模塊906用于在該自定義系統(tǒng)服務(wù)進(jìn)程中啟動自定義系統(tǒng)服務(wù);
調(diào)用模塊908用于通過該原生系統(tǒng)服務(wù)進(jìn)程中的跨進(jìn)程調(diào)用服務(wù)調(diào)用委托類文件中的配置系統(tǒng)服務(wù)函數(shù)將自定義系統(tǒng)服務(wù)進(jìn)程標(biāo)識放入系統(tǒng)進(jìn)程列表中,以使該自定義系統(tǒng)服務(wù)進(jìn)程作為獨立系統(tǒng)進(jìn)程運(yùn)行。
本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例方法中的全部或部分流程,是可以通過計算機(jī)程序來指令相關(guān)的硬件來完成,所述的程序可存儲于一非易失性計算機(jī)可讀取存儲介質(zhì)中,該程序在執(zhí)行時,可包括如上述各方法的實施例的流程。其中,所述的存儲介質(zhì)可為磁碟、光盤、只讀存儲記憶體(Read-Only Memory,ROM)等。
以上所述實施例僅表達(dá)了本發(fā)明的幾種實施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。