Cómo calcular programaticamente todo el tamaño de caché de la aplicación instalada?

sólo quiero mostrar la lista de todos los nombres de aplicaciones instaladas con el tamaño de la caché. El tamaño del caché debe ser el mismo que el de la aplicación de configuración nativa en el dispositivo android.

puedo enumerar todo el nombre instalado del pkg de la aplicación pero no puedo calcular el mismo tamaño del escondrijo que la aplicación nativa del ajuste demuestra (estoy hablando de ese lugar donde la opción clara del escondrijo en la configuración).

pkNames = getPackageManager().getInstalledPackages(0); ArrayAdapter<PackageInfo> adapter = new ArrayAdapter<PackageInfo>(this, android.R.layout.simple_list_item_1, pkNames); final PackageManager pm = getPackageManager(); for(int i =0;i<pkNames.size();i++) { ApplicationInfo applicationInfo = pm.getApplicationInfo(pkNames.get(i).packageName.toString(), 0); File file = new File(applicationInfo.publicSourceDir); long size = file.length(); System.out.println("application name == "+pkNames.get(i).packageName.toString()+" ,and size of cache is == "+size(this, size)); } 

Yo uso este código, pero me dará el tamaño .apk de esa aplicación. 🙁 Por favor ayuda gracias de antemano.

Para obtener el tamaño de caché de la aplicación instalada directamente u no puede obtener. Como el uso de PackageManger no podemos obtener directamente los detalles sobre el tamaño del paquete instalado como método abstracto getPackageSizeInfo directamente no es accesible por lo que utilizando Java Reflection puede invocar it.It puede no funcionar si en el futuro el cambio de nombre del método o cualquier cosa cambiada.

Necesita crear AIDL IPackageStatsObserver .aidl & PackageStats.aidl que debería estar en el paquete android.content.pm ya que no puede acceder directamente a ellos.

IPackageStatsObserver.aidl

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

PackageStats.aidl

 package android.content.pm; parcelable PackageStats; 

IPackageStatsObserver.aidl y PackageStats.aidl lo mantienen en el paquete android.content.pm . IDataStatus

 public interface IDataStatus { public void onStatusListner(String msg); } 

Actividad

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

Detalles de la aplicación

 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 = ""; } } 

xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btn_get_cacheSize" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Get Cache Size" /> <TextView android:id="@+id/lbl_cache_size" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Cache Size : " /> </LinearLayout> 

Busque la carpeta caché de la aplicación en la memoria en la siguiente ruta

"/data/data/com.your.package.appname/cache"

Calcular el tamaño de caché de la aplicación en el disco.

  • Reciclaje de bitmaps
  • Cómo evitar la pérdida de memoria en context.getSystemService (Context.CAMERA_SERVICE)?
  • Android - view.Surface OutOfResourcesException
  • Filtro de mercado para clase de memoria
  • Límite de tamaño de Android montón, todavía tenemos necesidad de diseñar aplicaciones con un límite de 16 MB en mente?
  • Android - Cómo obtener el uso de memoria de mi dispositivo Android
  • Cargar un archivo de 16KB en Android tarda 35 segundos?
  • Fuga de memoria durante el uso de anuncios intersticiales de Admob
  • Análisis de memoria en Android: dominator_tree no muestra todas las instancias de algunos objetos
  • Android Simulator: Fácil manera de simular un proceso de reinicio debido a la baja memoria?
  • El modo estricto de Android detecta una violación múltiple de instancia de actividad, pero no tengo idea de por qué
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.