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).
- Fuga de memoria de WebView en la aplicación de Android
- Android: AlertDialog provoca una pérdida de memoria
- Android NDK: Dalvik Heap y Native Heap - Cómo separar entre los dos
- Los archivos masivos de hprof que se crean de alguna manera, me impide empujar
- SQLite Android asignación de la ventana de cursor de 2048 kb falló
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.
- Tipos de memoria de Android (RAM v Memoria interna)
- Problema de seguimiento de heap nativo - la pestaña "Native Heap" está vacía
- ¿Cuál es la cantidad máxima de RAM que una aplicación puede usar?
- Problemas de memoria - fragmentos
- Android: Memory Analyzer eclipse plugin (1.1) no se inicia automáticamente al presionar ddms "hprof dump"
- Android - MediaController pierde la actividad
- Proceso de fondo de caché de Android está aumentando continuamente
- Android Universal Image Loader - ¿Cómo configuro las especificaciones correctamente?
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.
- Introducción a ZXing en Android
- Droid: ¿Cómo reordenar un contenido linearlayouts programáticamente?