Android應用的persistent屬性

2021-07-30 22:43:25 字數 4112 閱讀 5163

摘要: 在android系統中,有一種永久性應用。它們對應的androidmanifest.xml檔案裡,會將persistent屬性設為true。

說說android應用的persistent屬性

侯 亮在android系統中,有一種永久性應用。它們對應的androidmanifest.xml檔案裡,會將persistent屬性設為true,比如:

android:

persistent="true"

android:

label="@string/dialericonlabel"

android:

icon="@drawable/ic_launcher_phone"

>

在系統啟動之時,ams的systemready()會載入所有persistent為true的應用。

public

void

systemready

(final

runnable goingcallback)}}

} catch

(remoteexception ex)

其中的stock_pm_flags的定義如下:

// the flags that are set

forall calls we make to

the package

manager.

static

final

intstock_pm_flags = packagemanager.get_shared_library_files;

public

flags) }}

return

finallist;

}

從**裡可以看出,帶persistent標誌的系統應用(即flags中設定了flag_system)是一定會被選上的,但如果不是系統應用的話,則要進一步判斷當前是否處於「安全模式」,一旦處於安全模式,那麼就算應用設定了persistent屬性,也不會被選中。

final

processrecord

boolean

isolated)

else

if) , true

); }

// this package really, really can not be stopped.

trycatch

(remoteexception e) catch

(illegalargumentexception e)

if; }

if) return

}

現在,我們就清楚了,那些persistent屬性為true的應用,基本上都是在系統啟動伊始就啟動起來的。

private

final

boolean

// the pid if we are running in multiple processes, or just pull the

. . . . . .

thread

.asbinder

().linktodeath

(adr, 0

); . . . . . .

thread

enableopengltrace, isrestrictedbackupmode || !normalmode,

getcommonserviceslocked(),

mcoresettingsobserver.getcoresettingslocked());

. . . . . .

. . . . . .

mpersistentstartingprocesses

.remove

. . . . . .

我們知道,persistent一詞的意思是「持久」,那麼persistent應用的意思又是什麼呢?簡單地說,這種應用會頑固地執行於系統之中,從系統一啟動,一直到系統關機。

註冊訃告***的**如下:

thread.asbinder().linktodeath(adr, 0

);

private

final

class

implements

ibinder

.deathrecipient

public

void

binderdied

() }

}

private

final

void

boolean

restarting,

boolean

allowrestart,

intindex)

else

if

}. . . . . .

. . . . . .

ifelse

if

. . . . . .

}

現在我們可以畫一張關於「啟動persistent應用」的示意圖:

在ams中,有乙個isallowedwhilebooting()函式,其**如下:

boolean

isallowedwhilebooting

從這個函式可以看到,將persistent屬性設為true的應用,是允許在boot的過程中啟動的。我們可以檢視前文提到的startprocesslocked()函式:

final

processrecord

startprocesslocked

boolean

knowntobedead,

intintentflags, string hostingtype, componentname hostingname,

boolean

allowwhilebooting,

boolean

isolated)

else

. . . . . .

. . . . . .

if(!mprocessesready

&& !isallowedwhilebooting(info)

&& !allowwhilebooting)

if(debug_processes) slog.v(tag, "system not ready, putting on hold: "

return

}return

;}

其中的最後幾句可以改寫為以下更易理解的形式:

if

(mprocessesready || isallowedwhilebooting(info) || allowwhilebooting)

else

也就是說,當系統已經處於以下幾種情況時,多引數的startprocesslocked()會進一步呼叫另乙個只有三個引數的startprocesslocked():

1)系統已經處於ready狀態;

2)想要啟動persistent應用;

3)引數中明確指定可以在boot過程中啟動應用。

補充說一下,一般情況下,當ams呼叫startprocesslocked()時,傳入的allowwhilebooting引數都為false。比如說,當系統需要啟動「某個content provider或者某個service或者某個特定activity」時,此時傳給startprocesslocked()的allowwhilebooting引數是寫死為false的。只有一種特殊情況下會在該引數中傳入true,那就是當系統發出的廣播intent中攜帶有intent.flag_receiver_boot_upgrade標記時,此時允許在系統未ready時,啟動接受廣播的目標程序。

有關android應用的persistent屬性,我們就先說這麼多。希望對大家有點兒幫助。

android高階應用

android activity service broadcaster三大元件之間互相呼叫 service實時向activity傳遞資料案例 android service獲取當前位置 gps 基站 四十七 實現呼叫android手機的拍照功能 四十六 android中的bitmap 四十五 an...

Android應用入口

用eclipse開發android應用程式,在新建乙個工程時通常很多配置已經自動生成,故很多剛入門的程式設計師只知道程式的入口是activitythread,activity的入口是oncreate方法,而不太清楚程式到底是從哪個activity進去的。action節點中的android.inten...

Android 應用安全

2.簽名和金鑰 3.android許可權 xmlns android package com.aaptl.security android versioncode 1 android versionname 1.0 android name com.aaptl.security.read data ...