Android,method.invoke崩溃在SDK 26,Oreo?

Android,method.invoke崩溃在SDK 26,Oreo?,第1张

概述这是我在StackOverflow上的第一篇文章.我在我的提升应用程序中使用了反射,如下所示.它在sdk<26中运行良好但在sdk26中我得到了java.lang.reflect.InvocationTargetException异常.我怎样才能在android8中恢复工作?我的代码是这样的:MethodpkgMethod=getPackageManager().get

这是我在StackOverflow上的第一篇文章.

我在我的提升应用程序中使用了反射,如下所示.它在sdk< 26中运行良好但在sdk 26中我得到了java.lang.reflect.InvocationTargetException异常.我怎样才能在androID 8中恢复工作?

我的代码是这样的:

Method pkgMethod = getPackageManager().getClass().getmethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);pkgMethod.invoke(getPackageManager(), pkg.packagename, new IPackageStatsObserver.Stub() {                @OverrIDe                public voID onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws @R_404_1613@ {                    long cacheSize = pStats.externalCacheSize;                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)                        cacheSize += pStats.cacheSize;                    if (cacheSize > 0) {                        Drawable icon = null;                        try {                            icon = getPackageManager().getApplicationIcon(pkg.packagename);                        } catch (PackageManager.nameNotFoundException ignored) {                        }                        String name = pkg.packagename;                        try {                            PackageManager pm = getApplicationContext().getPackageManager();                            name = (String) pm.getApplicationLabel(pm.getApplicationInfo(pkg.packagename, PackageManager.GET_Meta_DATA));                        } catch (PackageManager.nameNotFoundException e) {                            e.printstacktrace();                        }                        totalSize += cacheSize;                        appList.add(new Items(icon, name, pkg.packagename, cacheSize, true, ""));                        publishProgress();                    }                    countDownLatch.countDown();                }            });

这是我得到的例外:

java.lang.reflect.InvocationTargetException04-05 05:20:14.027 2701-4724/com.mydIDantivirus.androID W/System.err:     at java.lang.reflect.Method.invoke(Native Method)04-05 05:20:14.027 2701-4724/com.myantivirus.androID W/System.err:     at com.my.antivirus.ui.JunkfileActivity$ScanTask.doInBackground(JunkfileActivity.java:285)04-05 05:20:14.028 2701-4724/com.myantivirus.androID W/System.err:     at com.my.antivirus.ui.JunkfileActivity$ScanTask.doInBackground(JunkfileActivity.java:260)04-05 05:20:14.028 2701-4724/com.myantivirus.androID W/System.err:     at androID.os.AsyncTask.call(AsyncTask.java:333)04-05 05:20:14.029 2701-4724/com.myantivirus.androID W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)04-05 05:20:14.029 2701-4724/com.myantivirus.androID W/System.err:     at androID.os.AsyncTask$SerialExecutor.run(AsyncTask.java:245)04-05 05:20:14.029 2701-4724/com.myantivirus.androID W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)04-05 05:20:14.029 2701-4724/com.myantivirus.androID W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)04-05 05:20:14.029 2701-4724/com.myantivirus.androID W/System.err:     at java.lang.Thread.run(Thread.java:764)04-05 05:20:14.030 2701-4724/com.myantivirus.androID W/System.err: Caused by: java.lang.NullPointerException: Attempt to read from fIEld 'long androID.content.pm.PackageStats.externalCacheSize' on a null object reference04-05 05:20:14.030 2701-4724/com.myantivirus.androID W/System.err:     at com.my.antivirus.ui.JunkfileActivity$ScanTask.onGetStatsCompleted(JunkfileActivity.java:288)04-05 05:20:14.030 2701-4724/com.myantivirus.androID W/System.err:     at androID.app.ApplicationPackageManager.getPackageSizeInfoAsUser(ApplicationPackageManager.java:2167)04-05 05:20:14.030 2701-4724/com.myantivirus.androID W/System.err:     at androID.content.pm.PackageManager.getPackageSizeInfo(PackageManager.java:5065)04-05 05:20:14.030 2701-4724/com.myantivirus.androID W/System.err:  ... 9 more

我还在AndroID Oreo上尝试了一个缓存清理库,并得到了以下异常:

java.lang.reflect.InvocationTargetException04-05 06:50:46.590 8639-8741/org.mazhuang.cleanexpert W/System.err:     at java.lang.reflect.Method.invoke(Native Method)04-05 06:50:46.590 8639-8741/org.mazhuang.cleanexpert W/System.err:     at org.mazhuang.cleanexpert.util.CleanUtil.freeAllAppsCache(CleanUtil.java:96)04-05 06:50:46.591 8639-8741/org.mazhuang.cleanexpert W/System.err:     at org.mazhuang.cleanexpert.ui.JunkCleanActivity.run(JunkCleanActivity.java:306)04-05 06:50:46.591 8639-8741/org.mazhuang.cleanexpert W/System.err:     at java.lang.Thread.run(Thread.java:764)04-05 06:50:46.591 8639-8741/org.mazhuang.cleanexpert W/System.err: Caused by: java.lang.SecurityException: Neither user 10087 nor current process has androID.permission.CLEAR_APP_CACHE.04-05 06:50:46.591 8639-8741/org.mazhuang.cleanexpert W/System.err:     at androID.os.Parcel.readException(Parcel.java:1942)04-05 06:50:46.591 8639-8741/org.mazhuang.cleanexpert W/System.err:     at androID.os.Parcel.readException(Parcel.java:1888)04-05 06:50:46.591 8639-8741/org.mazhuang.cleanexpert W/System.err:     at androID.content.pm.IPackageManager$Stub$Proxy.freeStorageAndNotify(IPackageManager.java:4865)04-05 06:50:46.591 8639-8741/org.mazhuang.cleanexpert W/System.err:     at androID.app.ApplicationPackageManager.freeStorageAndNotify(ApplicationPackageManager.java:2112)04-05 06:50:46.592 8639-8741/org.mazhuang.cleanexpert W/System.err:     at androID.content.pm.PackageManager.freeStorageAndNotify(PackageManager.java:4996)04-05 06:50:46.593 8639-8741/org.mazhuang.cleanexpert W/System.err:     ... 4 more

解决方法:

更新

从AndroID O(API级别26),您不能将getPackageSizeInfo方法与reflaction一起使用.以下是一个代码,可以帮助你低于API 26级及以上:

private voID getPackageSizeInfo(final Context context, String packagename) {    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {        final StorageStatsManager storageStatsManager = (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE);        final StorageManager storageManager = (StorageManager)  context.getSystemService(Context.STORAGE_SERVICE);        try {            ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packagename, 0);            StorageStats storageStats = storageStatsManager.queryStatsForUID(ai.storageUuID, getApplicationInfo().uID);            long cacheSize =storageStats.getCacheBytes();            long dataSize =storageStats.getDataBytes();            long apkSize =storageStats.getAppBytes();            Toast.makeText(context, cacheSize + ",," + dataSize + ",," + apkSize, Toast.LENGTH_LONG).show();            //long size += info.cacheSize;        } catch (Exception e) {            e.printstacktrace();        }    } else  {        Method getPackageSizeInfo;        try {            getPackageSizeInfo = context.getPackageManager().getClass()                .getmethod("getPackageSizeInfo",                    String.class, Class.forname("androID.content.pm.IPackageStatsObserver"));            getPackageSizeInfo.invoke(context.getPackageManager(), packagename,                new IPackageStatsObserver.Stub() { //error                    public voID onGetStatsCompleted(                        PackageStats pStats, boolean succeeded)                        throws @R_404_1613@ {                        //totalSize = totalSize + pStats.cacheSize;                        //Log.d("size", totalSize+"");                        Toast.makeText(getApplicationContext(), "size"+pStats.cacheSize + ",," + pStats.dataSize + ",," + pStats.codeSize, Toast.LENGTH_SHORT).show();                    }                }            );        } catch (Exception e) {            try {                getPackageSizeInfo = context.getPackageManager().getClass()                    .getmethod("getPackageSizeInfo",                        String.class, Class.forname("androID.content.pm.IPackageStatsObserver"));                getPackageSizeInfo.invoke(context.getPackageManager(), packagename,                    new IPackageStatsObserver.Stub() { //error                        public voID onGetStatsCompleted(                            PackageStats pStats, boolean succeeded)                            throws @R_404_1613@ {                            Toast.makeText(getApplicationContext(), "size"+pStats.cacheSize, Toast.LENGTH_SHORT).show();                        }                    }                );            } catch (Exception ee) {                Log.d("eeeeeeeeeee", "error");                ee.printstacktrace();            }        }    }}

请注意,对于使代码有效的API级别低于26,您应根据以下内容配置AIDL和要求:https://stackoverflow.com/a/30278018/1939409

总结

以上是内存溢出为你收集整理的Android,method.invoke崩溃在SDK 26,Oreo?全部内容,希望文章能够帮你解决Android,method.invoke崩溃在SDK 26,Oreo?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1101686.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存