无法获取android.permission.CLEAR_APP_USER_DATA权限

7

我正在开发一个需要特殊权限的系统应用程序。由于某些原因,我无法获取CLEAR_APP_USER_DATA权限,但我可以使用INSTALL_PACKAGES、DELETE_PACKAGES和其他权限。这是什么原因引起的呢?

清单文件:

uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
uses-permission android:name="android.permission.DELETE_PACKAGES"/>
uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

我去掉了'<',因为它不会显示其他行。

使用权限的代码:

String apkPackage = intent.getExtras().getString(context.getString(R.string.key_package));
            if (apkPackage != null) {
                PackageManager pm = context.getPackageManager();
                Class<?>[] types = new Class[] {String.class, IPackageDataObserver.class};
                try {
                    Method methodClearUserData = pm.getClass().getMethod("clearApplicationUserData", types);
                    methodClearUserData.invoke(pm, new Object[] {apkPackage, null});
                    Method methodDeleteCache = pm.getClass().getMethod("deleteApplicationCacheFiles", types);
                    methodDeleteCache.invoke(pm, new Object[] {apkPackage, null});
                } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                    Log.w(TAG, "Unable to invoke clear method.", e);
                }
            } else {
                Log.w(TAG, "Provided APK package is null.");
            }

[Edit]

07-15 14:29:32.136: W/RequestReceiver(4367): Unable to invoke clear method.
07-15 14:29:32.136: W/RequestReceiver(4367): java.lang.reflect.InvocationTargetException
07-15 14:29:32.136: W/RequestReceiver(4367):    at java.lang.reflect.Method.invokeNative(Native Method)
07-15 14:29:32.136: W/RequestReceiver(4367):    at java.lang.reflect.Method.invoke(Method.java:525)
07-15 14:29:32.136: W/RequestReceiver(4367):    at com.test.appmanager.RequestReceiver.onReceive(RequestReceiver.java:114)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2558)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.app.ActivityThread.access$1500(ActivityThread.java:165)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.os.Handler.dispatchMessage(Handler.java:107)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.os.Looper.loop(Looper.java:194)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.app.ActivityThread.main(ActivityThread.java:5370)
07-15 14:29:32.136: W/RequestReceiver(4367):    at java.lang.reflect.Method.invokeNative(Native Method)
07-15 14:29:32.136: W/RequestReceiver(4367):    at java.lang.reflect.Method.invoke(Method.java:525)
07-15 14:29:32.136: W/RequestReceiver(4367):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
07-15 14:29:32.136: W/RequestReceiver(4367):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-15 14:29:32.136: W/RequestReceiver(4367):    at dalvik.system.NativeStart.main(Native Method)
07-15 14:29:32.136: W/RequestReceiver(4367): Caused by: java.lang.SecurityException: Neither user 10070 nor current process has android.permission.CLEAR_APP_USER_DATA.
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.os.Parcel.readException(Parcel.java:1425)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.os.Parcel.readException(Parcel.java:1379)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.content.pm.IPackageManager$Stub$Proxy.clearApplicationUserData(IPackageManager.java:2918)
07-15 14:29:32.136: W/RequestReceiver(4367):    at android.app.ApplicationPackageManager.clearApplicationUserData(ApplicationPackageManager.java:1177)
07-15 14:29:32.136: W/RequestReceiver(4367):    ... 14 more
3个回答

8
错误:java.lang.SecurityException:PID 9237没有权限android.permission.CLEAR_APP_USER_DATA来清除包的数据。
步骤1.启用开发者选项。
步骤2.启用USB调试。
非常重要的步骤:
步骤3.搜索“禁用权限监视”,并启用它。这将有助于解决Android 8及以上版本的问题。

这对我的Android 8 Oppo手机有所帮助。 - toshism
第三步也可以被称为“USB调试(安全设置)”(在MIUI中) - Dmitry

4

更改设备设置,然后它的工作就很酷了。

我们启用开发人员选项的方式与我们将拥有一个选项(USB调试(安全设置))的方式相同,因此打开该选项。

不同设备的选项可能不同。

例如:红米Note 5 Pro - 您可以在设置-->其他设置-->开发人员选项-->USB调试中找到。


1

该权限被标记为“不适用于第三方应用程序”。您提到正在构建“系统应用程序”,这是否意味着您正在创建一个与自定义平台映像(针对您自己的设备、自定义ROM等)捆绑的应用程序?为了使用它,它必须是一个“系统”应用程序,预先安装在映像上,由“系统”用户拥有并使用平台密钥签名。


INSTALL_PACKAGES同样是“不适用于第三方应用程序”,但它的效果与其他应用程序一样好。这个应用程序将与定制的ROM捆绑在一起,但现在我使用root设备并自己将应用程序移动到系统文件夹中。 - SMGhost
没错,INSTALL_PACKAGES也被标记为不可使用。这通常意味着不应该使用该权限,但在某些情况下,系统实际上也会强制执行它。然而,我刚刚浏览了Android 4.4.2的源代码,并没有发现框架中有任何强制要求这些权限只能由系统应用程序使用。仔细查看您的代码,我怀疑问题实际上是您正在使用反射来访问隐藏的方法,但签名不正确。在4.4.2中,clearApplicationUserData有两种形式:(String, IPackageDataObserver, int)和(String, int)。 - Larry Schiefer
此外,仅仅将您的应用程序复制到系统文件夹(或/system/app)并不会赋予它任何特殊的权限或功能。在这种情况下,这并不是关键问题,但在其他情况下,例如通过HAL访问硬件接口时,您的应用程序必须由ROM平台密钥签名,并标记为“系统”用户。 - Larry Schiefer
我忘了提到,我使用的是4.2.2版本,它只有一个方法和签名:public abstract void clearApplicationUserData(String packageName, IPackageDataObserver observer); - SMGhost
我手头没有那个 AOSP 的版本,所以无法告诉您它是否有所不同。然而,依靠反射来访问API非常脆弱,我不建议这样做。如果您正在为ROM创建系统应用程序,则应将其构建到映像中,并确保该应用程序使用平台密钥正确签名、标记为系统用户,并且还链接到内部框架库,以便不需要反射。祝好运! - Larry Schiefer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接