【问题标题】:Android PackageStats gives negative ValuesAndroid PackageStats 给出负值
【发布时间】:2016-12-29 21:45:24
【问题描述】:

我正在使用 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 之外,我没有执行任何计算,其中我将值除以 1024*1024 以获得以 MB 为单位的值。

标签: java android android-7.0-nougat


【解决方案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;

【讨论】:

  • 我同意你的看法。另一种方法是如果它超过 long 这是可能的。实例化是什么意思?
  • @thepace 与“只是实例化它”我的意思是 new 关键字 - 没有 invoke()onGetStatsCompleted()。负值基本上只有带符号整数才有可能,因此最大值可能不是 4294967295,而是 2147483647(而 -2147483647 可能只是表示错误或缺失值)......虽然用户运行代码确实很重要,因为有应用程序、用户私有和用户共享存储 - 用户私有区域的大小可能不同。
  • 您能否分享获取尺寸的确切命令(如您建议的 onGetStatsCompleted 不需要)
  • 每次都为零。我怀疑它是否有效,因为如果它那么简单,每个人都会使用它。 stackoverflow.com/questions/1806286/getting-installed-app-size
  • 只有实例化永远不会给你应用程序的大小。查看 PackageManagerService 类的第 16562 行,您可以在其中找到 Package 大小的初始化方式。大小的实际计算在 Installer 类中完成
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 2012-03-04
  • 2015-11-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
相关资源
最近更新 更多