Niedawno zrobiłem to application dla użytkowników root, którzy często modyfikują swoje urządzenie.Jak rozmiar instalacji aplikacji zależy od telefonu?
Teraz zauważyłem dość dziwne zachowanie z rozmiarem instalacji aplikacji.
Kiedy użyłem zwykłej aktywności z widokami inicjowanymi z pliku XML, rozmiar był 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);
}
Po tym, jak przełączyłem się do okna dialogowego, które zostało utworzone, ustawiając widok, który zawierał widżety w pliku XML. Rozmiar aplikacji był teraz: 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();
}
ona zredukowana do 80kb
gdy użyłem tego:
@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();
}
});
}
Zauważyłem również inną dziwną zmianę w wielkości aplikacji, gdy próbowałem dodać animację z ostatniego stylu Kodeksu (80kb
jeden) . Rozmiar aplikacji stał się spory. To jak ja zainicjowany animację i próbował nazywając ją, gdy przycisk został kliknięty:
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
Wewnątrz onCreate metody:
animation.setDuration(1000);
animation.setFillAfter(false);
Po czym zadzwoniłem go w onClickListener
:
mapButton.startAnimation(animation);
Dlaczego istnieje tak drastyczna zmiana w rozmiarze aplikacji, gdy nie dodałem żadnych nowych zasobów, ale zmieniłem tylko styl kodu? Gdzie jest taka OGROMNA różnica w sposobie inicjalizacji widżetów obecnych w oknach dialogowych? Dlaczego istnieje ogromna różnica po dodaniu animacji w taki sposób, w jaki ją dodałem?
Kontynuacja pytanie:
@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);
}
spekulacji
Może to być spowodowane pakietów lub klas, które są importowane? Ma to sens przynajmniej dla pewnej części pytania.
Dodanie kontekstu, w którym inicjalizowane są widoki, zmniejsza zużycie pamięci?
Możesz rozpakować plik APK i przeanalizować jego składniki. Możesz także przeanalizować plik dex (http://code.google.com/p/smali), aby zobaczyć jego strukturę. –
Rozmiar pliku APK jest taki sam. Rozmiar instalacji jest inny. –
Wow, to interesujące. Na urządzeniu zrootowanym można analizować poszczególne pliki związane z zainstalowaną aplikacją. Na przykład 'ls -l/data/app/{pakiet}', 'ls -l/data/data/{pakiet}'. –