Kurangi ukuran APK (dalam batas wajar)

Sudah ada artikel serupa di Habr.com yang membuktikan bahwa Anda dapat menyusutkan file APK dari 1,5 MB menjadi 1757 byte atau kurang. Tujuan artikel ini adalah untuk mengurangi ukuran aplikasi ke batas yang wajar, mempertahankan fungsinya dan menyoroti beberapa seluk-beluk dan momen implisit.

Mulai


Buat proyek di Android Studio, pilih Aktivitas Kosong. Lalu, di file styles.xml, ganti Activity dengan ActionBar

Theme.AppCompat.Light.DarkActionBar 

tentang Aktivitas tanpa ActionBar

 Theme.AppCompat.Light.NoActionBar 

Hasilnya:

gambar

Di penganalisa APK kita melihat yang berikut:



Jadi, APK memiliki berat 1,5 MB, meskipun faktanya itu hanya menampilkan kata-kata "Hello World!".

Tahap Satu (minifikasi)


Dalam file build.gradle kita menulis:

 android { buildTypes { debug { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' } } } 

Kami akan menyinkronkan Android Studio agar perubahan diterapkan.

Penjelasan:

 minifyEnabled true 
hapus kode yang tidak perlu dalam aplikasi
 shrinkResources true 
hapus sumber daya yang tidak digunakan dari APK.

Berat APK menjadi 960 KB, tidak ada perubahan kinerja.

Tahap Dua (Tambah Fungsi)


Agar aplikasi masuk akal, tambahkan fungsionalitas untuknya, misalnya, sebuah clicker.

Kode Activity_main.xml
 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:textSize="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ImageButton android:id="@+id/imageButton" android:layout_width="90dp" android:layout_height="90dp" android:layout_marginBottom="32dp" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:background="#000000FF" android:cropToPadding="false" android:scaleType="fitXY" android:visibility="visible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:srcCompat="@mipmap/ic_launcher_round" /> </android.support.constraint.ConstraintLayout> 


Kode MainActivity.java
 import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.MotionEvent; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; public class MainActivity extends AppCompatActivity { SharedPreferences Settings; ImageButton button; TextView text; int num = 31; View.OnTouchListener on = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { num--; if(num > 0) { text.setText(Integer.toString(num)); } else { num = 31; text.setText(",   "); } } return false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Settings = getSharedPreferences("settings", Context.MODE_PRIVATE); if (Settings.contains("left")) num = Settings.getInt("left", 0); button = findViewById(R.id.imageButton); button.setOnTouchListener(on); text = findViewById(R.id.number); if(num > 0) { text.setText(Integer.toString(num)); } else { num = 31; text.setText(",   "); } } @Override protected void onPause() { super.onPause(); SharedPreferences.Editor editor = Settings.edit(); editor.putInt("left", num); editor.apply(); } } 

Aplikasi telah memperoleh formulir berikut:



Ukuran aplikasi 1,1 MB, naik 140 KB.

Tahap tiga (hapus android.support dan AppCompat)


Saat ini, penganalisa APK menunjukkan yang berikut:



public class MainActivity extends AppCompatActivity dengan public class MainActivity extends Activity di MainActivity.java. Tekan Alt + Enter untuk meminta Android Studio mengimpor perpustakaan.

Ukuran aplikasi tidak berubah, tetapi ...



Di mana tombolnya?

Bahkan, semuanya beres, dia tetap bisa diklik. Tapi dia tidak punya gambar.

Buka activity_main.xml, temukan baris di bawah ini

 app:srcCompat="@mipmap/ic_launcher_round" 

dan ubah ke

 android:src="@mipmap/ic_launcher_round" 

Sekarang semuanya baik-baik saja:



Namun ukurannya belum berubah.

Kami kembali ke build.gradle dan menghapus blok ketergantungan:

 dependencies { } 

Dan sinkronkan Android Studio ... dengan kesalahan.

1. Buka file res / values ​​/ styles.xml dan ganti semua kontennya dengan kode berikut:

 <resources> <style name="AppTheme" parent="android:Theme.DeviceDefault.NoActionBar"> </style> </resources> 

2. ConstraintLayout, yang digunakan di Android Studio, tergantung pada android.support, yang telah dihapus dari blok dependencies , jadi kami akan mengganti ConstraintLayout dengan RelativeLayout, yang tidak bergantung pada android.support.

Kode Activity_main.xml:
 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF"> <TextView android:id="@+id/number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Hello World!" android:textSize="20dp" /> <ImageButton android:id="@+id/imageButton" android:layout_width="90dp" android:layout_height="90dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="32dp" android:background="#000000FF" android:scaleType="fitXY" android:src="@mipmap/ic_launcher_round" android:visibility="visible" /> </RelativeLayout> 


Kami mengkompilasi APK dan melihat hasilnya:



APK kami memiliki berat 202 KB, yang 7,5 kali lebih kecil dari ukuran aslinya.

Sebagian besar sumber daya terisi, dan kami akan menanganinya.

1. Hapus file dalam folder res / drawable dan hapus folder res / mipmap
2. Gambar ikon dan tombol Anda, lalu kurangi ukurannya menggunakan ImageOptim.

Tombol:



Ikon:



3. Unduh di Android Studio, untuk ini pilih mereka di folder, tekan Ctrl + C, buka Android Studio, pilih folder res / drawable dan tekan Ctrl + V, setelah itu Andoid Studio akan menawarkan beberapa opsi tempat untuk mentransfer gambar tergantung dari izin mereka.

Di folder yang dapat digambar, Anda dapat mengganti nama file dengan memilih Refactor -> Rename.
Ikon aplikasi memiliki nama i.png, gambar untuk tombol b.png

4. Sekarang buka file AndroidManifest.xml, baris

 android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" 

ganti dengan

 android:icon="@drawable/i" android:roundIcon="@drawable/i" 

Dalam file activity_main.xml, ganti bidang di ImageButton

 android:src="@mipmap/ic_launcher_round" 

pada

 android:src="@drawable/b" 

Ringkasan


Ukuran file total adalah 13,4 KB, yang 112 kali lebih sedikit dari ukuran awal!

Kode Final MainActivity.java
 import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; public class MainActivity extends Activity { SharedPreferences Settings; ImageButton button; TextView text; int num = 31; View.OnTouchListener on = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { num--; if(num > 0) { text.setText(Integer.toString(num)); } else { num = 31; text.setText(",   "); } } return false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.m); Settings = getSharedPreferences("settings", Context.MODE_PRIVATE); if (Settings.contains("left")) num = Settings.getInt("left", 0); text = findViewById(R.id.number); button = findViewById(R.id.button); button.setOnTouchListener(on); if(num > 0) { text.setText(Integer.toString(num)); } else { num = 31; text.setText(",  "); } } @Override protected void onPause() { super.onPause(); SharedPreferences.Editor editor = Settings.edit(); editor.putInt("left", num); editor.apply(); } } 


Kode hasil activity_main.xml
 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF"> <TextView android:id="@+id/number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Hello World!" android:textSize="20dp" /> <ImageButton android:id="@+id/button" android:layout_width="90dp" android:layout_height="90dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="32dp" android:background="#000000FF" android:scaleType="fitXY" android:src="@drawable/b" android:visibility="visible" /> </RelativeLayout> 


Ini mengakhiri penurunan yang wajar pada file APK, lalu ada instruksi untuk mengurangi aplikasi lebih lanjut sehingga merugikan kemudahan pengembangan.

Hapus sumber daya


Hapus folder res / values, dalam file AndroidManifest.xml kami mengganti blok aplikasi dengan kode berikut:

 <application android:icon="@drawable/i" android:roundIcon="@drawable/i" android:label="Clicker" android:theme="@style/android:Theme.DeviceDefault.NoActionBar"> <activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /></intent-filter> </activity> </application> 

Kami juga mengganti pengidentifikasi dengan satu huruf, ganti nama file activity_main.xml menjadi m.xml

Ubah pemrosesan klik:

Hapus garis

 button.setOnTouchListener(on); 

di MainLayout.java.
Ganti fungsi

 View.OnTouchListener on = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { num--; if(num > 0) { text.setText(Integer.toString(num)); } else { num = 31; text.setText(",   "); } } return false; } }; 

pada
 public void o(View v) { num--; if(num > 0) { text.setText(Integer.toString(num)); } else { num = 31; text.setText(",   "); } } 

Dalam file m.xml (sebelumnya activity_main) di struktur ImageButton, tambahkan baris

 android:onClick="o" 

Ukuran total adalah 10,2 KB , 147 kali lebih kecil dari ukuran awal. Saya pikir ini adalah hasil yang bagus.



Kode MainActivity.java
 import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; public class MainActivity extends Activity { SharedPreferences Settings; ImageButton button; TextView text; int num = 31; public void o(View v) { num--; if(num > 0) { text.setText(Integer.toString(num)); } else { num = 31; text.setText(",   "); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.m); Settings = getSharedPreferences("settings", Context.MODE_PRIVATE); if (Settings.contains("left")) num = Settings.getInt("left", 0); text = findViewById(R.id.n); button = findViewById(R.id.b); if(num > 0) { text.setText(Integer.toString(num)); } else { num = 31; text.setText(",  "); } } @Override protected void onPause() { super.onPause(); SharedPreferences.Editor editor = Settings.edit(); editor.putInt("left", num); editor.apply(); } } 


Kode M.xml
 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF"> <TextView android:id="@+id/n" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textColor="#000000" android:textSize="20dp" /> <ImageButton android:id="@+id/b" android:layout_width="90dp" android:layout_height="90dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="32dp" android:background="#000000FF" android:scaleType="fitXY" android:src="@drawable/b" android:onClick="o" android:visibility="visible" /> </RelativeLayout> 

Source: https://habr.com/ru/post/id417845/


All Articles