Flutter Android端集成排坑 - armeabi 適配 & FlutterBoost

環境

  • Flutter:v1.9.1-hotfixes
  • FlutterBoost:0.1.61

背景

Flutter可以算是當下最火熱的新技術之一,我現在所在團隊也準備將Flutter技術應用到線上工程中。
關于混合工程,官方文檔其實寫的已經比較清楚了,按著文檔走一般問題不大,

文檔:將 Flutter module 集成到 Android 項目

但是有一點值得注意的是,Flutter工程引入的庫的gradle的buildTypes要與原工程保持一致,如果不一致需要手工添加。

進入正題,現在Flutter官方默認只提供armeabi-v7a、arm64-v8a、x86和x86-64,其中x86和x86-64是為模擬器準備的。目前我們使用的SDK大部分只使用了armeabi架構,直接使用我們會遇見找不到libflutter.so,libapp.so的情況,所以我們需要對FlutterSDK做一定的改造。

armeabi 適配

首先我們要了解下Flutter編譯產物,因為不同版本產物是不同的,這里我們只針對Flutter 1.9.1-hotfixes來說。除了資源文件之外,Flutter打包會生成兩個非常重要的so庫,他們分別是libflutter.so,libapp.so。其中libflutter.so是Flutter的SDK產物而libapp.so正是我們編寫的dart文件的產物。默認情況下,這兩個文件都會出現在armeabi-v7a中,因此我們要作出對應的改造。

libflutter.so與libapp.so

libflutter.so

libflutter.so位于FlutterSDK中,這里順帶提一句,除了這對不同CPU架構,它還分為Debug版和Release版,它們的區別在于Debug是為JIT編譯方式打造的,體積較大而Release是為AOT編譯方式打造的,體積很小。對libflutter.so的改造,只要將其移動文件路徑即可,運行以下腳本即可,此腳本來自美團分享的Flutter文章。

cd $FLUTTER_ROOT/bin/cache/artifacts/engine
for arch in android-arm android-arm-profile android-arm-release; do
  pushd $arch
  cp flutter.jar flutter-armeabi-v7a.jar # 備份
  unzip flutter.jar lib/armeabi-v7a/libflutter.so
  mv lib/armeabi-v7a lib/armeabi
  zip -d flutter.jar lib/armeabi-v7a/libflutter.so
  zip flutter.jar lib/armeabi/libflutter.so
  popd
done

libapp.so

移動完了libflutter.so之后我們打包發現,libapp.so仍然會出現在armeabi-v7a中,所以第二部我們就是移動libapp.so。這個需要更改flutter.gradle,我們在flutter.gradle的45行可以看到如下定義,它定義了我們的環境。

class FlutterPlugin implements Plugin<Project> {
    // The platforms that can be passed to the `--Ptarget-platform` flag.
    private static final String PLATFORM_ARM32 = "android-arm";
    private static final String PLATFORM_ARM64 = "android-arm64";
    private static final String PLATFORM_X86 = "android-x86";
    private static final String PLATFORM_X86_64 = "android-x64";

    // The ABI architectures.
    private static final String ARCH_ARM32 = "armeabi-v7a";
    private static final String ARCH_ARM64 = "arm64-v8a";
    private static final String ARCH_X86 = "x86";
    private static final String ARCH_X86_64 = "x86_64";

    // Maps platforms to ABI architectures.
    private static final Map PLATFORM_ARCH_MAP = [
            (PLATFORM_ARM32) : ARCH_ARM32,
            (PLATFORM_ARM64) : ARCH_ARM64,
            (PLATFORM_X86)   : ARCH_X86,
            (PLATFORM_X86_64): ARCH_X86_64,
    ]

在524行我們可以看到,abiValue的取值就是根據上述定義值。

 def compileTasks = targetPlatforms.collect { targetArch ->
                String abiValue = PLATFORM_ARCH_MAP[targetArch]
                String taskName = toCammelCase(["compile", FLUTTER_BUILD_PREFIX, variant.name, targetArch.replace('android-', '')])
                FlutterTask compileTask = project.tasks.create(name: taskName, type: FlutterTask) {
                ...

所以結論很簡單,只要將

private static final String ARCH_ARM32 = "armeabi-v7a";

改為

private static final String ARCH_ARM32 = "armeabi";

就可以完成對與libflutter.so的移動。

aar打包

前期工作我們都做好了,打成aar就非常簡單了
直接使用 flutter build aar --target-platform android-arm
打出來后可以解壓檢查下libflutter.so,libapp.so是否都在armeabi文件夾下即可。

FlutterBoost

說完了armeabi適配問題,這里下說下有關于有關于FlutterBoost的接入。這個東西接入有兩點要注意。

Support庫沖突

在主app內加上即可,常規操作,強制統一support包的版本號

 subprojects {
        //為了統一support包的版本號
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.android.support'
                        && !details.requested.name.contains('multidex') ) {
                    details.useVersion "27.1.0"
                }
            }
        }
    }

flutter.gradle編譯報錯

注釋flutter.gradle第655行。因為編譯過程中,會去初始化插件項目的buildType下面的debug配置,而插件項目下并未配置debug,導致報錯。

 pluginProject.android.buildTypes {
        profile {
                initWith debug
                }
 }

總結

如果發現文章中有錯誤或者有更好的解決方案歡迎指正留言,當然如果本篇文章幫助你解決了問題,也不要吝嗇你的感謝。謝謝各位。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容