美文网首页优化
【公开课实践】之APK优化

【公开课实践】之APK优化

作者: 哈利迪ei | 来源:发表于2019-04-01 23:48 被阅读30次

一、SVG矢量图

解决问题:UI需要为同一张图片准备不同尺寸。
创建步骤:res - new - vector asset
然后可以选择AS自带的资源,也可以导入svg、psd(不支持透明度和渐变)。

(一)5.0以下系统兼容:
app下build.gradle的defaultConfig里进行如下配置,打包时会将svg生成相应文件夹下的png图片:

vectorDrawables.generatedDensities('xhdpi', 'xxhdpi')

如以下svg图片:

打包后可以看到生成了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资源配置

默认情况下,打包时会包含各国语言的基础文案,如下:

但往往一个APP并不需要支持如此多的国家语言,所以应该根据业务来配置:

//只保留简体中文和繁体字
resConfigs('zh-rCN', 'zh-rTW')

重新打包后如下:

可见resources.arsc文件(资源索引表)从259kb减少到154kb。这些语言是在support-v7包里产生的。
当然,默认情况下,Android只会将自身所需的一些基础文案生成多国语言版本,开发者所声明的strings如果没有做国际化操作,只会有一份在default下,如下:

四、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

开启后,发现未引用的资源会被压缩,如下,发现布局代码消失了:

如果需要指定文件不压缩,在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:

已验证:4.4及以上系统直接使用webp没问题。

九、zipalign对齐

android zipalign对齐优化
进行对齐:

./zipalign -v 4 source.apk androidres.apk

检查是否对齐:

./zipalign -c -v 4 androidres.apk

十、资源混淆

Android资源混淆保护实践
资源混淆可以增大破解成本。

微信Android资源混淆打包工具
做了zipalign对齐、资源混淆,支持配置签名。

相关文章

网友评论

    本文标题:【公开课实践】之APK优化

    本文链接:https://www.haomeiwen.com/subject/lkubbqtx.html