Android获取应用磁盘空间占用
Android下如何获取应用所占用的磁盘空间呢? 带着这个疑问我们先看一下应用详细信息里的各项数据都代表什么含义。
如图所示:
应用大小: 值得是apk解压后,所占用的磁盘空间
缓存:指的是:
/data/data/${packageName}/cache/ +/sdcard/Android/${packageName}/cache/
的占用大小用户数据:这个数据不同的手机表现不一样,上述截图是google pixel手机的显示, 此处的数据是计算是:
/data/data/${packageName}/ + /sdcard/Android/${packageName} - 缓存目录大小
用户数据部分,很多国产手机的计算方式也是不一样的,例如华为手机:数据部分是没有减去缓存目录大小的,只是单纯的
/data/data/${packageName}/ + /sdcard/Android/${packageName}
之和。总计: 总计部分,不同手机和厂商有会有一定的差异性,google原生系统显示的是:
应用大小+用户数据+缓存
;然而有些国产手机显示的是:应用大小+数据-缓存
比如华为手机,如下图:了解以上内容后, 我们如何在运行时获取应用占用磁盘大小呢?
8.0以下设备获取方式
1、查看Android中PackageManager源码,找到getPackageSizeInfo方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/**
* Retrieve the size information for a package.
* Since this may take a little while, the result will
* be posted back to the given observer. The calling context
* should have the {@link android.Manifest.permission#GET_PACKAGE_SIZE} permission.
*
* @param packageName The name of the package whose size information is to be retrieved
* @param observer An observer callback to get notified when the operation
* is complete.
* {@link android.content.pm.IPackageStatsObserver#onGetStatsCompleted(PackageStats, boolean)}
* The observer's callback is invoked with a PackageStats object(containing the
* code, data and cache sizes of the package) and a boolean value representing
* the status of the operation. observer may be null to indicate that
* no callback is desired.
*
* @hide
*/
public abstract void getPackageSizeInfo(String packageName,
IPackageStatsObserver observer);
2、getPackageSizeInfo方法有两个参数,第一个是需要计算的App包名,第二个是一个回调。不过IPackageStatesObserver这个class在API里貌似找不到,找了点儿资料,需要通过Android AIDL的方式来搞。方法:
1)、在src目录下新建android.content.pm包
2)、在该包下新建PackageStats.aidl文件,内容如下:
1 | package android.content.pm; |
3)、在该包下新建IPackageStatsObserver.aidl接口文件,内容如下:
1 | package android.content.pm; |
3、getPackageSizeInfo方法不能通过context.getPackageManager.getPackageSizeInfo的方式来调用,因为它其实是一个invoke受限的方法,所以必须通过反射实现:
1 | /** |
4、根据PackageManager中getPackageSizeInfo注释中的提示,还需要在AndroidManifest.xml中加入permission:
1 | <uses-permission android:name="android.permission.GET_PACKAGE_SIZE" /> |
8.0以上设备获取方式
8.0以上设备提供了,更加简单的API, 但是有一点是需要注意的,apk运行时获取当前自己进程的磁盘占用是不需要权限的,如果想要获取其他进程的占用是需要让用户进入到指定设置界面进行授权的。
1 | /** |