最近在搭建兼容性性能平台,目前架构图还是内部才能够看到,具体之后做完我会开放出来。
其中一个就是需要去获取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中的一个模块存在~~~
网友评论