九道工序
1. SVG(Scalable Vector Graphics)可缩放矢量图
使用矢量图代替位图可以减小 APK 的尺寸, 因为可以针对不同屏幕密度调整同一文件的大小, 而不会降低图像质量.
矢量图首次加载时可能消耗更多的 CPU 资源. 之后, 二者的内存使用率和性能则不相上下. 我们建议您将矢量图像限制为最大 200 x 200 dp; 否则, 绘制它可能需要耗费很长的时间.
SVG 是由 xml 定义的, 标准 SVG 根节点是 < svg > 在 Android 中通过 Vector 实现支持, 根节点是 < vector>
版本差异(具体参考官方文档)
Android 5.0(API 级别 21)及更高版本会提供矢量图支持. 如果应用的最低 API 级别低于以上版本, Vector Asset Studio 会将矢量图文件添加到项目中; 另外, 在构建时, Gradle 会创建不同分辨率的 PNG 光栅图像.
对于 Android 5.0(API 级别 21)及更高版本, Vector Asset Studio 支持所有 VectorDrawable 元素. 为向后兼容 Android 4.4(API 级别 20)及更低版本, Vector Asset Studio 支持部分 xml 元素.
2. Tint 着色器 yifeng.studio/2017/03/30/...
自 API 21 (Android L)开始, Android SDK 引入 tint 着色器, 可以随意改变安卓项目中图标或者 View 背景的颜色, 一定程度上可以减少同一个样式不同颜色图标的数量, 从而起到 Apk 瘦身的作用.
tint 或 backgroundTint 属性, 与 src 或 background 属性一定是对应成对出现的.
- <!-- This color state list defines the color applied to the "buttonbackground" drawable.
- A color is selected based on the state of its view.-->
- <selector xmlns:Android="http://schemas.android.com/apk/res/android">
- <!-- Pressed state -->
- <item Android:color="@color/red" Android:state_pressed="true" />
- <!-- Focused state -->
- <item Android:color="@color/light_purple" Android:state_focused="true" />
- <item Android:color="@color/deep_purple" Android:state_enabled="true" />
- <!-- Disabled state -->
- <item Android:color="@color/light_blue" Android:state_enabled="false" />
- <!-- Default -->
- <item Android:color="@color/light_blue" />
- </selector>
java 代码中使用 DrawableCompat
- Drawable orgiDrawable = ContextCompat.getDrawable(this, R.drawable.btn_default_normal_holo);
- Drawable tintDrawable = DrawableCompat.wrap(orgiDrawable).mutate();
- DrawableCompat.setTint(tintDrawable, Color.parseColor("#00ff00"));
- ImageView backTintImg = (ImageView)findViewById(R.id.tint);
- backTintImg.setImageDrawable(tintDrawable);
- // ---------------------------------------------
- // 必须重新获取下对象
- Drawable orgiDrawable2 = ContextCompat.getDrawable(this, R.drawable.btn_default_normal_holo);
- Drawable tintlistDrawable = DrawableCompat.wrap(orgiDrawable2).mutate();
- DrawableCompat.setTintList(tintlistDrawable, ContextCompat.getColorStateList(this, R.color.custom_tint));
- DrawableCompat.setTintMode(tintlistDrawable, PorterDuff.Mode.MULTIPLY);
- ImageView tintListImg = (ImageView)findViewById(R.id.tintlist);
- tintListImg.setImageDrawable(tintlistDrawable);
- // ---------------------------------------------
- ImageView colorfilterImg = (ImageView)findViewById(R.id.colorfilter);
- colorfilterImg.setColorFilter(new PorterDuffColorFilter(Color.parseColor("#ccffcc"), PorterDuff.Mode.MULTIPLY));
3. 资源打包配置
Android Gradle 还为我们 提供了一个 resConfigs, 它属于 ProductFlavor 的一个方法, 可以让我们配置哪些类型的资源才被打包到 Apk 中, 比如只有中文的, 只有 hdpi 格式的图片等等, 这是非常重要的, 比如我们引用的第三方库, 特别是 Support Library 和 Google Play Services 这两个主要的大库, 因为国际化的问题, 他们都支持了几十种语言, 但是对于我们的 App 来说, 我们并不需要这么多, 比如我们只用中文的语言就可以了, 其他的都不需要.
- build.gradle
- defaultConfig {
- ......
- resConfigs 'zh', 'en','ja'
- }
设置后生成的 APK 资源. 系统默认语言是英语 en
4. 配置不同 CPU 的 so 库
- build.gradle
- defaultConfig {
- ndk {
- abiFilters('armeabi')
- }
- }
5. 删除无用资源(lint)
AndroidStudio Analyze->Run Inspection by Name->Unused resources
6. 代码混淆
gradle 属性 minifyEnabled
混淆配置 -dontwarn -keep
7. 资源压缩
developer.Android.google.cn/studio/buil...
gradle 属性 shrinkResources 对无用资源压缩
将无用的图片改成占位图, 无用的 xml 改成空根文件
可以通过 res/raw/keep.xml 来保持不压缩
8. webp 图片 AndroidStudio 提供了菜单操作
9. 资源混淆
最后
如果你看到了这里, 觉得文章写得不错就给个赞呗? 如果你觉得那里值得改进的, 请给我留言. 一定会认真查询, 修正不足. 谢谢.
来源: http://www.jianshu.com/p/0a5ef13c3a65