使用ApplicationInfo.FLAG_SYSTEM过滤掉系统应用程序

时间:2014-02-10 12:45:19

标签: android android-package-managers android-applicationinfo

我使用以下代码来区分用户安装的应用程序和系统应用程序:

final PackageManager pm = getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo packageInfo : packages)
{
    if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)
        Log.d(TAG, "Installed package (System) :" + packageInfo.packageName);
    else
        Log.d(TAG, "Installed package (User) :" + packageInfo.packageName);
}

然而,这有些应用程序作为用户安装的应用程序实际上没有。以下是我的模拟器中的LogCat:

Installed package (User) :com.android.smoketest
Installed package (User) :com.android.widgetpreview
Installed package (User) :com.example.android.livecubes
Installed package (User) :com.example.android.apis
Installed package (User) :com.android.gesture.builder
Installed package (User) :com.example.android.softkeyboard
Installed package (User) :com.android.smoketest.tests
Installed package (User) :faheem.start

理想情况下,只应在用户安装的应用程序中输出最后一个应用程序。

2 个答案:

答案 0 :(得分:0)

如何总结前七个包是系统应用程序?这是不正确的。在对bitwise AND执行SYSTEM_FLAG与其他flags的操作后,您无法说出这必须是系统应用

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/pm/ApplicationInfo.java

阅读ApplicationInfo的上述代码。在那里,您将看到public static final int FLAG_SYSTEM = 1<<0;这意味着,FLAG_SYSTEM左移0位(意味着,FLAG_SYSTE M根本没有移位)。因此,它是1.同样,您看到public static final int FLAG_DEBUGGABLE = 1<<1;这意味着,FLAG_DEBUGGABLE左移1位。这意味着它的值为10.同样,您看到public static final int FLAG_HAS_CODE = 1<<2;这意味着,FLAG_HAS_CODE左移2位。这意味着它的值是100。

在这里,你错了!

if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)
{
// your can't say this must be system app
}

权利是:

if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1)
{
// system app
}

或,

if ((packageInfo.flags == 1)
{
// System app
}

您可以安装PackageNameViewer应用:https://play.google.com/store/apps/details?id=com.csdroid.pkg。它显示了系统和用户应用程序。如下所示,所有列出的内容都在用户应用下。 enter image description here 系统应用 这些应用程序位于/system内的system.img文件夹中。用户应用程序可以位于/system文件夹以外的任何位置。包的名称并不决定是否应用程序是系统应用程序。更多信息,https://android.stackexchange.com/questions/17871/what-are-the-differences-between-a-system-app-and-user-app

即使Gapps(例如,Google智能助理,Gmail等)也不是系统应用。原因是谷歌希望尽可能少地制作系统应用程序。原因是“关注点分离”。在系统应用程序下制作少量应用程序可以使android系统轻松升级(修补) - 因为文件下载量很小system.img - 在系统关键错误中。这是安全原因

答案 1 :(得分:0)

Uddhav Gautam

我认为你的答案在多个地方都是错误的。

  1. 您在链接中站点的代码具体说明:

      

    / **        *与应用程序关联的标志。

    的任意组合
  2. 这意味着你的第三个例子(在OR之后)是完全错误的,因为值0x1001设置了1位但绝对不等于1

    1. 由于对掩码0x1的操作和操作的结果始终为0x0或0x1,因此!= 0和== 1之间没有区别
    2. 表示我确实同意测试任何位的正确方法是:

      if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM)