Flutter可以算是當(dāng)下最火熱的新技術(shù)之一,我現(xiàn)在所在團(tuán)隊(duì)也準(zhǔn)備將Flutter技術(shù)應(yīng)用到線(xiàn)上工程中。
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括南崗網(wǎng)站建設(shè)、南崗網(wǎng)站制作、南崗網(wǎng)頁(yè)制作以及南崗網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,南崗網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到南崗省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!
關(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做一定的改造。
首先我們要了解下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 位于FlutterSDK中,這里順帶提一句,除了這對(duì)不同CPU架構(gòu),它還分為Debug版和Release版,它們的區(qū)別在于Debug是為JIT編譯方式打造的,體積較大而Release是為AOT編譯方式打造的,體積很小。對(duì) libflutter.so 的改造,只要將其移動(dòng)文件路徑即可,運(yùn)行以下腳本即可,此腳本來(lái)自美團(tuán)分享的Flutter文章。
移動(dòng)完了 libflutter.so 之后我們打包發(fā)現(xiàn), libapp.so 仍然會(huì)出現(xiàn)在armeabi-v7a中,所以第二部我們就是移動(dòng) libapp.so 。這個(gè)需要更改 flutter.gradle ,我們?cè)?flutter.gradle 的45行可以看到如下定義,它定義了我們的環(huán)境。
在524行我們可以看到,abiValue的取值就是根據(jù)上述定義值。
所以結(jié)論很簡(jiǎn)單,只要將
private static final String ARCH_ARM32 = "armeabi-v7a";
改為
private static final String ARCH_ARM32 = "armeabi";
就可以完成對(duì)與 libflutter.so 的移動(dòng)。
前期工作我們都做好了,打成aar就非常簡(jiǎn)單了
直接使用 flutter build aar --target-platform android-arm
打出來(lái)后可以解壓檢查下 libflutter.so,libapp.so 是否都在armeabi文件夾下即可。
說(shuō)完了armeabi適配問(wèn)題,這里下說(shuō)下有關(guān)于有關(guān)于FlutterBoost的接入。這個(gè)東西接入有兩點(diǎn)要注意。
在主app內(nèi)加上即可,常規(guī)操作,強(qiáng)制統(tǒng)一support包的版本號(hào)
注釋flutter.gradle第655行。因?yàn)榫幾g過(guò)程中,會(huì)去初始化插件項(xiàng)目的buildType下面的debug配置,而插件項(xiàng)目下并未配置debug,導(dǎo)致報(bào)錯(cuò)。
如果發(fā)現(xiàn)文章中有錯(cuò)誤或者有更好的解決方案歡迎指正留言,當(dāng)然如果本篇文章幫助你解決了問(wèn)題,也不要吝嗇你的感謝。謝謝各位。
APP集成百度地圖后,開(kāi)發(fā)者模式直接連接真機(jī)可以打開(kāi)地圖,打包成apk后安裝,應(yīng)用直接閃退
驗(yàn)證了3個(gè)環(huán)境
a、Android 6.0
b、Android 9.0
c、Android 8.1
真機(jī)USB線(xiàn)連接
選擇Logcat,將日志級(jí)別選擇未error,日志太多,或者用自定義的過(guò)濾規(guī)則
先清除日志,后迅速點(diǎn)擊手機(jī)上的APP,觀(guān)察日志
發(fā)現(xiàn)需要監(jiān)控的APP報(bào)出異常信息,這個(gè)很關(guān)鍵,有異常就是有線(xiàn)索,couldn't find "libflutter.so"
這個(gè)時(shí)候問(wèn)度娘就可以了
未明白具體的原因,臨時(shí)先解決了問(wèn)題,馬克一下
基于flutter版本1.9.1,低版本區(qū)別對(duì)待。
lib目錄,libflutter.so文件,三個(gè)目錄armeabi-v7a,x86_64和x86,支持arm平臺(tái)32和x86的32和64。
asset目錄,新增flutter_asset目錄,三個(gè)文件,dart產(chǎn)物。
lib目錄,libflutter.so文件,兩個(gè)目錄armeabi-v7,arm64-v8a,支持arm平臺(tái)32和64。
asset目錄,新增flutter_asset目錄。
在release模式,libapp.so替代flutter老版本的一些dart產(chǎn)物,如下。
flutter命令打包生成產(chǎn)物,flutter命令腳本會(huì)調(diào)用dart命令。
dart的編譯模式:
kernel snapshot 模式,開(kāi)發(fā)階段,isolate_snapshot_data,vm_snapshot_data,kernel_blob_bin是業(yè)務(wù)數(shù)據(jù)。
core jit,
生產(chǎn)階段,dart的一種二進(jìn)制模式,這是一種aot模式,vm和isolate。
任重而道遠(yuǎn)
只能說(shuō) Flutter 確實(shí)很強(qiáng)大
ffmpeg 插件,文檔沒(méi)給出如何給視頻添加水印, 但是給出了執(zhí)行命令的方法演示, 這就足夠了。
添加一個(gè)水印:
String command = "-i " + inputVideoPath +
" -i "+waterMarkPath+" -filter_complex overlay "+
outVideoPath+"";
添加多個(gè)水印命令:
String command = "-i " + inputVideoPath +
" -i "+waterMarkPath2+" -i "+waterMarkPath+
" -filter_complex overlay=10:10,overlay=5:5 "+
outVideoPath+"";
將視頻轉(zhuǎn)換成小尺寸視頻:
String command = "-i " + inputVideoPath +" -b:v 10000k -s 216x384 "+ outVideoPath+"";
如果碰到 App crash with error message: couldn't find "libmobileffmpeg_abidetect.so"
執(zhí)行
flutter clean
flutter doctor -v
新建一個(gè)Flutter工程,android模塊。
1,只有一個(gè)Activity組件,它是Dart層繪制Widget的容器。
2,Application配置FlutterApplication。
應(yīng)用Application配置io.flutter.app.FlutterApplication類(lèi),App首次啟動(dòng)時(shí),初始化。
調(diào)用FlutterMain.startInitialization()方法。
initConfig方法,從AndroidManfest.xml配置的applicaion節(jié)點(diǎn)獲取meta-data數(shù)據(jù),初始化以下默認(rèn)值。
這些值都是使用中用到的name,例如,抽取apk中asset資源時(shí),flutter_assets打包目錄,打包產(chǎn)物data名稱(chēng)。
initResources方法, 初始化資源。
在Flutter打包apk的asset目錄下,包括fluttter_asset目錄/資源項(xiàng),將資源從apk中抽取,保存在 Context.getDir("flutter", 0) 目錄下。
/data/user/0/包名/app_flutter目錄。
在目錄中創(chuàng)建一個(gè)時(shí)間戳文件,根據(jù)apk版本和包信息記錄的lastUpdateTime更新時(shí)間,第二次啟動(dòng)時(shí),若apk未更新,不需要再次抽取。
加載so庫(kù),libflutter.so,System.loadLibrary()。
主頁(yè)面繼承FlutterActivity,配置啟動(dòng)模式singleTop。
FlutterActivity類(lèi)在io.flutter.app包, (區(qū)別io.flutter.embedding.android包), 組件生命周期委托給FlutterActivityDelegate類(lèi)。
組件啟動(dòng),onCreate方法。
FlutterMain.ensureInitializationComplete方法,確保資源成功抽取完成,創(chuàng)建FlutterView視圖(io.flutter.view),繼承SurfaceView類(lèi),setContentView方法,設(shè)置組件主布局即FlutterView視圖。
最后,根據(jù)Bundle路徑,runBundle()加載運(yùn)行,
調(diào)用FlutterView的runFromBundle方法,入口點(diǎn)在dart的main方法,
通過(guò)FlutterNativeView,調(diào)用FlutterJNI的native方法。
nativeRunBundleAndSnapshotFromLibrary方法。
任重而道遠(yuǎn)
新聞標(biāo)題:flutterso,Flutter搜索跳轉(zhuǎn)
網(wǎng)頁(yè)URL:http://chinadenli.net/article6/dsiesog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站設(shè)計(jì)、定制網(wǎng)站、App開(kāi)發(fā)、軟件開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)