一、SVG矢量图
解决问题:UI需要为同一张图片准备不同尺寸。
创建步骤:res - new - vector asset
然后可以选择AS自带的资源,也可以导入svg、psd(不支持透明度和渐变)。
(一)5.0以下系统兼容:
app下build.gradle的defaultConfig
里进行如下配置,打包时会将svg生成相应文件夹下的png图片:
vectorDrawables.generatedDensities('xhdpi', 'xxhdpi')
如以下svg图片:
![](https://img.haomeiwen.com/i6532892/10efb5e066fbdbc9.png)
打包后可以看到生成了png图片:
![](https://img.haomeiwen.com/i6532892/2114c378f18a3aa4.png)
(二)5.0及以上系统:
配置:
vectorDrawables.useSupportLibrary = true
使用:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_test" />
已验证:4.4及以上系统直接使用(二)也没问题。
二、Tint着色器
解决问题:同一张图片需要不同颜色。tint+selector
在4.4系统会crash,使用姿势不对?
使用:
<!--直接使用着色器-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/test2"
android:tint="@color/colorAccent" />
<!--selector结合着色器(4.4会crash)-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:src="@drawable/tint_src_selector"
android:tint="@color/tint_color_selector" />
tint_src_selector:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/test2" android:state_pressed="true" />
<item android:drawable="@drawable/test2" />
</selector>
tint_color_selector:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorAccent" android:state_pressed="true" />
<item android:color="@android:color/transparent" />
</selector>
三、strings.xml资源配置
默认情况下,打包时会包含各国语言的基础文案,如下:
![](https://img.haomeiwen.com/i6532892/d7a067e960ae67ad.png)
但往往一个APP并不需要支持如此多的国家语言,所以应该根据业务来配置:
//只保留简体中文和繁体字
resConfigs('zh-rCN', 'zh-rTW')
重新打包后如下:
![](https://img.haomeiwen.com/i6532892/295e7f7baa8e5c73.png)
可见resources.arsc文件(资源索引表)从259kb减少到154kb。这些语言是在support-v7包里产生的。
当然,默认情况下,Android只会将自身所需的一些基础文案生成多国语言版本,开发者所声明的strings如果没有做国际化操作,只会有一份在default下,如下:
![](https://img.haomeiwen.com/i6532892/80a609ee693fe53d.png)
四、so库打包配置
一般开发环境下会导入各种cpu架构的so库,这样打包时会大大增大apk体积,如果只运行在真机上的话,只需要支持armeabi-v7a
即可,一些大型APP也是这么处理的。
ndk{
abiFilters('armeabi-v7a')
}
如果APP是面向工业级的,或者用户设备繁杂,比如要支持PDA,这种情况就不能这么做了。
五、移除无用资源
不推荐,推荐资源压缩,见七。
六、代码混淆
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
需要注意一些依赖的第三方包是不能混淆的,需要过滤掉。
七、资源压缩
shrinkResources true
开启后,发现未引用的资源会被压缩,如下,发现布局代码消失了:
![](https://img.haomeiwen.com/i6532892/d6b43b649c36e82c.png)
如果需要指定文件不压缩,在res下raw下新建keep.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/activity_main2"
tools:shrinkMode="strict" />
重新打包会发现,main2.xml文件变大了,代码也回来了。使用时需要注意,某些资源只会在运行期时引用,一定要keep住使其不被压缩。
keep住多个文件,可用逗号分隔:
tools:keep="@layout/activity_main2,@layout/activity_main3"
八、webp
AS里直接对图片右键,convert to webp即可转换,在视觉上不会有明显损失的前提下,大小从1.3M压缩到7.7kb:
![](https://img.haomeiwen.com/i6532892/ac690f6d78d838fe.png)
已验证:4.4及以上系统直接使用webp没问题。
九、zipalign对齐
android zipalign对齐优化
进行对齐:
./zipalign -v 4 source.apk androidres.apk
检查是否对齐:
./zipalign -c -v 4 androidres.apk
十、资源混淆
Android资源混淆保护实践
资源混淆可以增大破解成本。
微信Android资源混淆打包工具
做了zipalign对齐、资源混淆,支持配置签名。
网友评论