flutter build aar 及一鍵打包aar并上傳Maven私服(阿里云效)

引子

盼望著颈墅,盼望著章母,華為鴻蒙升級(jí)了。?Harmoney OS Next 不再支持 Android 系統(tǒng)了因宇,整個(gè)移動(dòng)端瞬間炸了鍋七婴。
作為一個(gè)曾經(jīng)手機(jī)市場(chǎng)王者,任何一家公司都無(wú)法忽視華為的市場(chǎng)察滑,Android 陣營(yíng)瞬間就出現(xiàn)了學(xué)習(xí)鴻蒙系統(tǒng)的激進(jìn)力量打厘。
同時(shí),怕步子超大了贺辰,Harmoney OS Next 還是支持 flutter 跨端技術(shù)的婚惫。鑒于我一直時(shí)做跨端開(kāi)發(fā)的,無(wú)論是 React Native魂爪、小程序先舷,還是阿里系的 mist、weex 都多少有所涉獵滓侍,也就直接把三年前的 flutter 代碼拉出來(lái)遛遛了:https://github.com/hongyi0609/MeiTuanEdwin
與此同時(shí)蒋川,也順手建立另一個(gè) my_fluter 庫(kù),把MeiTuanEdwin項(xiàng)目中 my_flutter 模塊單獨(dú)抽出來(lái)了:
https://github.com/hongyi0609/my_flutter
弄得有其他人合作開(kāi)發(fā)似的~

背景

大家對(duì)郭霖大佬都不陌生吧撩笆?捺球!
前一段我刷他的文章,發(fā)現(xiàn)他在研究 flutter夕冲,然后還分享了一篇讀者投稿氮兵。以此得知,微軟未來(lái)會(huì)有很多的 flutter 的業(yè)務(wù)歹鱼,并且大部分處于起步階段泣栈。所以郭老師就開(kāi)始之前很少關(guān)注的 flutter 研究生涯。
這不是眾里尋她千百度,驀然回首南片,那人卻在微信公眾號(hào)嗎掺涛?
我也就立馬著手繼續(xù)自己的 flutter 研究之路了。如果你對(duì) flutter 一知半解疼进,那我勸你先去讀讀這篇文章:https://juejin.cn/post/7306579782853754932
跟你想的基本一致薪缆,我就是讀這篇文章的時(shí)候發(fā)現(xiàn),搭建環(huán)境根本不是那么回事兒伞广。

八卦:大廠是怎么玩兒的拣帽?

很多有電商味道的大廠,都是精細(xì)化操作嚼锄,整個(gè)App 采用組件化開(kāi)發(fā)减拭,每個(gè)組件都是一個(gè)單獨(dú)的小組 客戶端+前端,其中客戶端由 Android+iOS+跨端(外包)+小程序+h5組成灾票,前端由小程序+h5+web 組成,這樣整個(gè)大前端團(tuán)隊(duì)就形成了茫虽。
現(xiàn)在開(kāi)始卷刊苍,客戶端團(tuán)隊(duì)的架構(gòu)組經(jīng)過(guò)無(wú)數(shù)次的迭代重構(gòu),終于在 325 下來(lái)之前濒析,憋出了 taro 正什、uniapp或者 morjs。由于實(shí)現(xiàn)了多端一體化号杏,開(kāi)發(fā)一次代碼的成果可以在 Android婴氮、iOS、小程序盾致、Web 端等所有平臺(tái)運(yùn)行主经,那么寫(xiě)跨端(外包)的同學(xué)就愉快的下崗了。同時(shí)庭惜,原來(lái)的小程序開(kāi)發(fā)時(shí)微信罩驻、抖音、支付寶护赊,每個(gè)平臺(tái)一個(gè)主要負(fù)責(zé)同學(xué)惠遏,現(xiàn)在另外兩個(gè)同學(xué)只要不去勞動(dòng)局都好商量。
你可能會(huì)問(wèn)骏啰,剩余的技術(shù)空缺誰(shuí)來(lái)補(bǔ)上节吮。聽(tīng)好啊:
下一年的 KPI主要是兩個(gè)方向判耕,
1. 客戶端同學(xué)除了會(huì)用 Android透绩、iOS 開(kāi)發(fā),也要具備跨端開(kāi)發(fā)的能力,并且要互為 backup
2. 前端同學(xué)除了自己負(fù)責(zé)B 端開(kāi)發(fā)業(yè)務(wù)渺贤,也要能夠勝任微信小程序各平臺(tái)的開(kāi)發(fā)工作
基于第一點(diǎn)雏胃,我愉快的玩起了 flutter 。

進(jìn)入Flutter篇

工欲善其事志鞍,必先利其器瞭亮。按照Flutter 開(kāi)發(fā)過(guò)程主要是依賴(lài) aar包開(kāi)發(fā),和依賴(lài)源碼開(kāi)發(fā)固棚,官方鏈接:https://docs.flutter.dev/add-to-app/android/project-setup?tab=with-android-studio
通過(guò)照貓畫(huà)虎的騷操作后统翩,發(fā)現(xiàn)根本沒(méi)有卵用,官方給的文檔畢竟玩不轉(zhuǎn)此洲。那么問(wèn)題來(lái)了厂汗,你通常時(shí)怎么使用 aar 包的?

打包

官方打包
flutter build aar
你想要的打包命令
flutter clean & flutter build aar --build-number 1.1.1 --no-profile --no-release

profile解釋?zhuān)?/strong>在 Android 開(kāi)發(fā)中呜师,"profile" 版本通常指的是應(yīng)用的性能分析版本娶桦。這種版本允許開(kāi)發(fā)者在設(shè)備上運(yùn)行應(yīng)用程序以進(jìn)行性能分析和調(diào)試。這種版本通常會(huì)包含更多的日志記錄和性能分析工具汁汗,用于分析應(yīng)用在不同設(shè)備上的性能表現(xiàn)衷畦,并檢測(cè)可能存在的性能問(wèn)題。
Flutter 構(gòu)建過(guò)程中的 --no-profile 標(biāo)志會(huì)指示系統(tǒng)不生成這種性能分析版本知牌。這樣做是為了加快構(gòu)建過(guò)程并減小生成的輸出文件大小祈争。
通過(guò)以上命令,你會(huì)在“/your_flutter/build/host/outputs/repo”目錄下拿到 aar包角寸,如下:

flutter_debug.aar

那么菩混,aar包怎么用呢?

aar 包導(dǎo)入推薦策略

策略一:官方推薦導(dǎo)入

官方 aar 導(dǎo)入

配置完成你會(huì)發(fā)現(xiàn)扁藕,flutter 引擎的依賴(lài)依賴(lài)項(xiàng)一個(gè)也拿不到沮峡,就是下面這個(gè)幾個(gè)貨:
flutter 引擎依賴(lài)項(xiàng)

你肯定覺(jué)得臥槽了:
是的,兵法上沒(méi)寫(xiě)亿柑,但是打仗的時(shí)候要用帖烘。馬謖就是這么丟街亭的~
那《兵法》上咋說(shuō)的呢?
兵法上說(shuō)橄杨,你按照我說(shuō)的運(yùn)行完 flutter build aar 命令秘症,配置你的 project 依賴(lài)絕對(duì)沒(méi)問(wèn)題∈浇茫看看這句無(wú)恥的話:
兵法云

說(shuō)無(wú)恥乡摹,其實(shí)有些過(guò)分了。畢竟人家寫(xiě)兵法的人言簡(jiǎn)意深來(lái)著~
First of all采转,這兵法主要是給資本主義市場(chǎng)使用的
Secondly聪廉,為了迎合中國(guó)市場(chǎng)瞬痘,也告訴你要配置中國(guó)鏡像

中國(guó)市場(chǎng)

問(wèn)題就在這里,切換鏡像之后,flutter 模塊的打包aar的依賴(lài)沒(méi)有被上傳到指定的服務(wù)端。
墻外:
執(zhí)行flutter build aar 后瓣铣,在'/Users/edwin/edwin/MeiTuanEdwin/my_flutter/build/host/outputs/repo文件夾下面會(huì)生成aar包和pom文件,后者標(biāo)示了flutter引擎依賴(lài)項(xiàng)津辩,如下:
repo目錄信息

flutter_debug-1.1.4.pom文件里存放的是依賴(lài)項(xiàng)信息,如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- This module was also published with a richer model, Gradle metadata,  -->
  <!-- which should be used instead. Do not delete the following line which  -->
  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->
  <!-- that they should prefer consuming it instead. -->
  <!-- do_not_remove: published-with-gradle-metadata -->
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example.my_flutter</groupId>
  <artifactId>flutter_debug</artifactId>
  <version>1.1.4</version>
  <packaging>aar</packaging>
  <dependencies>
    <dependency>
      <groupId>io.flutter</groupId>
      <artifactId>flutter_embedding_debug</artifactId>
      <version>1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.flutter</groupId>
      <artifactId>armeabi_v7a_debug</artifactId>
      <version>1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.flutter</groupId>
      <artifactId>arm64_v8a_debug</artifactId>
      <version>1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.flutter</groupId>
      <artifactId>x86_64_debug</artifactId>
      <version>1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.flutter</groupId>
      <artifactId>x86_debug</artifactId>
      <version>1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

這些都是Gradle發(fā)布的Meta data容劳,最終被發(fā)布到storage.googleapis.com 這個(gè)服務(wù)端喘沿,下面的鏈接試試
https://storage.googleapis.com/download.flutter.io
上面提到flutter庫(kù)在編譯是就已經(jīng)做了架構(gòu)適配和引擎依賴(lài)構(gòu)建,原則上這些元數(shù)據(jù)都應(yīng)該被發(fā)布到服務(wù)端竭贩,這樣才能通過(guò)dependencies配置依賴(lài)獲取相應(yīng)的aar包蚜印,事實(shí)上根本沒(méi)有我們想要下載的依賴(lài)包,搜索唯一標(biāo)記 9064459a8b0dcd32877107f6002cc429a71659d1(以編譯生成POM里的version為準(zhǔn)) 無(wú)法得到想要的依賴(lài)留量。

storage.googleapis.com/download.flutter.io

墻內(nèi)
配置如下窄赋,flutter相關(guān)配置如下:
鏡像配置

根據(jù)官方指導(dǎo),domain切換后楼熄,源文件會(huì)發(fā)布到 https://storage.flutter-io.cn/download.flutter.io 點(diǎn)擊進(jìn)入這個(gè)站點(diǎn)忆绰,同樣找不到對(duì)應(yīng)的POM文件中生成的依賴(lài)信息
storage.flutter-io.cn/download.flutter.io

這就造成了我們?cè)谑褂胊ar包時(shí),需要逐個(gè)引入POM文件中的依賴(lài)項(xiàng)孝赫,進(jìn)行引擎依賴(lài)配置:

    implementation 'io.flutter:flutter_embedding_debug:1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1'
    implementation 'io.flutter:armeabi_v7a_debug:1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1'
    implementation 'io.flutter:arm64_v8a_debug:1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1'
    implementation 'io.flutter:x86_64_debug:1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1'
    implementation 'io.flutter:x86_debug:1.0.0-9064459a8b0dcd32877107f6002cc429a71659d1'

我自然是不愿意搞這么多配置的较木,關(guān)于aar包源數(shù)據(jù)發(fā)布上傳這部分红符,我耗了很久反復(fù)閱讀官方文檔青柄,并且在網(wǎng)上查詢相關(guān)資料,得到如下提示:
1)Stack Overflow
給出的策略预侯,是直接更改flutter SDK包里的 aar_init_script.gradle文件致开,很多大廠也是這么干的
https://stackoverflow.com/questions/75577692/any-way-to-upload-flutter-local-aar-maven-repository-to-remote-maven-repository
2)華為開(kāi)發(fā)者聯(lián)盟
分析的很透徹,最后希望你通過(guò)腳本實(shí)現(xiàn)萎馅,一言以蔽之:通過(guò)執(zhí)行 flutter build aar -v 查看flutter build aar 的執(zhí)行秘密双戳。
https://blog.csdn.net/Ever69/article/details/120494115
我還真就這么干了,好奇心害死貓糜芳§酰咳~~~
3)官方指導(dǎo)文檔真坑爹
在我們運(yùn)行flutter build aar時(shí),其實(shí)他是借助于.android項(xiàng)目配置Gradle或者Gradle Wrapper能力峭竣,其核心工作在
flutter-SDK-Dir/flutter/packages/flutter_tools/gradle/aar_init_script.gradle文件中完成aar發(fā)布工作塘辅,具體邏輯如下:

publishing aar

aar 文檔相關(guān)Gradle 源數(shù)據(jù)都在本地repo庫(kù)里,所以通過(guò)Maven依賴(lài)是斷斷無(wú)法獲取的皆撩。

綜上所述扣墩,官方文檔給出的關(guān)于aar的配置哲银,是指導(dǎo)開(kāi)發(fā)人員使用發(fā)布到本地的aar文件的方法,而且還缺少引擎依賴(lài)的相關(guān)指導(dǎo)
為了能夠簡(jiǎn)化使用flutter模塊 aar包的引入流程呻惕,我們需要有自己的Maven私服荆责,并且將flutter項(xiàng)目的aar包及相關(guān)源文件,發(fā)布到云端進(jìn)行更新和迭代亚脆。這里選擇阿里云效做院,完成這個(gè)任務(wù)

發(fā)布AAR包到Maven私服

云端選擇阿里云效 ,打開(kāi)阿里云的云效Packages官網(wǎng):
https://packages.aliyun.com/maven
你會(huì)發(fā)現(xiàn)阿里云提供的免費(fèi)私有Maven庫(kù)服務(wù)型酥,并且介紹了Gradle 7.0前后如何發(fā)布項(xiàng)目文檔至私有倉(cāng)庫(kù)山憨。
1)更改aar_init_script.gradle文件

image.png

這個(gè)侵入性比較強(qiáng),而且每個(gè)人都要更改自己的SDK包弥喉。哪天編譯腳本升級(jí)了郁竟,大家一起抓瞎~
2)在flutter項(xiàng)目中直接發(fā)布
As we all know,aar包之所以能夠通過(guò)Gradle編譯成功由境,是依賴(lài)其my_flutter/.android項(xiàng)目棚亩,該項(xiàng)目中的有一個(gè)Flutter庫(kù)Module,是執(zhí)行flutter build aar時(shí)自動(dòng)生成的虏杰。通過(guò)flutter build aar -v 可以很清晰的看到讥蟆,編譯過(guò)程中,flutter 相關(guān)產(chǎn)物都放到了.android/Flutter模塊的build文件夾下纺阔,看編譯日志:

Starting process 'command '/Users/edwin/Library/flutter/bin/flutter''. 
Working directory: /Users/edwin/edwin/MeiTuanEdwin/my_flutter 
Command: /Users/edwin/Library/flutter/bin/flutter  #Flutter 工具的路徑
 --verbose #啟用詳細(xì)輸出瘸彤,以便查看更多構(gòu)建信息
 assemble #執(zhí)行組裝操作,即構(gòu)建過(guò)程
 --no-version-check #禁用版本檢查笛钝,F(xiàn)lutter 不會(huì)檢查是否有新版本
 --depfile /Users/edwin/edwin/MeiTuanEdwin/my_flutter/.android/Flutter/build/intermediates/flutter/debug/flutter_build.d #指定依賴(lài)文件的路徑
 --output /Users/edwin/edwin/MeiTuanEdwin/my_flutter/.android/Flutter/build/intermediates/flutter/debug #指定輸出目錄的路徑
 -dTargetFile=lib/main.dart #指定入口文件的路徑
 -dTargetPlatform=android #指定目標(biāo)平臺(tái)為 Android
 -dBuildMode=debug #指定構(gòu)建模式為調(diào)試模式
 -dTrackWidgetCreation=true #啟用 Flutter 的控件創(chuàng)建跟蹤
 debug_android_application

看明白了吧质况,該命令的目標(biāo)是構(gòu)建一個(gè)用于調(diào)試的 Android 版本的 Flutter 應(yīng)用程序,output命令指定了輸出目錄玻靡。
我們看看output文件夾所在的環(huán)境:


aar包中間產(chǎn)物

這說(shuō)明我們的 Flutter 模塊就是用來(lái)生成 aar 包的對(duì)應(yīng)資源而建立的结榄,那我們完全可以在 Flutter 項(xiàng)目的 build.gradle 文件中添加一個(gè) task 用于發(fā)布 aar 包,發(fā)布任務(wù)通過(guò)publish.gradle文件完成囤捻。實(shí)現(xiàn)如下:

// publish flutter-debug.aar
//plugins {
//    id 'java'
//    // Gradle 7.0+ 版本
//    id 'maven-publish'
//}

group 'com.example.my_flutter'
version '1.1.4'
def artifactIdStr = 'flutter_debug'

apply plugin: 'maven-publish'
task comps { // 讓我們看看它有哪些組件:
    afterEvaluate {
        println("Components: " + components*.name)  // 代碼 1
    }
}
def directoryToPublish = "$rootDir.parentFile/build/host/outputs/repo/com/example/my_flutter/flutter_debug/$project.version"
afterEvaluate { // 代碼 2
    publishing {
        publications {
            flutter(MavenPublication) { // 代碼 3
                from components.debug
                println("groupId = " + groupId + ",artifactId = " + artifactIdStr + ",version = " + version + ",buildDir = " + buildDir)
                groupId = "$project.group" // 代碼 4
                artifactId = artifactIdStr
                version = "$project.version"

//                artifact "$buildDir/outputs/aar/flutter-debug.aar" //aar artifact you want to publish
                // artifact "$directoryToPublish/${artifactIdStr}-${project.version}.aar"
                // artifact "$directoryToPublish/${artifactIdStr}-${project.version}.module"
                // artifact "$directoryToPublish/${artifactIdStr}-${project.version}.pom"

//                artifact("$directoryToPublish/${artifactIdStr}-${project.version}.aar") /*{
//                    classifier 'aar' // 使用 'aar' 作為分類(lèi)器
//                }*/
//                artifact("$directoryToPublish/${artifactIdStr}-${project.version}.module") /*{
//                    classifier 'module' // 使用 'module' 作為分類(lèi)器
//                }*/
//                artifact("$directoryToPublish/${artifactIdStr}-${project.version}.pom")/* {
//                    classifier 'pom' // 使用 'pom' 作為分類(lèi)器
//                    extension 'pom' // 設(shè)置為 'pom' 類(lèi)型
//                }*/
            }
        }
        repositories { // 代碼 5
//            maven {
//                url = 'https://packages.aliyun.com/maven/repository/2443959-release-V0Shv7/'
//                credentials {
//                    username = '##############'
//                    password = '*****************'
//                }
//            }
            maven {
                url = 'https://packages.aliyun.com/maven/repository/2443959-snapshot-5T0GnA/'
                credentials {
                    username = '###############'
                    password = '******************'
                }
            }
        }
    }
}

其中臼朗, 代碼 1 處的 components*.name 用于確認(rèn)當(dāng)前Gradle 會(huì)構(gòu)建那些組件用于發(fā)布,輸出結(jié)果如下:

Components

從打印結(jié)果來(lái)看蝎土,可以構(gòu)建 debug视哑、profile、release 三種組件及其all 組合組件誊涯,我們使用 debug 版本
代碼 2 處挡毅,評(píng)估之后開(kāi)始進(jìn)入發(fā)布工作,依賴(lài) maven-publish 插件進(jìn)行發(fā)布醋拧,gradle 要配置成 7.2 以上的版本
代碼 3 處慷嗜,定義了一個(gè) MavenPublication淀弹,命名為 "flutter"。from components.debug 表示將 MavenPublication 的內(nèi)容從 Gradle 構(gòu)建中的 components.debug 組件中獲取庆械。這里的MavenPublication包含了該組件的輸出薇溃,例如 AAR 文件、POM 文件等缭乘。這是為了將 Flutter 模塊構(gòu)建的輸出發(fā)布到 Maven 倉(cāng)庫(kù)
代碼 4處配置了 GVA 用于唯一標(biāo)識(shí)當(dāng)前AAR 包沐序,方便其他項(xiàng)目通過(guò) Maven 或gradle 進(jìn)行依賴(lài),如下:
GVA

當(dāng)然堕绩,現(xiàn)在依賴(lài)還是無(wú)法完成策幼,因?yàn)閍ar 包要發(fā)布到遠(yuǎn)程 Maven,
代碼 5 處就是用于配置遠(yuǎn)程服務(wù)地址的奴紧,我們選用的是阿里云效服務(wù)特姐,用起來(lái)也算是麻煩+坑爹。
阿里云效:https://packages.aliyun.com/maven
如果玩不來(lái)黍氮,這里還有篇文章可以參考一如何把 library 發(fā)布到阿里云效
https://shawlaw.github.io/Fragmentary/publish-aar-to-aliyun-private-maven/publish-aar.html
發(fā)布任務(wù)編碼完成~
然后在 Flutter 模塊的 build.gradle 中 apply publish.gradle代碼如下:

def currentTask = gradle.startParameter.taskNames.join(" ")
println("currentTask =" + currentTask)
if (!currentTask.contains("Aar")) {
    apply from: "../../publish.gradle"
}

這段代碼的意思就是說(shuō)唐含,在 Flutter 項(xiàng)目編譯過(guò)程中,準(zhǔn)確的說(shuō)是評(píng)估的時(shí)候沫浆,把發(fā)布任務(wù)引入捷枯,等compile完成后執(zhí)行發(fā)布任務(wù)。
最后专执,
咱們?cè)賵?zhí)行一遍 flutter build aar 指令淮捆,發(fā)現(xiàn).android/Flutter/build/目錄下沒(méi)有生成 flutter 發(fā)布文件夾,
逗我呢本股?攀痊!
老鐵,這里還得執(zhí)行一遍 ./gradlew publish 命令痊末,執(zhí)行發(fā)布任務(wù)蚕苇,現(xiàn)在可以愉快的看到如下效果了:


阿里云效snapshot 庫(kù)

那么哩掺,現(xiàn)在趕快在另一個(gè)項(xiàng)目里試一下配置依賴(lài)吧凿叠。
首先在需要使用 aar包的項(xiàng)目根目錄下 root.gradle 中配置 Maven 庫(kù),參考如下:


Maven 庫(kù)地址

其次在需要使用 aar包的 module 中嚼吞,配置 AVG 依賴(lài)如下:
dependencies

現(xiàn)在同步代碼盒件,等待依賴(lài)完成。flutter 引擎的五個(gè)依賴(lài)如期而至:
Flutter 引擎依賴(lài)包

Shell腳本一鍵打包發(fā)布

等等老哥~
道理我都聽(tīng)明白了舱禽,上面的代碼還是要手動(dòng)更改 Flutter 項(xiàng)目中的 build.gradle 文件啊炒刁。更要命的是,如果執(zhí)行 flutter clean 清理一遍編譯工程誊稚,剛剛的文檔不都白瞎了了么翔始。你這是讓我哭嗎罗心?我說(shuō)老兄你等等,這不是上腳本呢嘛~

  1. 首先城瞎,我們把發(fā)布文件 publish.gradle 移動(dòng)到 my_flutter 項(xiàng)目根目錄下渤闷,并在根目錄下創(chuàng)建一個(gè)shell 腳本文件 apply_patch.sh,如下:


    root 目錄
  2. 然后脖镀,將 publish.gradle 導(dǎo)入到 Flutter 項(xiàng)目中的訴求未變飒箭,通過(guò) shell 腳本實(shí)現(xiàn)如下:
# 獲取當(dāng)前腳本所在目錄的絕對(duì)路徑
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")

# 切換到Flutter項(xiàng)目的根目錄
cd "$SCRIPT_DIR/.android/Flutter" || exit
# 在Flutter/build.gradle文件中執(zhí)行命令:
# 1)在android配置項(xiàng)前插入 apply 發(fā)布應(yīng)用
# 2)-i '.bak',備份原始文件
sed -i '.bak' '/^android {/i\
def currentTask = gradle.startParameter.taskNames.join(" ") \
println("currentTask =" + currentTask)\
if (!currentTask.contains("Aar")) {\
    apply from: "../../publish.gradle"\
}' "$SCRIPT_DIR/.android/Flutter/build.gradle"

通過(guò)腳本的形式蜒灰,將發(fā)布任務(wù)添加到 .android/Flutter 項(xiàng)目中弦蹂,腳本的含義都寫(xiě)在了注釋里。

  1. 插入完成后强窖,還要進(jìn)行發(fā)布工作凸椿,仍然通過(guò)腳本完成,如下:
# 切換到 ./android 目錄下執(zhí)行發(fā)布任務(wù)
cd "$SCRIPT_DIR/.android" || exit
./gradlew publish --info > publish.log 2>&1
if [ $? -ne 0 ]; then
    echo "發(fā)布任務(wù)失敵崮纭削饵!查看 publish.log 獲取更多信息。"
    exit 1
fi

這里把發(fā)布日志都打印在了 publish.log 文檔里未巫,如果發(fā)布失敗./gradlew publish --info 會(huì)提供詳細(xì)的失敗信息窿撬。

  1. 版本控制,aar 包是有自己的版本號(hào)的叙凡,比如 1.1.4劈伴。為了統(tǒng)一控制 version號(hào),不要手動(dòng)更改gradle 文件握爷,我們引入如下腳本:
# 替換 publish.gradle 中的版本號(hào)
OLD_VERSION=$(grep -o "version '[0-9]\+\.[0-9]\+\.[0-9]\+'" "$SCRIPT_DIR/publish.gradle" | head -n 1)
if [ -z "$OLD_VERSION" ]; then
  echo "無(wú)法獲取舊版本號(hào)跛璧!"
  exit 1
fi

sed -i'.bak' "s/$OLD_VERSION/version '$BUILD_NUMBER'/" "$SCRIPT_DIR/publish.gradle" || { echo "版本號(hào)替換失敗新啼!"; exit 1; }
  1. 合并所有腳本追城,得到完整的發(fā)布腳本apply_patch.sh,腳本如下
作為一個(gè)廣告引流專(zhuān)業(yè)戶燥撞,還是詳見(jiàn) github 代碼庫(kù)吧~
  1. 執(zhí)行 ./apply_patch.sh 腳本

到這里整個(gè)一鍵打包發(fā)布工作就完成了

FAQ

1.local.properties 類(lèi)似文件屬性配置時(shí)座柱,不要加引號(hào),不然在 gradle 文件中獲取到的值要處理


image.png
  1. gradle 的版本要配置成 7.5物舒,太高版本不見(jiàn)得穩(wěn)定色洞,而且低版本調(diào)用他的時(shí)候存在融合問(wèn)題:


    image.png
  2. gradle 和 ./gradlew 是兩碼事,前者是你在全局變量配置的 gradle 版本冠胯,后者是gradle wrapper 中配置的 gradle 版本7.5
  3. 腳本可能會(huì)有一些warning 提示火诸,沒(méi)有跑通不要隨意更改腳本,不然永遠(yuǎn)跑不起來(lái)了


    image.png

參考文獻(xiàn)

  1. my_flutter庫(kù)地址 https://github.com/hongyi0609/my_flutter
  2. GitHub庫(kù)地址 https://github.com/hongyi0609/MeiTuanEdwin
  3. flutter 國(guó)內(nèi)鏡像 https://flutter.cn/community/china?tab=macos
  4. aar 服務(wù)端 https://storage.googleapis.com/download.flutter.io
  5. 華為開(kāi)發(fā)者聯(lián)盟分析 https://blog.csdn.net/Ever69/article/details/120494115
  6. 私服配置 https://stackoverflow.com/questions/75577692/any-way-to-upload-flutter-local-aar-maven-repository-to-remote-maven-repository
  7. 阿里云效:https://packages.aliyun.com/maven
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荠察,一起剝皮案震驚了整個(gè)濱河市置蜀,隨后出現(xiàn)的幾起案子奈搜,更是在濱河造成了極大的恐慌,老刑警劉巖盯荤,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媚污,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡廷雅,警方通過(guò)查閱死者的電腦和手機(jī)耗美,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)航缀,“玉大人商架,你說(shuō)我怎么就攤上這事〗嬗瘢” “怎么了蛇摸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)灿巧。 經(jīng)常有香客問(wèn)我赶袄,道長(zhǎng),這世上最難降的妖魔是什么抠藕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任饿肺,我火速辦了婚禮,結(jié)果婚禮上盾似,老公的妹妹穿的比我還像新娘敬辣。我一直安慰自己,他們只是感情好零院,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布溉跃。 她就那樣靜靜地躺著,像睡著了一般告抄。 火紅的嫁衣襯著肌膚如雪撰茎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天打洼,我揣著相機(jī)與錄音龄糊,去河邊找鬼。 笑死拟蜻,一個(gè)胖子當(dāng)著我的面吹牛绎签,可吹牛的內(nèi)容都是我干的枯饿。 我是一名探鬼主播酝锅,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奢方!你這毒婦竟也來(lái)了搔扁?” 一聲冷哼從身側(cè)響起爸舒,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稿蹲,沒(méi)想到半個(gè)月后扭勉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苛聘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年涂炎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片设哗。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唱捣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出网梢,到底是詐尸還是另有隱情震缭,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布战虏,位于F島的核電站拣宰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烦感。R本人自食惡果不足惜巡社,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望手趣。 院中可真熱鬧重贺,春花似錦、人聲如沸回懦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怯晕。三九已至潜圃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舟茶,已是汗流浹背谭期。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吧凉,地道東北人隧出。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像阀捅,于是被迫代替她去往敵國(guó)和親胀瞪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容