Android PackageStats给出负值

2022-09-01 03:59:49

我正在使用 PackageStats,并在打印 PackageStats 的 codeSize、cacheSize、dataSize 时,有些数据是负数。

几个问题:

  • 这怎么可能?
  • 考虑到apk大小约为50MB,codeSize可能是负的场景是什么?
  • 还有其他方法可以可靠地用于提取上述信息吗?

此外,对于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;
    };
}

答案 1

刚刚在API 23/ 24上尝试过,可以只实例化它。

这些属性可能是指 SD 卡。external*

    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;

答案 2

推荐