Android获取应用程序大小的方法

2019-12-10 20:13:39于丽
易采站长站为您分析Android获取应用程序大小的方法,有需要的朋友可以参考一下    

今天碰到个问题,想获取某个已安装的包的大小,没找到合适的方法。搜索了一下,发现PackageManager里面有个getPackageSizeInfo方法,可惜是hide的,而且它执行之后,会将结果回调给IPackageStatsObserver的onGetStatsCompleted方法。后来想直接计算/data/app和/system/app里面的apk大小,可是有时候会碰到权限问题,需要root才可以获取大小。        再后来,我想起系统的设置里面有一个应用程序管理,它里面列出了所有程序的占用空间大小、数据大小和缓存大小。恩,这个就是突破口。
以前写过一篇获取其他包的Context ,这个东西是真有用,这个结合反射,可以做很多神奇的事情,比如今天的这个。

上代码:

Java代码

复制代码
package chroya.demo;  

import java.lang.reflect.Constructor;  
import java.lang.reflect.Field;  
import java.lang.reflect.InvocationTargetException;  
import java.util.concurrent.CountDownLatch;  

import android.app.Activity;  
import android.content.Context;  
import android.content.pm.PackageStats;  
import android.content.pm.PackageManager.NameNotFoundException;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.Message;  
import android.util.Log;  

public class Main extends Activity {  
    private PackageStats ps;  

    public void getPackageStats(String packageName) {  
        try {  
            //获取setting包的的Context  
            Context mmsCtx = createPackageContext("com.android.settings",  
                    Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);  
            //使用setting的classloader加载com.android.settings.ManageApplications类  
            Class<?> maClass = Class.forName("com.android.settings.ManageApplications", true, mmsCtx.getClassLoader());  
            //创建它的一个对象