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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值