如何获取应用程序的大小+应用程序数据的大小
How to get size of an App + size of Data of the App
如何获取应用程序的大小,包括 AppData 的大小?
目前我使用这段代码,但它只能获取 APK 大小。有什么方法可以获取 AppData 的大小,就像 Google Setting App 那样吗?
public String getApkSize(Context context, String packageName) {
try {
float value = new File(context.getPackageManager().getApplicationInfo(packageName, 0).publicSourceDir).length() / 1048576F;
if (value <= 0) {
value = 1;
}
return String.format("%.2f", value) + "MB";
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
“设置”应用使用方法 getPackageSizeInfo
。不幸的是,这个方法是隐藏的,因为它被注释为@hide
,因此你不能直接使用该方法,但你需要使用反射来调用它。
将此权限添加到 AndroidManifest.xml
:
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
创建AIDL接口IPackageStatsObserver
:
package android.content.pm;
import android.content.pm.PackageStats;
/**
* API for package data change related callbacks from the Package Manager.
* Some usage scenarios include deletion of cache directory, generate
* statistics related to code, data, cache usage(TODO)
* {@hide}
*/
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
那么你可以这样使用它:
private void getPackageSizeInfo(Context context, String packageName) {
try {
PackageManager packageManager = context.getPackageManager();
Method getPackageSizeInfo = packageManager.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(packageManager, packageName, new IPackageStatsObserver.Stub() {
public void onGetStatsCompleted(PackageStats packageStats, boolean succeeded) throws RemoteException {
long totalCacheSize = packageStats.cacheSize + packageStats.externalCacheSize;
long totalDataSize = packageStats.dataSize + packageStats.externalDataSize;
long totalCodeSize = packageStats.codeSize + packageStats.externalCodeSize;
long totalSize = totalDataSize + totalCodeSize;
Log.d(TAG, "Total Size:" + totalSize);
Log.d(TAG, "App Size:" + totalCodeSize);
Log.d(TAG, "Data Size:" + totalDataSize);
Log.d(TAG, "Cache Size:" + totalCacheSize);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
不幸的是,没有正式的方法可以这样做。以下依赖于反射,因此运行时错误可能指日可待。
PackageManager pm = getPackageManager();
Method getPackageSizeInfo = pm.getClass().getMethod(
"getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, "com.android.mms",
new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
Log.i(TAG, "codeSize: " + pStats.codeSize);
}
});
小心,因为这是一个试图弥补 Android SDK 缺失部分的黑客攻击。
如何获取应用程序的大小,包括 AppData 的大小?
目前我使用这段代码,但它只能获取 APK 大小。有什么方法可以获取 AppData 的大小,就像 Google Setting App 那样吗?
public String getApkSize(Context context, String packageName) {
try {
float value = new File(context.getPackageManager().getApplicationInfo(packageName, 0).publicSourceDir).length() / 1048576F;
if (value <= 0) {
value = 1;
}
return String.format("%.2f", value) + "MB";
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
“设置”应用使用方法 getPackageSizeInfo
。不幸的是,这个方法是隐藏的,因为它被注释为@hide
,因此你不能直接使用该方法,但你需要使用反射来调用它。
将此权限添加到 AndroidManifest.xml
:
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
创建AIDL接口IPackageStatsObserver
:
package android.content.pm;
import android.content.pm.PackageStats;
/**
* API for package data change related callbacks from the Package Manager.
* Some usage scenarios include deletion of cache directory, generate
* statistics related to code, data, cache usage(TODO)
* {@hide}
*/
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
那么你可以这样使用它:
private void getPackageSizeInfo(Context context, String packageName) {
try {
PackageManager packageManager = context.getPackageManager();
Method getPackageSizeInfo = packageManager.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(packageManager, packageName, new IPackageStatsObserver.Stub() {
public void onGetStatsCompleted(PackageStats packageStats, boolean succeeded) throws RemoteException {
long totalCacheSize = packageStats.cacheSize + packageStats.externalCacheSize;
long totalDataSize = packageStats.dataSize + packageStats.externalDataSize;
long totalCodeSize = packageStats.codeSize + packageStats.externalCodeSize;
long totalSize = totalDataSize + totalCodeSize;
Log.d(TAG, "Total Size:" + totalSize);
Log.d(TAG, "App Size:" + totalCodeSize);
Log.d(TAG, "Data Size:" + totalDataSize);
Log.d(TAG, "Cache Size:" + totalCacheSize);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
不幸的是,没有正式的方法可以这样做。以下依赖于反射,因此运行时错误可能指日可待。
PackageManager pm = getPackageManager();
Method getPackageSizeInfo = pm.getClass().getMethod(
"getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, "com.android.mms",
new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
Log.i(TAG, "codeSize: " + pStats.codeSize);
}
});
小心,因为这是一个试图弥补 Android SDK 缺失部分的黑客攻击。