最近在搭建兼容性性能平臺,目前架構圖還是內部才能夠看到,具體之后做完我會開放出來。
其中一個就是需要去獲取Android應用的大小,我們現在自身的apk還是會做的盡量小,但是用了一段時間之后apk的占用量就會越來越大,自然這個也是性能測試需要監控的數據之一。
在這里我們用到了如下的:

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
這個會作為我監聽apk中的一個模塊存在~~~