Android 获取应用的大小

作者: 赏味不足 | 来源:发表于2016-11-09 14:26 被阅读519次

最近在搭建兼容性性能平台,目前架构图还是内部才能够看到,具体之后做完我会开放出来。
其中一个就是需要去获取Android应用的大小,我们现在自身的apk还是会做的尽量小,但是用了一段时间之后apk的占用量就会越来越大,自然这个也是性能测试需要监控的数据之一。

在这里我们用到了如下的:


android1android1

核心代码:

    public class PkgSizeObserver extends IPackageStatsObserver.Stub {

        @Override
        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
                throws RemoteException {
            // TODO Auto-generated method stub
            cachesize = pStats.cacheSize;
            datasize = pStats.dataSize;
            codesize = pStats.codeSize;
            totalsize = cachesize + datasize + codesize;
            Log.i(TAG, "cachesize--->" + cachesize + " datasize---->"
                    + datasize + " codeSize---->" + codesize);
        }
    }

以及

    public void queryPacakgeSize(String pkgName) throws Exception {
        if (pkgName != null) {
            PackageManager pm = getPackageManager();
            try {
                Method getPackageSizeInfo = pm.getClass().getDeclaredMethod(
                        "getPackageSizeInfo", String.class, 
                        IPackageStatsObserver.class);

                getPackageSizeInfo.invoke(pm, pkgName,
                        , new PkgSizeObserver());
            } catch (Exception ex) {
                Log.e(TAG, "NoSuchMethodException");
                ex.printStackTrace();
                throw ex;
            }
        }
    }

接着就发现一个问题,2.3的版本的确可以用。但是4.2以及以上版本就报错了。经过调查发现 PackageManager.getPackageSizeInfo(String packageName, IPackageStatsObserver observer)不可用,改为PackageManager.getPackageSizeInfo(String packageName, int userHandle, IPackageStatsObserver observer)。
所以我们代码需要做如下的修改:

    public void queryPacakgeSize(String pkgName) throws Exception {
        if (pkgName != null) {
            PackageManager pm = getPackageManager();
            try {
                Method getPackageSizeInfo = pm.getClass().getDeclaredMethod(
-                       "getPackageSizeInfo", String.class, 
+                       "getPackageSizeInfo", String.class, int.class,
                        IPackageStatsObserver.class);

                getPackageSizeInfo.invoke(pm, pkgName,
-                       , new PkgSizeObserver());
+                       Process.myUid() / 100000, new PkgSizeObserver());

            } catch (Exception ex) {
                Log.e(TAG, "NoSuchMethodException");
                ex.printStackTrace();
                throw ex;
            }
        }
    }

然后我install到了Nexus5 Android5.0上面,点击一个应用之后看到如下Log,说明成功了~~~


android2android2

这个会作为我监听apk中的一个模块存在~~~

相关文章

网友评论

    本文标题:Android 获取应用的大小

    本文链接:https://www.haomeiwen.com/subject/bpzzuttx.html