Android PackageStats дает отрицательные значения

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

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

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

Кроме того, для Android N это дает мне «NoSuchMethodException». Итак,

  • Это удалено для 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;
    };
}

person thepace    schedule 23.08.2016    source источник
comment
Не могли бы вы добавить пример кода, включая то, как вы отображаете/проверяете значение, а также любые вычисления, выполняемые для этого значения?   -  person Zachary    schedule 18.09.2016
comment
Да конечно. Я не выполняю никаких вычислений, кроме 1, в котором я делю значения на 1024 * 1024, чтобы получить значение в МБ.   -  person thepace    schedule 18.09.2016


Ответы (1)


только что попробовал 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;
person Martin Zeitler    schedule 21.09.2016
comment
Я согласен с тобой. Еще один способ - если он превышает длину, что возможно. Что вы имеете в виду под простым примером? - person thepace; 21.09.2016
comment
@thepace только с экземпляром, я имею в виду ключевое слово new - без invoke() и onGetStatsCompleted(). отрицательные значения в основном возможны только с целым числом со знаком, поэтому максимум может быть не 4294967295, а 2147483647 (в то время как -2147483647 может просто указывать на ошибку или отсутствующее значение)... хотя действительно имеет значение, какой пользователь запускает код, поскольку существует приложение, личное и совместно используемое пользователем хранилище, причем размер личной области пользователя может различаться. - person Martin Zeitler; 21.09.2016
comment
не могли бы вы поделиться точной командой, чтобы получить размер (как вы предложили, onGetStatsCompleted не требуется) - person thepace; 21.09.2016
comment
Каждый раз дает ноль. Я сомневаюсь, что это работает, потому что, если бы это было так просто, все бы его использовали. stackoverflow.com/questions/1806286/getting-installed-app-size< /а> - person thepace; 22.09.2016
comment
Только создание экземпляра никогда не даст вам размер приложения. Взгляните на строку номер 16562 класса PackageManagerService, где вы можете узнать, как инициализируется размер пакета. Фактический расчет размера выполняется в классе Installer. - person Anirudha Agashe; 23.09.2016
comment
@thepace Я не думаю, что статистика превышает Long. На современных устройствах недостаточно памяти для этого. - person M. Prokhorov; 28.12.2017