Android 获取应用的大小

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

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


android1
android1

核心代码:

    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,说明成功了~~~


android2
android2

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容