Android系統(tǒng)應(yīng)用(12)

如何成為系統(tǒng)應(yīng)用

方法一:在Manifest中聲明android:sharedUserId的值為:android.uid.system,android.uid.phone,android.uid.log,android.uid.nfc,android.uid.bluetooth,android.uid.shell的應(yīng)用。

#android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

//PMS中根據(jù)privateFlags和flags來(lái)判定一個(gè)應(yīng)用是否為SystemApp或PrivilegedApp
private static boolean isSystemApp(PackageParser.Package pkg) {
    return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}

//特權(quán)系統(tǒng)應(yīng)用
private static boolean isPrivilegedApp(PackageParser.Package pkg) {
    return (pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
}

private static boolean isSystemApp(PackageSetting ps) {
    return (ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0;
}

//根據(jù)sharedUserId賦值flags和privateFlags,全部為特權(quán)系統(tǒng)應(yīng)用
mSettings = new Settings(mPackages);
mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.log", LOG_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.nfc", NFC_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.bluetooth", BLUETOOTH_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.shell", SHELL_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);

方法二:指定目錄下的應(yīng)用:/vendor/overlay,/system/framework,/system/priv-app,/system/app,/vendor/app,/oem/app。

#android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

private static final String VENDOR_OVERLAY_DIR = "/vendor/overlay";
  
File vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);
scanDirLI(vendorOverlayDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags | SCAN_TRUSTED_OVERLAY, 0);

//PackageParser.PARSE_IS_PRIVILEGED標(biāo)志會(huì)轉(zhuǎn)換為ApplicationInfo.PRIVATE_FLAG_PRIVILEGED
// /system/framework為特權(quán)系統(tǒng)應(yīng)用,只是包含資源,不包含代碼
File frameworkDir = new File(Environment.getRootDirectory(), "framework");
scanDirLI(frameworkDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR | PackageParser.PARSE_IS_PRIVILEGED,scanFlags | SCAN_NO_DEX, 0);
// /system/priv-app為特權(quán)系統(tǒng)應(yīng)用
final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app");
scanDirLI(privilegedAppDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR | PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0);

final File systemAppDir = new File(Environment.getRootDirectory(), "app");
scanDirLI(systemAppDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);

File vendorAppDir = new File("/vendor/app");
scanDirLI(vendorAppDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);

final File oemAppDir = new File(Environment.getOemDirectory(), "app");
scanDirLI(oemAppDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);

系統(tǒng)應(yīng)用分類(lèi)

普通系統(tǒng)應(yīng)用
特權(quán)系統(tǒng)應(yīng)用
定義:特權(quán)系統(tǒng)應(yīng)用是系統(tǒng)應(yīng)用,同時(shí)有ApplicationInfo.PRIVATE_FLAG_PRIVILEGED標(biāo)志。
功能:可以使用protectionLevel為signatureOrSystem或signature|privileged的權(quán)限。

如何成為特權(quán)系統(tǒng)應(yīng)用

根據(jù)如何成為系統(tǒng)應(yīng)用中PackageManagerService的定義,成為特權(quán)系統(tǒng)應(yīng)用有如下兩種方法:
方法一:在Manifest中聲明android:sharedUserId的值為:android.uid.system,android.uid.phone,android.uid.log,android.uid.nfc,android.uid.bluetooth,android.uid.shell的應(yīng)用。
方法二:指定目錄下的應(yīng)用:/system/framework,/system/priv-app。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評(píng)論 25 709
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,899評(píng)論 2 59
  • 最近面試聊到很多啟動(dòng)過(guò)程的事情: Android系統(tǒng)的啟動(dòng)過(guò)程中就已經(jīng)解析了系統(tǒng)中安裝應(yīng)用的androidMani...
    樂(lè)之飛于閱讀 1,426評(píng)論 0 1
  • 早上棟哥果然沒(méi)有像平時(shí)那樣把我吵醒。一大早就開(kāi)收拾行李,到中午才算弄完。 下午打了今年最后一把升級(jí)(拖拉機(jī))。 玩...
    一次遇見(jiàn)閱讀 588評(píng)論 0 0
  • 當(dāng)XP系統(tǒng)退出歷史舞臺(tái)的時(shí)候,眾多的Linux愛(ài)好者就撰文列舉Linux替代XP的種種可能。雖然講得很有道理,加上...
    殘劍閱讀 597評(píng)論 0 2

友情鏈接更多精彩內(nèi)容