美文网首页
Flutter 模块 aar依赖依赖实践

Flutter 模块 aar依赖依赖实践

作者: 叶满林 | 来源:发表于2021-07-19 16:28 被阅读0次

    以下模块均基于flutter 1.9.1版本进行讨论,更高版本可能不适用

    一、我们面临了什么?

    目前,我们团队有六个人,真正参与Flutter开发仅少数同学。

    项目集成Flutter采用工程依赖,导致团队每一个人都需要安装flutter环境(对新人不友好),并且flutter项目夹杂在android工程里,导致git经常会出现修改提示(很容易导致误删)。对于flutter的更新非参与人员无感知(其他成员的老包拿不到flutter的最新代码)

    正因为如此,我们借助这次机会让flutter模块由原来的工程依赖变为aar依赖,顺便开一个组件化的头。

    二、对于方案的选择?

    1.Flutter集成方案:

    目前市面上flutter集成到项目里有两种方案:

    官方解决方案:就是将flutter作为module让原生native工程直接依赖 (当前方案,再赘述)

    闲鱼flutter集成方案:将flutter项目打包成aar上传至maven,原生native工程通过maven引用
    优点:
    1.不开发flutter的同学无需安装环境与工程。
    2.flutter更新,所有同学都可以看到新页面。
    3.更有利于组件化开展
    缺点:
    1.调试包与正式包都需要单独编译,测试较为麻烦
    2.上线前需要主动更新版本号。

    2、Flutter测试编译方案

    (1)本地maven库依赖编译

    将flutter工程打出的aar包,放在本地maven库。原生工程本地maven依赖,找到aar并集成到主工程去

    (2)文件传递编译

    将flutter工程打出的aar包,通过脚本移动到原生工程,把aar通过git方式添加到项目中去。工程依赖lib文件夹下的aar

    (3)远程maven库依赖编译

    将本地aar放到远端maven仓库,本地通过gradle方式引用。

    最终,我们选择线上环境非开发人员采用(3)方式依赖。测试与开发采用(1)方式依赖。(2)方式由于aar包过于大(50m左右),对于git下载不利,所以就放弃了。

    三、需要做哪些步骤?

    第一部分:flutter部分准备

    1.迁移flutter工程位置,独立出flutter工程

    2.配置module报名,撰写相关打包脚本

    (1)本地依赖脚本

    (2)远端maven库上传脚本

    第二部分:配置原生端相关依赖

    1.创建flutterComponent组件

    2.配置本地模块依赖

    3.配置远端模块依赖

    第三部分:maven库相关配置(本文略)

    四、具体工作

    第一部分:flutter配置

    1.将flutter工程从原有的工程文件夹中移除,具体位置与Android项目平齐,图示如下


    文件摆放.png

    2.配置包名(主要是以前太随意了)
    //在yaml文件下
    module: androidPackage: cn.yemanlin.flutter

    3.撰写python脚本(略)

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import os
    import sys
    
    __build_name = "-type"
    __version_name = "-version"
    __maven_name = "-maven"
    
    __maven_config = "apply plugin: 'maven-publish'\n" \
                     "apply plugin: 'maven'\n" \
                     "uploadArchives [\n" \
                     "repositories [\n" \
                     "mavenDeployer [\n" \
                     "repository(url: {mavenReleasesUrl}) [\n" \
                     "authentication(userName: {maven_local_username}, password: {maven_local_password})\n" \
                     "]\n" \
                     "snapshotRepository(url: {mavenSnapshotUrl}) [\n" \
                     "authentication(userName: {maven_local_username}, password: {maven_local_password})\n" \
                     "]\n" \
                     "pom.project [\n" \
                     "version {version}\n" \
                     "artifactId {maven_pom_artifactId}\n" \
                     "groupId {maven_pom_groupId}\n" \
                     "packaging {maven_pom_packaging}\n" \
                     "description {maven_pom_description} \n" \
                     "]]]]\n"
    
    
    def start(args):
        build_type = ""
        version = ""
        maven = ""
        index = 1
        while index < len(args):
            if args[index] == __build_name:
                index += 1
                build_type = args[index]
            elif args[index] == __version_name:
                index += 1
                version = args[index]
            elif args[index] == __maven_name:
                index += 1
                maven = args[index]
            else:
                index += 1
        if build_type == "" and version == "" and maven == "":
            print('格式错误,应参照:\n'
                  ' 例1:build_android_auto.py -type release -version 0.0.1 -maven snapshot\n'
                  ' 例2:build_android_auto.py -type debug\n')
            exit(0)
        assert build_type == "release" or build_type == "debug"
        assert maven == "" or ((maven == "release" or maven == "snapshot") and version != "")
        print(f'your args: buildType: {build_type}  version:{version} mavenType:{maven}')
    
        need_upload = (maven == "release" or maven == "snapshot") and version != ""
    
        # 清理工作
        if need_upload:
            out = os.system('git stash')
            out = os.system('flutter clean')
            out = os.system('git reset --hard')
            out = os.system('git stash apply')
    
        #构建开始
        build(build_type)
        if need_upload:
            # 上传maven库
            upload(version, maven)
        return
    
    
    def build(build_type="debug"):
        print(f"start build {build_type}")
        if build_type == "debug":
            out = os.system('flutter build aar --debug')
            print(out)
        elif build_type == "release":
            out = os.system('flutter build aar --release')
            print(out)
        return
    
    
    def upload(version, maven_type):
        print(f"start config {version} {maven_type}")
    
        if maven_type == "snapshot":
            full_version = f'"{version}-SNAPSHOT"'
        elif maven_type == "release":
            full_version = f'"{version}-release"'
        else:
            raise Exception("unknown maven type!")
    
        config = __maven_config.format(
            mavenReleasesUrl='"  自己填写 "',
            mavenSnapshotUrl='" 自己填写 "',
            maven_local_username='"  自己填写  "',
            maven_local_password='" 自己填写 "',
            version=full_version,
            maven_pom_artifactId='" 自己填写 "',
            maven_pom_groupId='" 自己填写 "',
            maven_pom_packaging='"aar"',
            maven_pom_description='"description"').replace("[", "{").replace("]", "}")
    
        modify_file_append(".android/Flutter/build.gradle", "apply from", config)
    
        print("start build .")
    
        os.chdir("./.android")
        out = os.system("./gradlew assembleRelease")
        print(out)
    
        print("start upload .")
    
        out = os.system("./gradlew uploadArchives")
        print(out)
    
        # 清理工作
        out = os.system('git reset --hard')
        print(out)
        out = os.system('git stash apply')
        print(out)
        print("\ndone.")
        return
    
    
    def modify_file_append(file_path, start, content):
        with open(file_path, "r") as f:
            lines = f.readlines()
            f.close()
        with open(file_path, 'w') as f:
            for line in lines:
                f.write(line)
                if line.startswith(start):
                    f.write(content)
            f.close()
        return
    
    
    def modify_file(file_path, prefix, content):
        with open(file_path, "r") as f:
            lines = f.readlines()
            f.close()
        with open(file_path, 'w') as f:
            for line in lines:
                if line.startswith(prefix):
                    line = content
                f.write(line)
            f.close()
        return
    
    
    if __name__ == "__main__":
        start(sys.argv)
    

    4.使用
    哈哈哈哈,脚本里有,自己看吧。

    第二部分:Android原生配置

    1.在setting.gradle中删除下面两句话(解除以前的工程依赖)
    setBinding(new Binding([gradle: this]))
    evaluate(new File( settingsDir.parentFile,'flutter/yemanlin/.android/include_flutter.groovy' ))

    2.创建一个新的组件(详情见另一篇文章)
    //1.在项目build.gradle下进行配置

    allprojects{
      repositories {       
      //flutter嵌入层         
      maven { url 'http://download.flutter.io' }
      //本地flutter maven库(这个很关键,也就是为什么要把项目放在与工程平齐的地方)
      maven { url '../../flutter/yemanlin/build/host/outputs/repo' }
      }
    }
    

    //2.在app的build.gradle下进行配置

    repositories {
        flatDir {
            dirs project(':flutterComponent').file('libs')  //flutterComponent就是组件名字     
        } 
    }
    

    //3.在我们flutter的组件里进行配置

    dependencies {    
       //flutter 打包后,内部不会带aar包,所以flutter依赖的aar包需要手动迁移到本地Lib文件夹
       implementation files('libs/flutter_drag_scale-release.aar') 
       .......     
       //方式一:远端依赖,把相关aar要写到这里     
       api ("cn.yemanlin.flutter:flutter_release:1.0"){
         exclude module: 'sqflite'
       }     
      //方式二:本地依赖,需要先用flutter工程进行本地编译     
      api ("cn.yemanlin.flutter.test:flutter_debug:1.0") 
    }
    

    本期分享结束

    相关文章

      网友评论

          本文标题:Flutter 模块 aar依赖依赖实践

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