2016-08-23 6 views
37

Я использую PackageStats и при печати кода PackageSize, cacheSize, dataSize, некоторые данные поступают как отрицательные.Android PackageStats дает отрицательные значения

Несколько вопросов:

  • Как это возможно?
  • Каковы сценарии, когда codeSize может быть отрицательным, учитывая, что размер apk составляет около 50 МБ?
  • Любые другие способы, которые могут быть надежно использованы для извлечения выше информации?

Кроме того, для Android N это дает мне "NoSuchMethodException" .so,

  • ли удалена для Android N или есть какой-то способ, чтобы использовать его?
  • Любые альтернативы, которые могут помочь мне рассчитать вышеуказанные размеры?

Код:

PackageManager packageManager = context.getPackageManager(); 
Method myUserId = UserHandle.class.getDeclaredMethod("myUserId"); 
int userID = (Integer) myUserId.invoke(packageManager); 

Method getPackageSizeInfo = packageManager.getClass().getDeclaredMethod("getPackageSizeInfo", String.class, int.class, 
IPackageStatsObserver.class); 
getPackageSizeInfo.invoke(packageManager, context.getPackageName(), userID, new IPackageStatsObserver.Stub() { 

    @Override 
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { 
     long codeSize = pStats.codeSize/MB; //long MB = 1024*1024; 
     long cacheSize = pStats.cacheSize/MB; 
     long dataSize = pStats.dataSize/MB; 
     long appSize = codeSize + cacheSize + dataSize; 
    }; 
} 
+0

Не могли бы вы добавить пример кода, включающий, как вы показываете/проверяете значение, а также любые вычисления, выполняемые над этим значением? – Zachary

+0

Хорошо, конечно. Я не выполняю никаких вычислений, кроме 1, где я делю значения на 1024 * 1024, чтобы получить значение в МБ. – thepace

ответ

0

просто примерил API 23/24 и может просто экземпляр его.

Эти объекты external* могут ссылаться на SD-карту.

PackageStats stats = new PackageStats(context.getPackageName()); 
    long codeSize = stats.codeSize + stats.externalCodeSize; 
    long dataSize = stats.dataSize + stats.externalDataSize; 
    long cacheSize = stats.cacheSize + stats.externalCacheSize; 
    long appSize = codeSize + dataSize + cacheSize; 
+0

Я согласен с вами. Другой способ - если он превышает длинный, что возможно. Что вы подразумеваете под эгидой? – thepace

+0

@thepace с «just instance it» Я имею в виду «новое» ключевое слово - без 'invoke()' и 'onGetStatsCompleted()'. отрицательные значения в основном возможны только со знаком целого числа, поэтому максимум может не быть 4294967295, но 2147483647 (в то время как -2147483647 может просто указывать ошибку или отсутствующее значение) ... в то время как действительно имеет значение, какой пользователь запускает код, поскольку существует приложение, пользовательское и общедоступное хранилище, а пользовательская область может отличаться по размеру. –

+0

Вы могли бы поделиться точной командой, чтобы получить размер (как вы предложили с onGetStatsCompleted не требуется) – thepace