環(huán)境
- Flutter:v1.9.1-hotfixes
- FlutterBoost:0.1.61
背景
Flutter可以算是當(dāng)下最火熱的新技術(shù)之一咱士,我現(xiàn)在所在團(tuán)隊(duì)也準(zhǔn)備將Flutter技術(shù)應(yīng)用到線上工程中阱州。
關(guān)于混合工程哥童,官方文檔其實(shí)寫(xiě)的已經(jīng)比較清楚了成肘,按著文檔走一般問(wèn)題不大纱耻,
但是有一點(diǎn)值得注意的是匪傍,F(xiàn)lutter工程引入的庫(kù)的gradle的buildTypes
要與原工程保持一致笋敞,如果不一致需要手工添加冠息。
進(jìn)入正題挪凑,現(xiàn)在Flutter官方默認(rèn)只提供armeabi-v7a、arm64-v8a逛艰、x86和x86-64躏碳,其中x86和x86-64是為模擬器準(zhǔn)備的。目前我們使用的SDK大部分只使用了armeabi架構(gòu)散怖,直接使用我們會(huì)遇見(jiàn)找不到libflutter.so菇绵,libapp.so
的情況,所以我們需要對(duì)FlutterSDK做一定的改造镇眷。
armeabi 適配
首先我們要了解下Flutter編譯產(chǎn)物咬最,因?yàn)椴煌姹井a(chǎn)物是不同的,這里我們只針對(duì)Flutter 1.9.1-hotfixes來(lái)說(shuō)欠动。除了資源文件之外永乌,F(xiàn)lutter打包會(huì)生成兩個(gè)非常重要的so庫(kù),他們分別是libflutter.so具伍,libapp.so
翅雏。其中libflutter.so
是Flutter的SDK產(chǎn)物而libapp.so
正是我們編寫(xiě)的dart文件的產(chǎn)物。默認(rèn)情況下人芽,這兩個(gè)文件都會(huì)出現(xiàn)在armeabi-v7a中望几,因此我們要作出對(duì)應(yīng)的改造。
libflutter.so
libflutter.so
位于FlutterSDK中萤厅,這里順帶提一句橄妆,除了這對(duì)不同CPU架構(gòu)衙伶,它還分為Debug版和Release版,它們的區(qū)別在于Debug是為JIT編譯方式打造的害碾,體積較大而Release是為AOT編譯方式打造的矢劲,體積很小。對(duì)libflutter.so
的改造慌随,只要將其移動(dòng)文件路徑即可芬沉,運(yùn)行以下腳本即可,此腳本來(lái)自美團(tuán)分享的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
移動(dòng)完了libflutter.so
之后我們打包發(fā)現(xiàn)丸逸,libapp.so
仍然會(huì)出現(xiàn)在armeabi-v7a中,所以第二部我們就是移動(dòng)libapp.so
剃袍。這個(gè)需要更改flutter.gradle
黄刚,我們?cè)?code>flutter.gradle的45行可以看到如下定義,它定義了我們的環(huán)境民效。
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的取值就是根據(jù)上述定義值。
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) {
...
所以結(jié)論很簡(jiǎn)單畏邢,只要將
private static final String ARCH_ARM32 = "armeabi-v7a";
改為
private static final String ARCH_ARM32 = "armeabi";
就可以完成對(duì)與libflutter.so
的移動(dòng)业扒。
aar打包
前期工作我們都做好了,打成aar就非常簡(jiǎn)單了
直接使用 flutter build aar --target-platform android-arm
打出來(lái)后可以解壓檢查下libflutter.so舒萎,libapp.so
是否都在armeabi文件夾下即可程储。
FlutterBoost
說(shuō)完了armeabi適配問(wèn)題,這里下說(shuō)下有關(guān)于有關(guān)于FlutterBoost的接入臂寝。這個(gè)東西接入有兩點(diǎn)要注意章鲤。
Support庫(kù)沖突
在主app內(nèi)加上即可,常規(guī)操作咆贬,強(qiáng)制統(tǒng)一support包的版本號(hào)
subprojects {
//為了統(tǒng)一support包的版本號(hào)
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編譯報(bào)錯(cuò)
注釋flutter.gradle第655行咏窿。因?yàn)榫幾g過(guò)程中,會(huì)去初始化插件項(xiàng)目的buildType下面的debug配置素征,而插件項(xiàng)目下并未配置debug集嵌,導(dǎo)致報(bào)錯(cuò)。
pluginProject.android.buildTypes {
profile {
initWith debug
}
}
總結(jié)
如果發(fā)現(xiàn)文章中有錯(cuò)誤或者有更好的解決方案歡迎指正留言御毅,當(dāng)然如果本篇文章幫助你解決了問(wèn)題根欧,也不要吝嗇你的感謝。謝謝各位端蛆。