Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disable Android resource / image / PNG optimization

How do I prevent the Android "build process" from optimizing .png images?

I have an Android project with the following res directories:

- /res/
- /res/drawable
- /res/drawable-hdpi
- /res/drawable-hdpi-v5
- /res/drawable-ldpi
- /res/drawable-ldpi-v5
- /res/drawable-mdpi
- /res/drawable-mdpi-v5

These directories contain many .png files. I optimize PNG sizes with PNGOUTWin, and the overall size is reduced by more than 20%. When I build the .apk file, the images are "optimized" by the build process and the overall size is now 10% above the initial size, or 30% above my/PNGOUTWin optimized size.

My goal is to reduce the .apk size, even if it will affect the final performance, memory requirements, etc. How do I prevent the "build process" from optimizing .png images?

I'm targeting Android 2.2 and above.

P.S.: I am currently building my Android project from Eclipse, but I will switch to the automated build later (Ant?).

Note about JPG images: JPG will not work, because they do not have transparency.

like image 836
Maris B. Avatar asked Oct 17 '12 08:10

Maris B.


People also ask

Why are .PNG files the preferred type of image resource for the Android device?

PNG is pretty much the same as JPG but it supports transparency. PNG has nothing in common with JPEG. It's a lossless compression format, and for this reason, the files are bigger but with a perfect quality.

Which image format is best for Android apps?

JPG is best for Photographics. And SVG is scalable and can fit any size without losing quality so it is also good. What is the difference between saving an image in JPG vs. PNG format if both have the same compression rate (lossless)?

What format does Android save photos?

Android apps typically use images that are in one or more of the following file formats: AVIF, PNG, JPG, and WebP.


4 Answers

Finally there is an official way to disable the PNG cruncher with Gradle which hasn't been mentioned here yet:

  1. Edit main build.gradle to require gradle version 1.1.3 (or newer):

    buildscript {  
        repositories {  
            mavenCentral()  
        }  
        dependencies {  
            classpath 'com.android.tools.build:gradle:1.1.3'  
        }  
    }  
    
  2. In the individual apps's build.gradle, section android {}, insert:

    aaptOptions {  
        cruncherEnabled = false  
    }  
    

Reference: https://code.google.com/p/android/issues/detail?id=65335

like image 191
ChrisG Avatar answered Oct 30 '22 08:10

ChrisG


Specifying PNG crunching is now a BuildType property and is disabled by default on debug builds:

android {
    …
    buildTypes {
        release {
            crunchPngs false // or true
        }
    }
}

Note: It's available from Android Studio 3.0 Canary 5 .

like image 20
pRaNaY Avatar answered Oct 30 '22 08:10

pRaNaY


As mentioned in the Android documentation: http://developer.android.com/guide/topics/graphics/2d-graphics.html#drawables

Note: Image resources placed in res/drawable/ may be automatically optimized with lossless image compression by the aapt tool during the build process. For example, a true-color PNG that does not require more than 256 colors may be converted to an 8-bit PNG with a color palette. This will result in an image of equal quality but which requires less memory. So be aware that the image binaries placed in this directory can change during the build.

So if you want to reduce the size of your application you should either reduce the color-depth of your PNG files (this helps a lot) or switch to .JPG files wherever possible.

like image 43
Vinayak Bevinakatti Avatar answered Oct 30 '22 08:10

Vinayak Bevinakatti


Android Studio: Since Gradle Android plugin 1.0.0:

android {
...
  aaptOptions {
    useNewCruncher false
  }
....
}

Eclipse: Override the crunch task writing this in your build.xml:

<target name="-crunch">
   <echo message="This will skip PNG optimization"/>
</target>
like image 2
Yair Kukielka Avatar answered Oct 30 '22 09:10

Yair Kukielka