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中的一個模塊存在~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容