摘要: 在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 ...