【flutter】应用瘦身优化包体积

资源优化

1、删除无用代码和资源文件
2、压缩图片
3、代码优化
4、混淆
5、分架构构建apk

1、删除无用代码和资源文件

每个应用在版本迭代的过程中都会产生很多弃用代码甚至模块,同时也会产生很多不再使用的资源文件,图片、动画等。统统删除就好了,不要担心以后会不会用到,git已经帮你都备份好了。

删图片是个苦力活,可以通过脚本处理:

from genericpath import isdir
import imghdr
from operator import delitem
import os
from re import search
import re
import string
from sys import path
import sys
from tokenize import String
from typing import List
import os.path

print("---Analyze unused Assets----")
#项目目录
projectAbsRootPath = sys.path[0]
#图片所在的资源目录路径
assetPath="/images"
#项目中dart代码所在目录
libPath = projectAbsRootPath+ "/lib"
assetAbPath = projectAbsRootPath+assetPath

print("projectRootPath:" + projectAbsRootPath +  "   assets:" +assetAbPath + "     lib:" + libPath)
print("----------开始查找图片--------------")
#遍历目录,将图片存储到list中的方法
def searchImage(filePath:String):
    list = []
    isDir = os.path.isdir(filePath)
    if isDir:
        for f in os.listdir(filePath):
            if f.startswith("."):
                print(filePath+"/"+f)
            else:
                tList = searchImage(filePath+"/"+f)
                list.extend(tList)
    else:
        if imghdr.what(filePath) in {"jpg","bmp","jpeg","rgb","tif","png"}:
            list.append(filePath)
    return list

#项目中使用的图片资源路径集合
imageList = searchImage(assetAbPath)

print("-------------遍历dart文件,分析未使用的图片---------")
def matchAndDelImage(contentStr:String,list:List):
    #遍历拷贝的list,操作原始的list,list[:]是对原始的一个拷贝
    for imgPath in list[:]:
        #以文件名匹配图片的使用
        # pList = imgPath.split("/")
        # imgName = pList[-1]
        #以使用的文件路径匹配图片
        index = imgPath.find(assetPath)
        imgName = imgPath[index+1:]
        # print("imgName:"+imgName)

        imgNameShix = os.path.basename(imgName)
        # print("imgNameShix:"+imgNameShix)
        # match = re.search(imgName,contentStr)
        match = re.search(imgNameShix,contentStr)
        if match:
            list.remove(imgPath)
            # print("used-->" + imgPath)

#
def searchImageInDart(filePath:String,list:List):
    print("----------" + filePath)
    if filePath.find(".DS_Store") > -1 :
        return
    if filePath.find(".png") > -1 :
        return
    if filePath.find(".ttf") > -1 :
        return
    if os.path.isdir(filePath):
        for f in os.listdir(filePath):
            searchImageInDart(filePath+"/"+f,list)
    else:
        with open(filePath,"r",encoding="utf-8") as f:
            contentStr = f.read()
            f.close()
            if len(contentStr) != 0:
                matchAndDelImage(contentStr,list)

#      
searchImageInDart(libPath,imageList)

print("------在dart文件中未找到被使用的图片如下-----size:" + str(len(imageList)))
for img in imageList:
    print("may be unused-->" + img)
    # os.remove(img)
print("-------------------分析完成-------------------------------")

该脚本逻辑是遍历文件资源目录下的文件名,扫描lib文件下代码是否包含该文件名,不包含则认为该文件资源未被使用。因此,代码中如过通过拼接文件名等方式使用图片的,无法被脚本识别,如:

//图片名
img1.png
img2.png
//代码使用
int num = 1;
AssetImage('assets/images/img${num}.png')

在执行脚本后,img1和img2会被删除,谨慎使用,删完多测试!

2、压缩图片

以下网站都免费:
tinypng.com
docsmall.com
imageoptim.com
平时养成好习惯,开发过程中就使用压缩过的图片,就能省略这一步啦

3、代码优化

代码优化主要体现在三方库上

  • 移除不再使用的三方库
  • 相同功能,统一使用同一个库。多人共同开发的情况下,有时候会出现不同模块为实现相同或类似功能而导入了相同功能的不同库,减少库的使用,也能减少一定的包体积。
4、混淆

android/app/build.gradle文件下配置:

buildTypes {
    release {
        signingConfig signingConfigs.release
        minifyEnabled false
        shrinkResources false
    }
}
  • minifyEnabled:是否启用混淆
  • shrinkResources:是否移除无用资源

注:该配置仅对android native代码生效,flutter层代码打包时默认混淆

5、分架构构建apk

可以参考我的另一篇文章flutter打渠道包

//打包命令
flutter build apk --release --build-number 1 --build-name=1.0.0 --dart-define=APP_CHANNEL=normal --target-platform android-arm,android-arm64 --split-per-abi

//--build-number 1:构建的版本号;
//--build-name 1.0.0:构建的版本名;
//--dart-define=APP_CHANNEL=normal :自定义参数,可定义多个(APP_CHANNEL为key,normal为值)//--target-platform android-arm,android-arm64: 指定生成对应架构的release包;
//--split-per-abi:表示告知需要按照我们指定的类型分别打包,如果移除则直接构建包含所有 CPU 架构的 Apk 包;

其中--split-per-abi表示构建单一架构。
通常我们为了上架时方便,直接构建包含android-arm,android-arm64两种架构的通用包,就能基本满足市场需求。但如果为了包体积更小,我们可以在打包时加上--split-per-abi,分别构建android-arm,android-arm64两个架构的包。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值