Flutter 模块 aar依赖依赖实践

以下??榫趂lutter 1.9.1版本进行讨论,更高版本可能不适用

一、我们面临了什么?

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

项目集成Flutter采用工程依赖,导致团队每一个人都需要安装flutter环境(对新人不友好),并且flutter项目夹杂在android工程里,导致git经?;岢鱿中薷奶崾荆ê苋菀椎贾挛笊荆?。对于flutter的更新非参与人员无感知(其他成员的老包拿不到flutter的最新代码)

正因为如此,我们借助这次机会让flutter??橛稍吹墓こ桃览当湮猘ar依赖,顺便开一个组件化的头。

二、对于方案的选择?

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.配置本地??橐览?/p>

3.配置远端??橐览?/p>

第三部分: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") 
}

本期分享结束

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容