
这是我在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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)