android系统应用功能,Android系统应用(12)
如何成為系統應用
方法一:在Manifest中聲明android:sharedUserId的值為:android.uid.system,android.uid.phone,android.uid.log,android.uid.nfc,android.uid.bluetooth,android.uid.shell的應用。
#android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
//PMS中根據privateFlags和flags來判定一個應用是否為SystemApp或PrivilegedApp
private static boolean isSystemApp(PackageParser.Package pkg) {
return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
//特權系統應用
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;
}
//根據sharedUserId賦值flags和privateFlags,全部為特權系統應用
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);
方法二:指定目錄下的應用:/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標志會轉換為ApplicationInfo.PRIVATE_FLAG_PRIVILEGED
// /system/framework為特權系統應用,只是包含資源,不包含代碼
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為特權系統應用
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);
系統應用分類
普通系統應用
特權系統應用
定義:特權系統應用是系統應用,同時有ApplicationInfo.PRIVATE_FLAG_PRIVILEGED標志。
功能:可以使用protectionLevel為signatureOrSystem或signature|privileged的權限。
如何成為特權系統應用
根據如何成為系統應用中PackageManagerService的定義,成為特權系統應用有如下兩種方法:
方法一:在Manifest中聲明android:sharedUserId的值為:android.uid.system,android.uid.phone,android.uid.log,android.uid.nfc,android.uid.bluetooth,android.uid.shell的應用。
方法二:指定目錄下的應用:/system/framework,/system/priv-app。
總結
以上是生活随笔為你收集整理的android系统应用功能,Android系统应用(12)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (原)Ubuntu14中安装Graphi
- 下一篇: 手机只能签荣耀!最忠诚代言人胡歌喊你去天