Flutter 模塊 aar依賴依賴實(shí)踐

以下模塊均基于flutter 1.9.1版本進(jìn)行討論,更高版本可能不適用

一、我們面臨了什么?

目前,我們團(tuán)隊(duì)有六個(gè)人,真正參與Flutter開發(fā)僅少數(shù)同學(xué)。

項(xiàng)目集成Flutter采用工程依賴,導(dǎo)致團(tuán)隊(duì)每一個(gè)人都需要安裝flutter環(huán)境(對(duì)新人不友好),并且flutter項(xiàng)目夾雜在android工程里,導(dǎo)致git經(jīng)常會(huì)出現(xiàn)修改提示(很容易導(dǎo)致誤刪)。對(duì)于flutter的更新非參與人員無(wú)感知(其他成員的老包拿不到flutter的最新代碼)

正因?yàn)槿绱?,我們借助這次機(jī)會(huì)讓flutter模塊由原來的工程依賴變?yōu)閍ar依賴,順便開一個(gè)組件化的頭。

二、對(duì)于方案的選擇?

1.Flutter集成方案:

目前市面上flutter集成到項(xiàng)目里有兩種方案:

官方解決方案:就是將flutter作為module讓原生native工程直接依賴 (當(dāng)前方案,再贅述)

閑魚flutter集成方案:將flutter項(xiàng)目打包成aar上傳至maven,原生native工程通過maven引用
優(yōu)點(diǎn):
1.不開發(fā)flutter的同學(xué)無(wú)需安裝環(huán)境與工程。
2.flutter更新,所有同學(xué)都可以看到新頁(yè)面。
3.更有利于組件化開展
缺點(diǎn):
1.調(diào)試包與正式包都需要單獨(dú)編譯,測(cè)試較為麻煩
2.上線前需要主動(dòng)更新版本號(hào)。

2、Flutter測(cè)試編譯方案

(1)本地maven庫(kù)依賴編譯

將flutter工程打出的aar包,放在本地maven庫(kù)。原生工程本地maven依賴,找到aar并集成到主工程去

(2)文件傳遞編譯

將flutter工程打出的aar包,通過腳本移動(dòng)到原生工程,把a(bǔ)ar通過git方式添加到項(xiàng)目中去。工程依賴lib文件夾下的aar

(3)遠(yuǎn)程maven庫(kù)依賴編譯

將本地aar放到遠(yuǎn)端maven倉(cāng)庫(kù),本地通過gradle方式引用。

最終,我們選擇線上環(huán)境非開發(fā)人員采用(3)方式依賴。測(cè)試與開發(fā)采用(1)方式依賴。(2)方式由于aar包過于大(50m左右),對(duì)于git下載不利,所以就放棄了。

三、需要做哪些步驟?

第一部分:flutter部分準(zhǔn)備

1.遷移flutter工程位置,獨(dú)立出flutter工程

2.配置module報(bào)名,撰寫相關(guān)打包腳本

(1)本地依賴腳本

(2)遠(yuǎn)端maven庫(kù)上傳腳本

第二部分:配置原生端相關(guān)依賴

1.創(chuàng)建flutterComponent組件

2.配置本地模塊依賴

3.配置遠(yuǎn)端模塊依賴

第三部分:maven庫(kù)相關(guān)配置(本文略)

四、具體工作

第一部分:flutter配置

1.將flutter工程從原有的工程文件夾中移除,具體位置與Android項(xiàng)目平齊,圖示如下


文件擺放.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('格式錯(cuò)誤,應(yīng)參照:\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')

    #構(gòu)建開始
    build(build_type)
    if need_upload:
        # 上傳maven庫(kù)
        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.創(chuàng)建一個(gè)新的組件(詳情見另一篇文章)
//1.在項(xiàng)目build.gradle下進(jìn)行配置

allprojects{
  repositories {       
  //flutter嵌入層         
  maven { url 'http://download.flutter.io' }
  //本地flutter maven庫(kù)(這個(gè)很關(guān)鍵,也就是為什么要把項(xiàng)目放在與工程平齊的地方)
  maven { url '../../flutter/yemanlin/build/host/outputs/repo' }
  }
}

//2.在app的build.gradle下進(jìn)行配置

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

//3.在我們flutter的組件里進(jìn)行配置

dependencies {    
   //flutter 打包后,內(nèi)部不會(huì)帶aar包,所以flutter依賴的aar包需要手動(dòng)遷移到本地Lib文件夾
   implementation files('libs/flutter_drag_scale-release.aar') 
   .......     
   //方式一:遠(yuǎn)端依賴,把相關(guān)aar要寫到這里     
   api ("cn.yemanlin.flutter:flutter_release:1.0"){
     exclude module: 'sqflite'
   }     
  //方式二:本地依賴,需要先用flutter工程進(jìn)行本地編譯     
  api ("cn.yemanlin.flutter.test:flutter_debug:1.0") 
}

本期分享結(jié)束

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容