禁用 Android 资源/图片/PNG 优化。

22

如何防止安卓“构建过程”优化 .png 图片?

我有一个包含以下资源目录的安卓项目:

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

这些目录包含许多.png文件。我使用PNGOUTWin优化PNG大小,整体大小减少了20%以上。当我构建.apk文件时,图像会被“构建过程”“优化”,整体大小现在比最初的大小高10%,或比我/PNGOUTWin优化后的大小高30%。

我的目标是减小.apk文件的大小,即使它会影响最终的性能、内存要求等。 如何防止“构建过程”优化.png图像?

我的目标是Android 2.2及以上版本。

JPG图像的注释: JPG将不起作用,因为它们没有透明度。

6个回答

39

最终,有一种官方方法可以通过Gradle禁用PNG压缩器,这还没有在这里提到:

  1. 编辑主要的build.gradle文件,要求使用1.1.3(或更高版本)的gradle:

buildscript {  
    repositories {  
        mavenCentral()  
    }  
    dependencies {  
        classpath 'com.android.tools.build:gradle:1.1.3'  
    }  
}  
在各自应用程序的build.gradle中,android{}部分插入以下内容:
aaptOptions {  
    cruncherEnabled = false  
}  

参考资料: https://code.google.com/p/android/issues/detail?id=65335


1
哇,这刚刚为我的调试版本构建节省了约1分钟的时间。 - Patrick
2
只在调试版本中执行这个操作,这样可以减少构建时间,是否可行? - android developer

22

现在指定PNG压缩是一个BuildType属性,并且在调试构建上默认禁用:

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

注意:该功能可在Android Studio 3.0 Canary 5中使用。


1
谢谢。在浪费了很多时间后,只有您的答案帮助了我。 - Taras Vovkovych
很高兴能帮助你。谢谢 :) - pRaNaY

2

Android Studio: 自从Gradle Android插件1.0.0以来:

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

Eclipse: 在你的build.xml文件中覆盖crunch任务,代码如下:

<target name="-crunch">
   <echo message="This will skip PNG optimization"/>
</target>

我确认您的Eclipse示例也可以使用基于命令行Ant的工作流程;通过将代码放在<project>标签中,并将它们放置在位于项目根目录的custom_rules.xml文件中-- 我最初认为覆盖不起作用(因为PNG不会被复制到bin/res文件夹中),但事实证明,在这种情况下,工具链将只使用原始res文件夹中的PNG。 - xwindows -on strike-

2
如Android文档所述:http://developer.android.com/guide/topics/graphics/2d-graphics.html#drawables 请注意:在res/drawable/目录中放置的图像资源可能会在构建过程中由aapt工具自动进行无损图像压缩优化。例如,不需要超过256种颜色的真彩色PNG可以转换为带有调色板的8位PNG。这将产生质量相同但需要更少内存的图像。因此,请注意此目录中放置的图像二进制文件可能会在构建期间更改。
因此,如果您想减小应用程序的大小,应该降低PNG文件的颜色深度(这非常有帮助)或尽可能使用.JPG文件。

1
带有Alpha通道的8位PNG文件——漂亮的阴影,多彩的颜色,大小为200x200看起来很丑。不完美。目前使用Photoshop + Web Image Guru + PNGOUTWin后处理。 - Maris B.
是的,你不能在JPG中像PNG那样使用渐变效果、阴影效果等,所以我建议尽可能使用JPG。 - Vinayak Bevinakatti
接受您的答案,因为确实,在8位PNG格式中看起来不错的图像并没有被“构建”过程优化。然而,我最终使用了Ant + 7-zip + 原始PNG。 - Maris B.
6
这个回答根本没有回答问题,我不明白它是如何被接受的。 - Display Name

2

0

Google最近在Android SDK Build Tools中引入了一个新的PNG处理器aapt 0.9.1,可以解决aapt优化后PNG文件增加大小的问题。

通过此更新,Android Studio和Gradle现在可以在build.gradle配置文件中进行以下变更来切换PNG处理器:

android {
    ..
    ..

    aaptOptions.useAaptPngCruncher = false
}

通过添加这行代码,aapt使用新的PNG处理器,它会检查“优化”的PNG文件是否比原始的PNG文件更小。我能够在编译后的APK中减少4.8 MB,并且没有遇到任何与新的构建配置相关的错误/问题。
更新:在较新版本的Android Studio中已弃用此功能。请参考ChrisG提供的答案。

我认为那已经过时了,使用@ChrisG的答案。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接