Reduce apk size with combine java files

168 views Asked by At

Does reducing number of .java files reduces apk size?
For example is it better that i define my ListAdapter inside Activity class rather than a separate .java file?

What about xml files? for example make a shape.xml and reference it in selector.xml or define that shape inside the item of selector?

3

There are 3 answers

0
CommonsWare On

Does reducing number of .java files reduces apk size?

Not in general.

What about xml files? for example make a shape.xml and reference it in selector.xml or define that shape inside the item of selector?

That might save a handful of bytes.

i have some critical situation and even small size changes are very important (such as ~5kb)

Then reduce your APK size:

  • Get rid of libraries where you are using tiny pieces of them, and use the minimum possible library set (e.g., specific pieces of Play Services, not the whole "kitchen sink" Play Services library)

  • Reduce the number of density variants of your drawables, if in testing the automatic resampling by Android meets your needs, and use Lint to identify resources that might be lingering in your project that you are not referencing

  • Use ProGuard

  • Use minifyResources and resConfigs options in your Gradle build file, if you are using Android Studio

  • And everything else Cyril Mottier points out in that blog post

0
gkondati On

you better to reduce image resources, and if you are using maven/gradle build system you can reduce apk size by shirking the code using progaurd tool .

0
Artist404 On

APK Size:

Generally it depends on the assets you have used. Try using LINT in android studio, which give you a summary of unused resources, which you can check and delete.

Also, proguard is very helpful in this, try using proguard in your application.

http://dominoc925.blogspot.in/2015/01/enabling-proguard-obfuscation-in.html

use minifyenabled = true with following proguard basic configuration I found somewhere on Stackoverflow :

-dontwarn org.**
-dontwarn okio.**
-dontwarn com.squareup.**
##---------------Begin: proguard configuration common for all Android apps ----------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-allowaccessmodification
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService

# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

# Preserve all native method names and the names of their classes.
-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

# Preserve static fields of inner classes of R classes that might be accessed
# through introspection.
-keepclassmembers class **.R$* {
  public static <fields>;
}

# Preserve the special static methods that are required in all enumeration classes.
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep public class * {
    public protected *;
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
##---------------End: proguard configuration common for all Android apps ----------

# Remove Logging statements
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** e(...);
    public static *** i(...);
}

##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.antew.redditinpictures.library.imgur.** { *; }
-keep class com.antew.redditinpictures.library.reddit.** { *; }

##---------------End: proguard configuration for Gson  ----------

#QuickBlox
-keep class org.jivesoftware.smack.** { *; }
-keep class com.quickblox.** { *; }
-keep class * extends org.jivesoftware.smack { public *; }
-keep class org.jivesoftware.smack.** { public *; }
-keep class org.jivesoftware.smackx.** { public *; }
-keep class com.quickblox.** { public *; }
-keep class * extends org.jivesoftware.smack { public *; }
-keep class * implements org.jivesoftware.smack.debugger.SmackDebugger { public *; }