麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

一種安卓應用安裝包、應用目標進程?;罘椒跋到y與流程

文檔序號:11154611閱讀:392來源:國知局
一種安卓應用安裝包、應用目標進程保活方法及系統與制造工藝



背景技術:

用戶使用完安卓應用并退出后,有些服務service進程仍然需要在后臺繼續運行,例如推送服務,應用在退出后要向用戶推送新的短信信息和聊天服務等,需要維持一個常駐后臺服務,用來等待服務器發送的消息。又如應用退出后的網盤服務,即文件傳輸服務時需要后臺上傳文件或者下載文件。這些依賴后臺的服務進程通常都會被安卓操作系統查殺,所以維持這些服務進程的存活成為一個必須解決的問題。目前的安卓應用進程?;罘桨付蓟贘ava層,最早出現的進程?;罘桨福浠舅悸肪褪菓米砸恍┫到y事件的廣播,例如時間變化或者開機等。其次,使用AlarmManager拉起進程,AlarmManager是安卓操作系統提供的鬧鐘或者稱為定時服務,很多應用備忘提醒功能就是基于其實現,其基本思路是應用注冊一個AlarmManager定時任務,每隔一段時間拉起進程。另外,也可以修改服務service的回調方法onStartCommand回調返回值,其返回值如果設置成START_STICKY常量,在系統內存不足時將其殺掉后,內存充足時將其重啟,該方案只在某些情況下有效。由于在安卓操作系統上的各種root權限的軟件或者第三方rom所設計的進程查殺都是基于安卓操作系統提供的用戶進程查殺接口,如果系統調用該接口,則上述所有基于Java層實現的進程保活方案基本上都不會起作用。



技術實現要素:

針對現有技術中存在的缺陷,本發明的主要目的在于提供一種安卓應用安裝包,本發明的另一目的在于提供一種安卓應用的應用目標進程保活系統及方法,能夠在應用退出時,確保應用目標進程常駐操作系統后臺,避免被安卓操作系統查殺。

本發明提供一種安卓應用安裝包,安卓應用安裝包解壓縮后的目錄中包括Linux可執行文件,所述Linux可執行文件用于監聽預設的應用目標進程,并重啟被安卓操作系統關閉的應用目標進程。

在上述技術方案的基礎上,所述Linux可執行文件用于在用戶空間中通過Linux系統調用函數依次創建應用目標進程的第一子進程和第二子進程,所述第二子進程為第一子進程的子進程,并關閉所述第一子進程;所述第二子進程監聽應用目標進程是否被關閉,若是,重新啟動應用目標進程,并關閉自身進程。

在上述技術方案的基礎上,所述Linux可執行文件包括arm和x86架構的可執行文件。

本發明還提供一種應用目標進程保活方法,包括以下步驟:應用在移動客戶端上開始運行時,檢測應用文件目錄中是否有Linux可執行文件,若無,將所述Linux可執行文件從解壓縮后的目錄復制到應用文件目錄中,調用應用文件目錄中的所述Linux可執行文件。

在上述技術方案的基礎上,所述Linux可執行文件包括arm和x86架構的可執行文件。

在上述技術方案的基礎上,檢測應用文件目錄中是否有Linux可執行文件包括:

獲取移動客戶端的CPU類型,檢測應用文件目錄中是否有與所述CPU類型對應的Linux可執行文件。

在上述技術方案的基礎上,調用應用文件目錄中的所述Linux可執行文件包括:

A.在安卓操作系統中調用所述Linux可執行文件;

B.所述Linux可執行文件在用戶空間中通過Linux系統調用函數依次創建應用目標進程的第一子進程和第二子進程,所述第二子進程為所述第一子進程的子進程,并關閉所述第一子進程;

C.所述第二子進程監聽應用目標進程是否被關閉,若是,重新啟動應用目標進程,并關閉自身進程,進入步驟B。

在上述技術方案的基礎上,所述Linux系統調用函數為fork()、clone()或者vfork()函數。

在上述技術方案的基礎上,所述第二子進程監聽應用目標進程是否被關閉包括:

所述第二子進程以設定的時間間隔持續地檢測/proc目錄下是否有應用目標進程的進程信息。

本發明還提供一種應用目標進程?;钕到y,其包括:

檢測模塊,用于應用在移動客戶端上運行時,檢測應用文件目錄中是否有Linux可執行文件,若無,將所述Linux可執行文件從解壓縮后的目錄復制到應用文件目錄中;

執行模塊,用于調用應用文件目錄中的所述Linux可執行文件。

與現有技術相比,本發明的優點如下:

(1)本發明利用Linux可執行文件監聽應用的應用目標進程,并重新啟動被安卓操作系統關閉的應用目標進程,能夠在應用退出時,確保應用目標進程常駐后臺,避免被安卓操作系統查殺。

(2)本發明保證應用目標進程與用于重啟應用目標進程的第二子進程的關系是一一對應的,不會出現僵尸進程,完全避免了維護應用目標進程與第二子進程之間的相互通訊問題,降低了Linux操作系統的負荷。

(3)本發明可以用于CPU為arm和x86架構的移動客戶端設備,適用范圍廣泛。

附圖說明

圖1是本發明實施例應用目標進程?;罘椒鞒虉D;

圖2是步驟S3的具體流程圖;

圖3是本發明實施例應用目標進程保活系統示意圖。

具體實施方式

術語說明:

Native:安卓應用的編程一般都基于安卓操作系統提供的Java虛擬機,由于安卓操作系統基于Linux內核,所以也可以通過c/c++語言直接運行在Linux內核上的程序。

因為安卓操作系統是一個基于Linux內核的操作系統,為了保證應用之間的沙箱隔離,安卓操作系統上的每個應用都是以Linux中的一個用戶的形式存在,也就是說一個安卓應用就是一個Linux的用戶,安卓操作系統的系統級進程查殺接口就是殺掉該應用,也就是該用戶下所有的進程,Java端的方法在此接口下的發揮的作用有限。但是可以利用Linux的特性創建子進程來解決該問題。

下面結合附圖及具體實施例對本發明作進一步的詳細描述。

本發明實施例提供一種安卓應用安裝包,安卓應用安裝包解壓縮后的目錄中包括Linux可執行文件,Linux可執行文件用于監聽預設的應用目標進程,并重啟被安卓操作系統關閉的應用目標進程。

Linux的程序一般使用c/c++編寫,在安卓操作系統上創建一個Linux可執行程序時,例如這里可以將Linux可執行程序命名為protection,只需要在編譯配置文件,也就是android.mk文件中,將編譯類型寫成include$(BUILD_EXECUTABLE),即為可執行文件。

Linux可執行文件通過進程的應用目標進程的id號來唯一判斷應用目標進程。

Linux可執行文件包括arm和x86架構的可執行文件。

Linux可執行文件通過安卓操作系統提供的ndk工具將其編譯成可執行文件,這個Linux可執行文件應該會有多個,因為安卓操作運行在多種CPU架構上,如arm和x86等,所以應該有多種CPU架構對應的Linux可執行文件,Linux可執行文件放入到應用安裝包解壓縮后的目錄中,例如assets目錄下。

本發明可以用于CPU為arm和x86架構的移動客戶端設備,適用范圍廣泛。

Linux可執行文件用于在用戶空間中通過Linux系統調用函數依次創建應用目標進程的第一子進程和第二子進程,第二子進程為第一子進程的子進程,并關閉第一子進程;第二子進程監聽應用目標進程是否被關閉,若是,重新啟動應用目標進程,并關閉自身進程。

在Linux操作系統中可以使用fork()函數創建一個進程,fork()函數的作用是通過初始化創建一個與源進程相同的新進程,在程序運行中對創建的新進程單獨修改后,新進程才會與源進程不同。因此,可以使用fork()函數創建與源進程相同的子進程,源進程即為父進程。由于fork()函數的特點是調用一次,返回2次,返回值小于0時,表示是創建出錯,返回值等于0表示是子進程,返回值大于0表示是父進程。這里當返回值大于0時,什么都不做,當返回值小于0時,需要再一次調用fork()函數,在Linux操作系統中,當某一個子進程的父進程被殺掉后,子進程會被Linux的初始化init進程接管。在用戶空間中通過Linux系統調用函數依次創建應用目標進程的第一子進程和第二子進程,第二子進程為第一子進程的子進程,并關閉第一子進程。這里就是為了創建的第二子進程與應用目標進程斷掉父子關系,第二次調用fork()函數后,當返回值大于0時,殺掉第一子進程,當返回值等于0時,即表示第二子進程被初始化init進程接管。

本發明利用Linux可執行文件監聽應用的應用目標進程,并重新啟動被安卓操作系統關閉的應用目標進程,能夠在應用退出時,確保應用目標進程常駐后臺,避免被安卓操作系統查殺。

基于安卓應用安裝包,本發明實施例提供一種應用目標進程保活方法,參見圖1所示,包括以下步驟:

S1.應用在移動客戶端上開始運行時,檢測應用文件目錄中是否有Linux可執行文件,若無,進入S2;若有,進入S3。

Linux可執行文件包括arm和x86架構的可執行文件。

步驟S1具體包括:

獲取移動客戶端的CPU類型,檢測應用文件目錄中是否有與CPU類型對應的Linux可執行文件,若無,進入S2;若有,進入S3。

可以通過android.os.Build.CPU_ABI常量來判斷當前的移動客戶端中的CPU的類型,當CPU_ABI返回的是arm類型時,就將assets目錄下的arm類型的Linux可執行文件復制到應用文件目錄下,可以通過context.getFileDir方法獲取應用文件目錄。

S2.將Linux可執行文件從解壓縮后的目錄復制到應用文件目錄中。

Linux可執行文件必須在擁有可執行權限的磁盤分區中才能使用,安卓手機默認的sdcard分區沒有可執行權限,所以必須將其拷貝到具有可執行權限的分區位置,應用自身文件目錄就是一個很好的選擇。

S3.調用應用文件目錄中的Linux可執行文件。

參見圖2所示,步驟S3具體包括:

S3.1在安卓操作系統中調用Linux可執行文件。

在安卓Java層調用Linux可執行文件也需要通過命令行調用,Java層提供的方法是Runtime.getRuntime().exec(),參數就是通過context.getFileDir方法獲取的Linux可執行文件protection在應用文件目錄下的路徑,還需要傳入應用目標進程的id號以及服務名,id號通過系統提供的Processes.myPid()方法獲取。

S3.2Linux可執行文件在用戶空間中通過Linux系統調用函數依次創建應用目標進程的第一子進程和第二子進程,第二子進程為第一子進程的子進程,并關閉第一子進程。

Linux系統調用函數為fork()、clone()或者vfork()函數。

以下以fork()函數為例具體說明:

第一次調用fork()函數后,返回值大于0時,什么都不做,當返回值小于0時,需要再一次調用fork()函數,第二次調用fork()函數后,當返回值大于0時,關閉第一子進程,再次判斷返回值等于0時,即表示第二子進程被初始化init進程接管。

S3.3第二子進程監聽應用目標進程是否被關閉,若是,進入S3.4;若否,忽略。

第二子進程監聽應用目標進程是否被關閉包括:第二子進程以設定的時間間隔持續地檢測/proc目錄下是否有應用目標進程的進程信息。

因為Linux操作系統把一個處在運行狀態的進程信息都寫在/proc目錄下,可以通過讀取/proc目錄下是否已有該進程id的命令來判斷一個進程是否運行。這里可以調用access函數,將/proc和應用目標進程id作為參數傳入access函數,當access函數返回值不為0,表示應用目標進程目錄不存在,也就是應用目標進程沒有運行或者已被關掉。因為應用運行后,第二子進程需要不停的檢測應用目標進程是否被關閉,為了不過多占用CPU時間,可以調用sleep函數,每循環一次都睡眠一段時間,可以設置成2秒,既能少占用CPU時間,也能在應用目標進程被關閉后快速地拉起。

S3.4重新啟動應用目標進程,并關閉自身進程,進入S3.2。

從S3.3中判斷出應用目標進程不存在后需要將其拉起,在c中啟動安卓服務需要使用命令行調用execlp函數來執行命令am startservice-n name,其中,name就是需要傳入的應用目標進程名稱,該名稱可以同應用目標進程的id一起被傳入。當拉起應用目標進程后,第二子進程通過調用exit()函數關閉自身進程,然后,新啟動的應用目標進程重新啟動一個新的第二子進程,從而實現應用目標進程與第二子進程的一一對應關系。

本發明采用的是Linux可執行方式重新開啟應用目標進程,而不是運用native的jni與應用通訊的方式的原因是:單獨的Linux可執行程序能繞過安卓應用層進程查殺,從而達到比安卓應用層處理更強的?;罟δ?。另外,也確保應用目標進程與第二子進程的關系是一一對應,不會出現僵尸進程,方便進程之間的通訊管理。例如,A1是第二子進程,A2是應用目標進程,A2的進程id是1,當A2被殺后,A1檢測到進程id為1的應用目標進程A2不在了,啟動一個新的A2,此時新的A2的id是2,由于A1仍然與id為1的應用目標進程對應,所以此時就必須通知A1,使A1將要監聽的應用目標進程的id修改為2。所以現有的native方法都需要一個通訊機制實現進程之間的互相通訊,有的使用管道,有的使用socket,無論哪種方法,都需要準確地了解當前應用目標進程與第二子進程之間的狀態,這導致進程維護進本非常高,而本發明采用的方法是成對的應用目標進程與第二子進程,應用目標進程被關閉后,第二子進程重新啟動應用目標進程,并關閉自身進程,然后出現一對新的應用目標進程與第二子進程,完全避免了相互通訊之間的維護問題。

本發明保證應用目標進程與用于重啟應用目標進程的第二子進程的關系是一一對應的,不會出現僵尸進程,完全避免了維護應用目標進程與第二子進程之間的相互通訊問題,降低了Linux操作系統的負荷。

本發明利用Linux可執行文件監聽應用的應用目標進程,并重新啟動被安卓操作系統關閉的應用目標進程,能夠在應用退出時,確保應用目標進程常駐后臺,避免被安卓操作系統查殺。

本發明實施例還提供應用目標進程保活系統,參見圖1所示,其包括:

檢測模塊,用于應用在移動客戶端上運行時,檢測應用文件目錄中是否有Linux可執行文件,若無,將Linux可執行文件從解壓縮后的目錄復制到應用文件目錄中。

執行模塊,用于調用應用文件目錄中的Linux可執行文件。

本發明不局限于上述實施方式,對于本技術領域的普通技術人員來說,在不脫離本發明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也視為本發明的保護范圍之內。本說明書中未作詳細描述的內容屬于本領域專業技術人員公知的現有技術。

當前第1頁1 2 3 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 嘉善县| 紫金县| 屏边| 余干县| 乡宁县| 鹿邑县| 四子王旗| 北宁市| 金华市| 宝丰县| 彭阳县| 五常市| 永登县| 永靖县| 措美县| 报价| 会宁县| 汉源县| 米脂县| 揭阳市| 桑日县| 雅安市| 文昌市| 加查县| 江北区| 津市市| 平塘县| 沙湾县| 旅游| 右玉县| 克东县| 湛江市| 城口县| 绥江县| 册亨县| 建水县| 加查县| 新密市| 新泰市| 安远县| 绥化市|