分析 flutter 打包流程及 aar 產(chǎn)物,并將最終的 aar 集成到現(xiàn)有工程(Android 篇)

本文運(yùn)行環(huán)境說(shuō)明: Flutter (Channel unknown, v1.9.1+hotfix.2, on Mac OS X 10.12.6 16G2128, locale zh-Hans-CN)

創(chuàng)建 flutter module 工程

Flutter create -t module flutter_library
  • 這種方式創(chuàng)建的 flutter 項(xiàng)目常常用來(lái)集成到現(xiàn)有 Android 或 ios 工程中爱沟,對(duì)于 Android 工程抹竹,我們希望的是將 flutter 工程打包成一個(gè) aar 文件,放入 Android 項(xiàng)目中繼承坚芜,本文就介紹一下打包集成方式屉佳。

將 flutter 打包成 aar

打包命令分析

從 flutter 1.9.1開(kāi)始谷朝,支持直接打包為 aar,命令為

flutter build aar

如果想輸出詳細(xì)打包過(guò)程日志忘古,可以在后面加上 -v 參數(shù)

使用 which flutter 命令可以找到 flutter 的命令文件徘禁,查看該文件,能找到真正執(zhí)行的命令髓堪。不是很清楚 shell 腳本的話看起來(lái)比較費(fèi)勁送朱,這里直接說(shuō)結(jié)論吧:命令采用了 dart 執(zhí)行環(huán)境,編譯打包邏輯在 flutter_tools.snapshot 中干旁。dart 的 snapshot 相當(dāng)于 Java 的 jar驶沼,因此,一個(gè) snapshot 在執(zhí)行的時(shí)候争群,必然有它的執(zhí)行入口回怜,也就是類(lèi)似 main 函數(shù)的東西。這里的入口换薄,正是 flutter/packages/flutter_tools/bin/flutter_tools.dart 玉雾,其 main 函數(shù)如下:

void main(List<String> args) {
  executable.main(args);
}

進(jìn)入 executable.dart,在 main 方法中可以看到創(chuàng)建了一堆 xxxCommand 對(duì)象轻要,顯然這是各種命令對(duì)應(yīng)的類(lèi)复旬,我們暫時(shí)只需要關(guān)心 flutter build 命令匹配的 BuildCommand() 方法。

class BuildCommand extends FlutterCommand {
  BuildCommand({bool verboseHelp = false}) {
    addSubcommand(BuildAarCommand(verboseHelp: verboseHelp));
    addSubcommand(BuildApkCommand(verboseHelp: verboseHelp));
    addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp));
    addSubcommand(BuildAotCommand(verboseHelp: verboseHelp));
    addSubcommand(BuildIOSCommand());
    addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp));
    addSubcommand(BuildWebCommand());
    addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp));
    addSubcommand(BuildLinuxCommand());
    addSubcommand(BuildWindowsCommand());
    addSubcommand(BuildFuchsiaCommand(verboseHelp: verboseHelp));
  }

  @override
  final String name = 'build';

  @override
  final String description = 'Flutter build commands.';

  @override
  Future<FlutterCommandResult> runCommand() async => null;
}

abstract class BuildSubCommand extends FlutterCommand {
  BuildSubCommand() {
    requiresPubspecYaml();
  }
}

這里定義的一系列子命令冲泥,正是對(duì)應(yīng)了我們運(yùn)行 flutter build -h 所看到的內(nèi)容驹碍。
通過(guò)與父類(lèi)的一系列調(diào)用關(guān)系,最終調(diào)用子類(lèi)真正的 runCommand 的方法凡恍,由于這里執(zhí)行的是 build aar志秃,所以子類(lèi)是BuildAarCommand。
一番追蹤之后嚼酝,你會(huì)發(fā)現(xiàn)最終還是調(diào)用了 android 的 gradlew assembleRelease 命令浮还,只是加入了一些參數(shù)而已。然后闽巩,繼續(xù)追蹤 flutter 工程的 .android 目錄下的 gradle 文件碑定。
.android 目錄下有兩個(gè)重要的 gradle 文件流码,一個(gè)是 include_flutter.groovy又官,另一個(gè)是 Flutter 目錄下的 build.gradle延刘。
前者的主要作用是編譯 Flutter 目錄和插件,后者檢查了 flutter sdk 版本信息六敬,然后進(jìn)入了 flutter.gradle碘赖,它是一個(gè) gradle 插件,里面實(shí)現(xiàn)了一些 task 以及設(shè)定了必要的依賴(lài)外构;
至于后續(xù)的打包過(guò)程還沒(méi)有搞清楚普泡,各位客官自己研究分析吧。

打包產(chǎn)物分析

打包命令運(yùn)行后生成的產(chǎn)物被放在 build 目錄下的不同文件夾里审编,我們主要關(guān)心 aar撼班,它被放在 build/host/outputs/repo 文件夾,包括 flutter 主項(xiàng)目及每一個(gè) flutter 插件對(duì)應(yīng)的 aar垒酬,分別放在以主項(xiàng)目或插件包名對(duì)應(yīng)路徑下砰嘁。介紹如下:

  • flutter_release.aar:類(lèi)似這個(gè)名稱(chēng)的文件是 flutter 主項(xiàng)目對(duì)應(yīng)生成的 aar,解壓 aar 文件勘究,里面的內(nèi)容介紹:
    - jni:生成有 libflutter.so 和 libapp.so矮湘,這兩個(gè) Flutter 庫(kù)和引擎、Dart VM 以及 dart 業(yè)務(wù)代碼(這里指你自己寫(xiě)的代碼邏輯)編譯后的產(chǎn)物口糕,從此可以看出缅阳,F(xiàn)lutter 庫(kù)和引擎會(huì)被打包成 so 文件并最終匯總到 apk 中,以給 flutter 提供運(yùn)行時(shí)環(huán)境景描;
    - assets:存放了 flutter 項(xiàng)目的資源文件十办,例如圖片、自定義字體等超棺;
    - libs: 含有 flatter.jar向族,主要是官方已經(jīng)寫(xiě)好的、flutter 與 Android 通信的邏輯類(lèi)说搅,比如 FlutterActivity炸枣、MethodCall 等;
    - .classes.jar: Flutter.java弄唧、FlutterFragment.java适肠、GeneratedPluginRegistrant.java的 class 文件,其實(shí)就是對(duì)應(yīng) .android/Flutter/src 目錄下的代碼;

  • 其他包里的 aar: 對(duì)應(yīng)的是插件打包成的 aar候引,解壓該 aar 文件侯养,會(huì)看到插件的 Android 部分源碼打在了 aar 里的 classes.jar 中,資源文件放在了 res 目錄下澄干;

將所有產(chǎn)物匯總成一個(gè) aar

  • 方便起見(jiàn)逛揩,最好是將上面的主工程 aar 和每個(gè)插件的 aar 一起打到一個(gè) aar 中柠傍,這個(gè) aar 就可以放在其他 Android 工程中使用了;
  • 如果想將多個(gè) aar 匯總成一個(gè) aar辩稽,可以借助 fat-aar-android惧笛;

  • 清除緩存: 命令:flutter clean,這樣會(huì)清楚 build 目錄逞泄,另外要說(shuō)明的是患整,這樣也會(huì)清空 .android 目錄,當(dāng)執(zhí)行 flutter packages get 后又會(huì)自動(dòng)生成 .android 目錄喷众;

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末各谚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子到千,更是在濱河造成了極大的恐慌昌渤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憔四,死亡現(xiàn)場(chǎng)離奇詭異膀息,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)加矛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)履婉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人斟览,你說(shuō)我怎么就攤上這事毁腿。” “怎么了苛茂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵已烤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我妓羊,道長(zhǎng)胯究,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任躁绸,我火速辦了婚禮裕循,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘净刮。我一直安慰自己剥哑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布淹父。 她就那樣靜靜地躺著株婴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暑认。 梳的紋絲不亂的頭發(fā)上困介,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天大审,我揣著相機(jī)與錄音,去河邊找鬼座哩。 笑死徒扶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的八回。 我是一名探鬼主播酷愧,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缠诅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乍迄,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤管引,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后闯两,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體褥伴,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年漾狼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了重慢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逊躁,死狀恐怖似踱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稽煤,我是刑警寧澤核芽,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站酵熙,受9級(jí)特大地震影響轧简,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匾二,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一哮独、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧察藐,春花似錦皮璧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浸须,卻和暖如春惨寿,著一層夾襖步出監(jiān)牢的瞬間邦泄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工裂垦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顺囊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓蕉拢,卻偏偏與公主長(zhǎng)得像特碳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晕换,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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