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