我使用以下代码来区分用户安装的应用程序和系统应用程序:
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
理想情况下,只应在用户安装的应用程序中输出最后一个应用程序。
答案 0 :(得分:0)
如何总结前七个包是系统应用程序?这是不正确的。在对bitwise AND
执行SYSTEM_FLAG
与其他flags
的操作后,您无法说出这必须是系统应用。
阅读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。它显示了系统和用户应用程序。如下所示,所有列出的内容都在用户应用下。
系统应用
这些应用程序位于
/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
我认为你的答案在多个地方都是错误的。
您在链接中站点的代码具体说明:
/ ** *与应用程序关联的标志。
的任意组合
这意味着你的第三个例子(在OR之后)是完全错误的,因为值0x1001设置了1位但绝对不等于1
表示我确实同意测试任何位的正确方法是:
if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM)