我正在使用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;
        };
    }
    

    最佳答案

    刚刚在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;
    

    07-24 09:47
    查看更多