Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo varía el tamaño de la instalación de la aplicación en el teléfono?

Hice recientemente esta aplicación para los usuarios de la raíz que modifican su dispositivo con frecuencia.

Ahora noté un comportamiento bastante extraño con el tamaño de instalación de la aplicación.

Cuando utilicé una actividad regular con las vistas que eran inicializadas del archivo de XML, el tamaño era 715 kb .

  @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.main_layout); executeEvents = new ExecuteEvents(this); display = (TextView) findViewById(R.id.display); powermenu = (Button) findViewById(R.id.powermenu); turnoffscreen = (Button) findViewById(R.id.turnscreenoff); mapButton = (ImageButton) findViewById(R.id.mapButton); SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS); if(SP.contains(PBConstants.INPUT_DEVICE_TAG)) display.setText(getResources().getString(R.string.configured)); mapButton.setOnClickListener(this); powermenu.setOnClickListener(this); turnoffscreen.setOnClickListener(this); } 

Después de cambiar a un diálogo que se creó la configuración de una vista que contenía los widgets en el archivo XML. El tamaño de la aplicación era ahora de 200kb .

 @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); //setContentView(R.layout.main_layout); LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.main_layout, null); executeEvents = new ExecuteEvents(this); display = (TextView) view.findViewById(R.id.display); powermenu = (Button) view.findViewById(R.id.powermenu); turnoffscreen = (Button) view.findViewById(R.id.turnscreenoff); mapButton = (ImageButton) view.findViewById(R.id.mapButton); SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS); if(SP.contains(PBConstants.INPUT_DEVICE_TAG)) display.setText(getResources().getString(R.string.configured)); mapButton.setOnClickListener(this); powermenu.setOnClickListener(this); turnoffscreen.setOnClickListener(this); Dialog dialog = new Dialog(this); dialog.setContentView(view); dialog.setTitle(getResources().getString(R.string.app_name)); dialog.show(); } 

Se redujo a 80kb cuando utilicé esto:

 @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); dialog = new Dialog(this); dialog.setContentView(R.layout.main_layout); executeEvents = new ExecuteEvents(this); display = (TextView) dialog.findViewById(R.id.display); powermenu = (Button) dialog.findViewById(R.id.powermenu); turnoffscreen = (Button) dialog.findViewById(R.id.turnscreenoff); mapButton = (ImageButton) dialog.findViewById(R.id.mapButton); SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS); if(SP.contains(PBConstants.INPUT_DEVICE_TAG)) display.setText(getString(R.string.configured)); mapButton.setOnClickListener(this); powermenu.setOnClickListener(this); turnoffscreen.setOnClickListener(this); dialog.setTitle(getString(R.string.app_name)); dialog.show(); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInterface) { dialog.dismiss(); MainActivity.this.finish(); } }); } 

También noté otro cambio extraño en el tamaño de la aplicación cuando intenté agregar una animación con el último estilo de código (el 80kb ). El tamaño de la aplicación se convirtió en un fuerte 1 MB . Así es como inicialicé la animación y traté de llamarla cuando se hizo clic en el botón:

 private static final ScaleAnimation animation = new ScaleAnimation(1, .95f, 1, .95f, Animation.RELATIVE_TO_SELF, (float)0.5, Animation.RELATIVE_TO_SELF, (float)0.5);//declared as global variable 

Dentro del método onCreate:

 animation.setDuration(1000); animation.setFillAfter(false); 

Después de lo cual lo llamé en el onClickListener :

 mapButton.startAnimation(animation); 

¿Por qué hay un cambio tan drástico en el tamaño de la aplicación cuando no he añadido ningún nuevo recurso, sino que solo cambió el estilo del código? ¿Dónde hay tal gran diferencia en la forma en que inicializar widgets presentes en los diálogos? ¿Por qué hay una diferencia enorme cuando agrego una animación de la manera que lo he añadido?

Siguiente pregunta:

  @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.main_layout); executeEvents = new ExecuteEvents(this); display = (TextView) this.findViewById(R.id.display); powermenu = (Button) this.findViewById(R.id.powermenu); turnoffscreen = (Button) this.findViewById(R.id.turnscreenoff); mapButton = (ImageButton) this.findViewById(R.id.mapButton); SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS); if(SP.contains(PBConstants.INPUT_DEVICE_TAG)) display.setText(getResources().getString(R.string.configured)); mapButton.setOnClickListener(this); powermenu.setOnClickListener(this); turnoffscreen.setOnClickListener(this); } 

ESPECULACIÓN

¿Podría esto ser debido a los paquetes o clases que se importan? Tiene sentido para el bit de animation de la pregunta al menos.

¿Agregar el contexto al que se inicializan las vistas reduce el uso de memoria?

  • ¿Por qué se crea un FrameLayout extra para fragmentos?
  • Presentar contenido html como "páginas dinámicas"
  • Android: uso de la vista personalizada en el widget
  • Android View con View.GONE sigue recibiendo onTouch y onClick
  • ¿Cómo captura el clic de botón de búsqueda de SearchView?
  • Página Curl Animation en android?
  • Cómo escuchar el botón de búsqueda del teclado en searchView
  • Cambiar vista en el flujo de portada - Android
  • One Solution collect form web for “¿Cómo varía el tamaño de la instalación de la aplicación en el teléfono?”

    Yup, sus especulaciones están cerca de estar en lo cierto, por lo que puede saber todo su código Java primero se compila a Java bytecode por decir javac , a continuación, dx convierte en bytecode Dalvik, su dalvik bytecode archivo (aka dex ) se empaqueta dentro de su apk (El tamaño de apk de btw no varía mucho como ayuda de la compresión del cierre relámpago) generalmente como classes.dex que más adelante cuando usted instala el apk en usted dispositivo, Android pudo optimizarlo para ese dispositivo particular (aka odex ).

    Por lo tanto, para comprobar que su final en caché dex realmente cambia y es el responsable de este cambio de tamaño, por decir simplemente añadir animaciones, se puede encontrar descomprimiendo su apk o dentro de su dispositivo, siempre encuentro la segunda opción más emocionante:

    Así que aquí está su dex sin animación (su 80kb ):

    Http://i.imgur.com/2JkpWS3.png

    Y tu información de la aplicación:

    Http://i.imgur.com/HseGJih.png

    Así que aquí está su dex con la animación (su 1 MB ):

    Http://i.imgur.com/pyrthYd.png

    Y tu información de la aplicación:

    Http://i.imgur.com/FSVPWAC.png

    Una mirada más cercana usted puede encontrar que son verdaderamente diferentes apenas mirando derecho en su piscina constante de los bytecode del dalvik:

    Http://i.imgur.com/02mqaif.png

    Por alguna razón no conseguí tal diferencia radical del tamaño pero es noticiable, construí tu app usando gradle + Android Studio así que pienso que ayudan y optimizan cosas un pedacito.

    Por último, podría utilizar ProGuard pero ¡eh! Algunos k no son que mucho en estos días, no me preocuparía por añadir algo de "grasa" a su aplicación, siempre y cuando lo hace mejor, por supuesto, siempre hay espacio para la mejora, pero recuerde que no está en un java4k o cosas como eso 🙂

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.