Android 如何以编程方式计算已安装应用程序的所有缓存大小?

Android 如何以编程方式计算已安装应用程序的所有缓存大小?,android,caching,memory-management,Android,Caching,Memory Management,我只想用缓存大小显示所有已安装应用程序名称的列表。缓存大小必须与android设备中显示的本机设置应用程序相同 我可以列出所有已安装的应用程序pkg名称,但无法计算本机设置应用程序显示的相同缓存大小(我指的是在设置中清除缓存选项的位置) pkNames=getPackageManager().getInstalledPackages(0); ArrayAdapter=新的ArrayAdapter(此, android.R.layout.simple_list_item_1,pkNames); 最

我只想用缓存大小显示所有已安装应用程序名称的列表。缓存大小必须与android设备中显示的本机设置应用程序相同

我可以列出所有已安装的应用程序pkg名称,但无法计算本机设置应用程序显示的相同缓存大小(我指的是在设置中清除缓存选项的位置)

pkNames=getPackageManager().getInstalledPackages(0);
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,pkNames);
最终PackageManager pm=getPackageManager();

对于(int i=0;i将应用程序缓存文件夹定位到以下路径中的内存中

“/data/data/com.your.package.appname/cache”


计算磁盘上的应用程序缓存大小。

要直接获取已安装应用程序的缓存大小,您无法获取。 使用时,我们无法直接获得有关已安装包大小的详细信息,因为抽象方法无法直接访问,因此使用时您可以调用它。如果将来方法名称更改或任何内容更改,则可能无法使用

您需要创建AIDL.AIDL&它应该在
android.content.pm
包中,因为您不能直接访问它们

IPackageStatsObserver.aidl

package android.content.pm;
import android.content.pm.PackageStats;
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in android.content.pm.PackageStats pStats, boolean succeeded);
}
package android.content.pm;
parcelable PackageStats;
PackageStats.aidl

package android.content.pm;
import android.content.pm.PackageStats;
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in android.content.pm.PackageStats pStats, boolean succeeded);
}
package android.content.pm;
parcelable PackageStats;
IPackageStatsObserver.aidl和PackageStats.aidl都将其保存在
android.content.pm
package中。 IDataStatus

public interface IDataStatus {
    public void onStatusListner(String msg);
}
public class AppDetails {
    Activity mActivity;
    public ArrayList<PackageInfoStruct> res = new ArrayList<PackageInfoStruct>();
    public ListView list;
    public String app_labels[];

    public AppDetails(Activity mActivity) {
        this.mActivity = mActivity;

    }

    public ArrayList<PackageInfoStruct> getPackages() {
        ArrayList<PackageInfoStruct> apps = getInstalledApps(false); /*
                                                                     * false =
                                                                     * no system
                                                                     * packages
                                                                     */
        final int max = apps.size();
        for (int i = 0; i < max; i++) {
            apps.get(i);
        }
        return apps;
    }

    private ArrayList<PackageInfoStruct> getInstalledApps(boolean getSysPackages) {

        List<PackageInfo> packs = mActivity.getPackageManager()
                .getInstalledPackages(0);
        try {
            app_labels = new String[packs.size()];
        } catch (Exception e) {
            Toast.makeText(mActivity.getApplicationContext(), e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        }
        for (int i = 0; i < packs.size(); i++) {
            PackageInfo p = packs.get(i);
            if ((!getSysPackages) && (p.versionName == null)) {
                continue;
            }
            PackageInfoStruct newInfo = new PackageInfoStruct();
            newInfo.appname = p.applicationInfo.loadLabel(
                    mActivity.getPackageManager()).toString();
            newInfo.pname = p.packageName;
            newInfo.datadir = p.applicationInfo.dataDir;
            newInfo.versionName = p.versionName;
            newInfo.versionCode = p.versionCode;
            newInfo.icon = p.applicationInfo.loadIcon(mActivity
                    .getPackageManager());
            res.add(newInfo);

            app_labels[i] = newInfo.appname;
        }
        return res;
    }

    class PackageInfoStruct {
        String appname = "";
        String pname = "";
        String versionName = "";
        int versionCode = 0;
        Drawable icon;
        String datadir = "";
    }
}
活动

    public class MyScreen extends Activity implements OnClickListener {
    public static final int FETCH_PACKAGE_SIZE_COMPLETED = 100;
    public static final int ALL_PACAGE_SIZE_COMPLETED = 200;
    IDataStatus onIDataStatus;
    TextView lbl_cache_size;
    ProgressDialog pd;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.btn_get_cacheSize).setOnClickListener(this);
        lbl_cache_size = (TextView) findViewById(R.id.lbl_cache_size);
        // clearCache();
    }

    private void showProgress(String message) {
        pd = new ProgressDialog(this);
        pd.setIcon(R.drawable.ic_launcher);
        pd.setTitle("Please Wait...");
        pd.setMessage(message);
        pd.setCancelable(false);
        pd.show();

    }

    long packageSize = 0, size = 0;
    AppDetails cAppDetails;
    public ArrayList<PackageInfoStruct> res;

    private void getpackageSize() {
        cAppDetails = new AppDetails(this);
        res = cAppDetails.getPackages();
        if (res == null)
            return;
        for (int m = 0; m < res.size(); m++) {
            PackageManager pm = getPackageManager();
            Method getPackageSizeInfo;
            try {
                getPackageSizeInfo = pm.getClass().getMethod(
                        "getPackageSizeInfo", String.class,
                        IPackageStatsObserver.class);
                getPackageSizeInfo.invoke(pm, res.get(m).pname,
                        new cachePackState());
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

        }
        handle.sendEmptyMessage(ALL_PACAGE_SIZE_COMPLETED);
        Log.v("Total Cache Size", " " + packageSize);

    }

    private Handler handle = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case FETCH_PACKAGE_SIZE_COMPLETED:
                if (packageSize > 0)
                    size = (packageSize / 1024000);
                lbl_cache_size.setText("Cache Size : " + size + " MB");
                break;
            case ALL_PACAGE_SIZE_COMPLETED:
                if (null != pd)
                    if (pd.isShowing())
                        pd.dismiss();

                break;
            default:
                break;
            }

        }

    };

    private class cachePackState extends IPackageStatsObserver.Stub {

        @Override
        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
                throws RemoteException {
            Log.d("Package Size", pStats.packageName + "");
            Log.i("Cache Size", pStats.cacheSize + "");
            Log.w("Data Size", pStats.dataSize + "");
            packageSize = packageSize + pStats.cacheSize;
            Log.v("Total Cache Size", " " + packageSize);
            handle.sendEmptyMessage(FETCH_PACKAGE_SIZE_COMPLETED);
        }

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_get_cacheSize:
            size = 0;
            packageSize = 0;
            showProgress("Calculating Cache Size..!!!");
            /**
             * You can also use async task
             * */
            new Thread(new Runnable() {

                @Override
                public void run() {
                    getpackageSize();
                }
            }).start();

            break;
        }
    }

}
public类MyScreen扩展活动实现OnClickListener{
公共静态最终整数取数\包大小\完成=100;
公共静态最终整数所有包装尺寸完成=200;
伊达斯塔斯;
TextView lbl_缓存_大小;
进展性帕金森病;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findviewbyd(R.id.btn\u get\u cacheSize).setOnClickListener(this);
lbl\u cache\u size=(TextView)findViewById(R.id.lbl\u cache\u size);
//clearCache();
}
私有void showProgress(字符串消息){
pd=新进度对话框(本);
pd.setIcon(R.drawable.ic_发射器);
pd.setTitle(“请稍候…”);
设置消息(消息);
pd.可设置可取消(假);
pd.show();
}
长包装尺寸=0,尺寸=0;
AppDetails和AppDetails;
公共阵列列表;
私有void getpackageSize(){
cAppDetails=新的AppDetails(本);
res=cAppDetails.getPackages();
如果(res==null)
返回;
对于(int m=0;m0)
尺寸=(包装尺寸/1024000);
lbl_cache_size.setText(“缓存大小:+size+“MB”);
打破
案例所有包装尺寸完成:
if(null!=pd)
if(pd.isShowing())
pd.解散();
打破
违约:
打破
}
}
};
私有类cachePackState扩展了IPackageStatsObserver.Stub{
@凌驾
公共无效onGetStatsCompleted(PackageStats pStats,布尔成功)
抛出远程异常{
Log.d(“包大小”,pStats.packageName+”);
Log.i(“缓存大小”,pStats.cacheSize+);
Log.w(“数据大小”,pStats.dataSize+);
packageSize=packageSize+pStats.cacheSize;
Log.v(“总缓存大小”,“打包大小”);
handle.sendEmptyMessage(获取包大小完成);
}
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.btn\u获取\u缓存大小:
尺寸=0;
packageSize=0;
showProgress(“计算缓存大小..!!!”;
/**
*您还可以使用异步任务
* */
新线程(newrunnable()){
@凌驾
公开募捐{
getpackageSize();
}
}).start();
打破
}
}
}
AppDetails

public interface IDataStatus {
    public void onStatusListner(String msg);
}
public class AppDetails {
    Activity mActivity;
    public ArrayList<PackageInfoStruct> res = new ArrayList<PackageInfoStruct>();
    public ListView list;
    public String app_labels[];

    public AppDetails(Activity mActivity) {
        this.mActivity = mActivity;

    }

    public ArrayList<PackageInfoStruct> getPackages() {
        ArrayList<PackageInfoStruct> apps = getInstalledApps(false); /*
                                                                     * false =
                                                                     * no system
                                                                     * packages
                                                                     */
        final int max = apps.size();
        for (int i = 0; i < max; i++) {
            apps.get(i);
        }
        return apps;
    }

    private ArrayList<PackageInfoStruct> getInstalledApps(boolean getSysPackages) {

        List<PackageInfo> packs = mActivity.getPackageManager()
                .getInstalledPackages(0);
        try {
            app_labels = new String[packs.size()];
        } catch (Exception e) {
            Toast.makeText(mActivity.getApplicationContext(), e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        }
        for (int i = 0; i < packs.size(); i++) {
            PackageInfo p = packs.get(i);
            if ((!getSysPackages) && (p.versionName == null)) {
                continue;
            }
            PackageInfoStruct newInfo = new PackageInfoStruct();
            newInfo.appname = p.applicationInfo.loadLabel(
                    mActivity.getPackageManager()).toString();
            newInfo.pname = p.packageName;
            newInfo.datadir = p.applicationInfo.dataDir;
            newInfo.versionName = p.versionName;
            newInfo.versionCode = p.versionCode;
            newInfo.icon = p.applicationInfo.loadIcon(mActivity
                    .getPackageManager());
            res.add(newInfo);

            app_labels[i] = newInfo.appname;
        }
        return res;
    }

    class PackageInfoStruct {
        String appname = "";
        String pname = "";
        String versionName = "";
        int versionCode = 0;
        Drawable icon;
        String datadir = "";
    }
}
公共类AppDetails{
活动能力;
public ArrayList res=new ArrayList();
公共列表视图列表;
公共字符串应用程序标签[];
公共应用程序详细信息(活动权限){
this.mActivity=mActivity;
}
公共ArrayList getPackages(){
ArrayList apps=getInstalledApps(false)/*
*假的=