【问题标题】:Unable to get android.permission.CLEAR_APP_USER_DATA无法获取 android.permission.CLEAR_APP_USER_DATA
【发布时间】:2014-09-05 11:30:47
【问题描述】:

我正在开发需要特殊权限的系统应用程序。由于某种原因,我无法获得许可 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.");
            }

[编辑]

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

【问题讨论】:

    标签: android system


    【解决方案1】:

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

    【讨论】:

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

    更改设备中的设置,然后它就可以正常工作了。

    我们启用开发者选项的方式与我们将有一个选项(USB 调试(安全设置))相同,所以打开它。

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

    例如:Redmi Note 5 Pro - 您可以在设置-->附加设置-->开发者选项-->USB调试中找到

    【讨论】:

      【解决方案3】:

      错误:java.lang.SecurityException:PID 9237 没有权限 android.permission.CLEAR_APP_USER_DATA 清除包的数据

      步骤 1. 启用开发者选项

      步骤 2. 启用 USB 调试

      非常重要的一步:

      第 3 步。搜索“禁用权限监控”并启用它。这将有助于解决 Android 8 及更高版本的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2021-12-26
        • 2015-05-11
        • 2016-12-22
        • 2012-01-23
        • 2014-02-17
        • 2014-08-25
        相关资源
        最近更新 更多