博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android Pro] PackageManager#getPackageSizeInfo (hide)
阅读量:6125 次
发布时间:2019-06-21

本文共 3646 字,大约阅读时间需要 12 分钟。

 referce to :

计算Android App所占用d的手机内存(RAM)大小、App所产生的数据(Data)大小、App本身所占用的磁盘空间(ROM)大小。当然,这个就必须用到PackageManager了。

1、查看Android中PackageManager源码,找到getPackageSizeInfo方法:

 

/** * 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文件,内容如下:

package android.content.pm;   parcelable PackageStats;

      3)、在该包下新建IPackageStatsObserver.aidl接口文件,内容如下:

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

 3、getPackageSizeInfo方法不能通过context.getPackageManager.getPackageSizeInfo的方式来调用,因为它其实是一个invoke受限的方法,所以必须通过反射实现:

/** * 获取Android Native App的缓存大小、数据大小、应用程序大小 * * @param context *            Context对象 * @param pkgName *            需要检测的Native App包名 * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalAccessException */public static void getPkgSize(final Context context, String pkgName) throws NoSuchMethodException,        InvocationTargetException,        IllegalAccessException {    // getPackageSizeInfo是PackageManager中的一个private方法,所以需要通过反射的机制来调用    Method method = PackageManager.class.getMethod("getPackageSizeInfo",            new Class[] { String.class, IPackageStatsObserver.class });    // 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调    method.invoke(context.getPackageManager(), new Object[] {            pkgName,            new IPackageStatsObserver.Stub() {                @Override                public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {                    // 子线程中默认无法处理消息循环,自然也就不能显示Toast,所以需要手动Looper一下                    Looper.prepare();                    // 从pStats中提取各个所需数据                    Toast.makeText(context,                            "缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize) +                            "\n数据大小=" + Formatter.formatFileSize(context, pStats.dataSize) +                            "\n程序大小=" + Formatter.formatFileSize(context, pStats.codeSize),                            Toast.LENGTH_LONG).show();                    // 遍历一次消息队列,弹出Toast                    Looper.loop();                }            }    });}

我是直接在Observer回调中通过Toast的方式直接显示出来的,不过这个回调是在子线 程中异步完成的,子线程中默认不处理消息循环,所以Toast.show无法被正确执行,需要手动将Toast显示部分的内容,加到Looper中,分别 调用Looper.prepare和Looper.loop方法即可!

4、当然,根据PackageManager中getPackageSizeInfo注释中的提示,还需要在AndroidManifest.xml中加入permission:

 

 

转载地址:http://ykbua.baihongyu.com/

你可能感兴趣的文章
技术是OA软件的生命力 关注技术正确选型
查看>>
智慧城市重点项目显著推进 市民参与程度尚待提高
查看>>
软件工程之软件测试
查看>>
思科宣布计划收购CliQr
查看>>
微软狠挖甲骨文墙脚:从Oracle迁移到SQL Server免费!
查看>>
欧洲最大光伏企业宣布破产 中国市场暂时安全
查看>>
研究表明Web充斥着存在漏洞的过期JavaScript库
查看>>
云计算不能修复应用程序性能差的问题
查看>>
Chrome测试新加密技术 量子计算机也没办法
查看>>
做“准确”的性能测试
查看>>
访问windows 共享提示"找不到网络路径" 排查过程
查看>>
云效持续集成持续交付专场直播回顾,4场视频免费看
查看>>
这个夏天、大数据告诉你去哪玩!
查看>>
《当90后遇上创业》一一1.7 致联合创始人
查看>>
《Adobe Acrobat XI经典教程》—第2课扫描纸质文档并将其转换为Adobe PDF
查看>>
《AutoCAD 2016中文版室内装潢设计从入门到精通》—— 导读
查看>>
美国女性吐槽 IT 男:有钱自大无聊 约会竟爱谈工作
查看>>
《开放复杂智能系统——基础、概念、分析、设计与实施》—第1章1.4节构建开放复杂智能系统...
查看>>
《SolidCAM+SolidWorks 2014中文版数控加工从入门到精通》——第1章 SolidCAM基础 1.1 CAD/CAM基础...
查看>>
linux如何修改IP 默认网关 DNS
查看>>