Android利用反射机制获取系统中应用程序的应用、数据、缓存大小

最近开发一个系统管家类的项目,其中在坐垃圾清理的时候,首先需要获取垃圾文件的类型和大小等,其中,在应用程序这一部分,要求分类展示并清理应用程序的数据和缓存,所有首先需要得到系统中,所有的应用列表和数据及缓存大小。

---------------------------------start-----------------------------------

注意:我的源码环境是android4.4,“android.content.pm.PackageManager"中有一个"private"方法,

"getPackageSizeInfo",所以,用这个方法的时候,如果得不到,在检查权限没问题之后,检查一下你的API,看一下"PackageManager"中有没有这个方法!!!

首先:需要一个aidl文件,文件目录是固定的


aidl文件内容:

/*
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

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);
}

aidl文件创建完成了之后,确定已经被build后,就可以使用了

然后,别忘了AndroidManifest权限:

<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />

之后就可以执行获取方法了:

//获取程序的应用大小、数据大小、缓存大小
public void getApkSize(final Context context, String pkgName) throws NoSuchMethodException,
        InvocationTargetException, IllegalAccessException {
    // getPackageSizeInfoPackageManager中的一个private方法,所以需要通过反射的机制来调用
    Method method = PackageManager.class.getMethod("getPackageSizeInfo",
            String.class, IPackageStatsObserver.class);
    // 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调
    method.invoke(context.getPackageManager(), pkgName,
            new IPackageStatsObserver.Stub() {
                @Override
                public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
                    if (succeeded && pStats != null) {
                        long codeSize = pStats.codeSize;//应用大小
                                           long dataSize = pStats.dataSize;//数据大小
                                           long cacheSize = pStats.cacheSize;//缓存大小
                                    Log.e("David", "onGetStatsCompleted: long类型:\n 应用大小" + codeSize
                                + "\n数据大小" + dataSize
                                + "\n缓存大小" + cacheSize);
                        //可转成string类型的数据
                                           String codeStr = Formatter.formatFileSize(mContext, codeSize);
                    Log.e("David", "onGetStatsCompleted: String类型:\n 应用大小"
                                + Formatter.formatFileSize(mContext, codeSize)
                                + "\n数据大小" + Formatter.formatFileSize(mContext, dataSize)
                                + "\n缓存大小" + Formatter.formatFileSize(mContext, cacheSize));
                    }
                }
            });
}

日志:

 E/David: onGetStatsCompleted: long类型:
                                                                               应用大小123109376
                                                                              数据大小27439104
                                                                              缓存大小326078464
 E/David: onGetStatsCompleted: String类型:
                                                                               应用大小117 MB
                                                                              数据大小26.17 MB

                                                                              缓存大小311 MB


注意:在得到结果的位置,也就是本文方法中的log日志位置,不可直接返回结果,可以直接在此处理结果,或者通过Handler等回调结果

--------------------------------------end--------------------------------


@ Name : David
@ email :david.forever.god@gmail.com
Learn from yesterday, live for today, hope for tomorrow.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值