相對(duì)于iOS開(kāi)發(fā),F(xiàn)lutter的布局更具有靈活性,每個(gè)頁(yè)面設(shè)計(jì)都不一樣,相同頁(yè)面可選擇的布局方式也不一樣,如果單純的說(shuō)應(yīng)該如何去布局,我覺(jué)得不現(xiàn)實(shí),大家可以參考下 Flutter官方的布局教程 。接下來(lái),筆者,通過(guò)項(xiàng)目中的一個(gè)頁(yè)面,來(lái)一步一步的拆解布局的流程。整個(gè)過(guò)程,基本上按照拆解、組件封裝、具體布局這三步來(lái)的。
創(chuàng)新互聯(lián)公司專注于八步企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),商城開(kāi)發(fā)。八步網(wǎng)站建設(shè)公司,為八步等地區(qū)提供建站服務(wù)。全流程按需定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
根據(jù)設(shè)計(jì)圖,可以看出整體可以分成兩部分,上面一部分是系統(tǒng)介紹模塊,下面一部分是真正的登錄內(nèi)容,因?yàn)樯婕暗蒋B加,因此考慮用Stack;
系統(tǒng)介紹模塊部分:整體也是涉及到疊加,考慮用Stack,分為四部分。最底部漸變色背景用一個(gè)contanier,無(wú)須指定位置,全視圖擴(kuò)展;載放logo圖標(biāo)在上一層,用Image。最后兩個(gè)Text同級(jí)放在最上層。Image,Text各用Positioned包裹去指定位置。
登錄內(nèi)容模塊是最外層是一個(gè)Contanier容器,去控制背景色和圓角。然后是一個(gè)Column元素,逐行排列。
第一行為Image,
第二行為Text,
第三行可以看成一個(gè)小Column,分兩塊進(jìn)行布局
第四行可以看成一個(gè)小Column,分兩塊進(jìn)行布局
第五行可以看作一個(gè)TextButton,
第六行可以看作一個(gè)Row,分三塊進(jìn)行布局
通過(guò)上面這樣一步一步的分析后,基本上對(duì)大致的布局有了一個(gè)了解,最外層的控件大致選對(duì)(只要能實(shí)現(xiàn)的話,就是復(fù)雜度以及效率的問(wèn)題),然后一步一步的拆解每一行的元素,如果有重復(fù)的或者覺(jué)得可以封裝出來(lái)的部分,則進(jìn)行下一步。
每一行的拆解,大致也是按照這個(gè)思路來(lái)進(jìn)行,因此筆者在這里就不做講解了。
在做到第三第四行的時(shí)候,發(fā)現(xiàn)這兩個(gè)很相似,而且設(shè)計(jì)到一些交互邏輯,筆者就想對(duì)第三第四行的這種展示進(jìn)行封裝,覺(jué)得今后的布局可能會(huì)用到,因此在這一步,可以先把這一塊兒抽離出一個(gè)控件。利用TextField來(lái)實(shí)現(xiàn)這種輸入操作,具體的實(shí)現(xiàn)筆者不再詳細(xì)的描述了。
經(jīng)過(guò)這一步,整體的規(guī)劃設(shè)計(jì)圖已經(jīng)有了,各個(gè)組件也都有了,接下來(lái)的工作就是組裝了。
具體布局設(shè)計(jì)到一些細(xì)節(jié)的地方,例如整體Column的居中對(duì)齊(crossAxisAlignment)、間隔(Padding或Container包裹,筆者更喜歡用SizedBox占位)、居左居右居中(Align)、點(diǎn)擊事件(GestureDetector)以及圓角(BorderRadius)等一些特殊情況。
像第六行row是放在底部的,就可以在第六行前面增加一個(gè)Spacer()去填充空白區(qū)域。
對(duì)文字顏色大小等,可以用TextStyle直接設(shè)置。
對(duì)于輸入框的刪除按鈕,可以用Offstage這種Flutter特有的控制顯示隱藏的控件。
將生成的 key.jks 文件放置到如下圖位置
key.properties文件中需要輸入以下內(nèi)容:
添加配置1(如圖二)
重要配置(圖三替換圖四)
參考一
參考二
參考三
打包報(bào)錯(cuò)1:
android打包 提示checkreleasebuilds false
打包報(bào)錯(cuò)2:( signingConfigs 與 buildTypes 順序錯(cuò)誤 如圖六)
打包報(bào)錯(cuò)3:
安裝包無(wú)法安裝 使用真機(jī)跑 完整報(bào)錯(cuò)應(yīng)該類似下面這樣:
如圖新增 android:exported="true" 即可
參考
參考
參考
手機(jī)APP制作流程:無(wú)需技術(shù),教你制作一個(gè)自己的手機(jī)APP
一款手機(jī)APP的制作,說(shuō)復(fù)雜非常復(fù)雜,涉及到多個(gè)領(lǐng)域的研發(fā),稍復(fù)雜一點(diǎn)的個(gè)人研發(fā)基本上搞不定,但是,也有非常簡(jiǎn)單的手機(jī)APP一站式制作運(yùn)營(yíng)方法。
隨著移動(dòng)互聯(lián)網(wǎng)基層開(kāi)開(kāi)發(fā)技術(shù)的發(fā)展,無(wú)需編程技術(shù),也可以在應(yīng)用公園制作手機(jī)。這里就以應(yīng)用公園為例,教您熟悉手機(jī)APP制作流程,手把手教你制作一款自己心儀的手機(jī)APP。
第一步:了解自己想要制作一款怎么的手機(jī)APP。是軟硬件結(jié)合? 游戲 類?商城類?新聞資訊類?互動(dòng)類?聊天類?還是團(tuán)購(gòu)類、同城服務(wù)類?送餐類?企業(yè)展示類?
每一個(gè)類別的APP開(kāi)發(fā)差異非常大,主要就是不同類型所需要的功能支持。對(duì)自己想要做的APP有個(gè)大致的了解,但是這一步很多人都沒(méi)搞清楚,大部分人都存在一個(gè)大概模糊的創(chuàng)意、想法階段。
第二步:了解自己想要做的APP的基礎(chǔ)功能,劃分板塊。
對(duì)基礎(chǔ)功能的了解、板塊的分類,上手最快的方法就是:查看市場(chǎng)上類似的APP進(jìn)行借鑒。
第三步:界面及交互的設(shè)計(jì)
界面及交互的設(shè)計(jì),可以直接使用“墨刀”??梢韵仍O(shè)計(jì)一個(gè)大概,后期不斷豐富。
第四步:APP功能的開(kāi)發(fā)制作
APP功能的開(kāi)發(fā)直接使用應(yīng)用公園就可以了。應(yīng)用公園把市場(chǎng)上常見(jiàn)的APP功能進(jìn)行拆分組合,你不需要懂任何編程技術(shù),只需喲安把需要的功能挑選出,組合搭配一個(gè),就能迅速組建出一個(gè)手機(jī)APP。
手機(jī)APP制作具體流程:
1、打開(kāi)應(yīng)用公園的官網(wǎng),點(diǎn)擊“開(kāi)始制作”,注冊(cè)登錄;
2、應(yīng)用公園為在線APP制作平臺(tái),所以不需要下載任何東西,直接進(jìn)入制作頁(yè)面就可以;
3、應(yīng)用公園目前有兩種模式:
(1)主題模式:應(yīng)用公園平臺(tái)上,已經(jīng)很多已經(jīng)制作完善的手機(jī)APP軟件,可以直接當(dāng)做模板使用,僅需要把里面的文字圖片進(jìn)行替換,就可以快速制作一款A(yù)PP。
(2)自由模式:就像拼圖一樣,把需要的功能自由組合搭配一下,就可以創(chuàng)造一款獨(dú)一無(wú)二的手機(jī)APP。
每一個(gè)功能控件的具體功能,都通過(guò)后臺(tái)自動(dòng)配置。
4、手機(jī)APP打包
制作完善后,在應(yīng)用公園平臺(tái)直接點(diǎn)擊制作完成,就會(huì)自動(dòng)打包成手機(jī)安裝程序。
5、應(yīng)用發(fā)布上架
在應(yīng)用公園平臺(tái)直接申請(qǐng)應(yīng)用發(fā)布,通過(guò)聯(lián)網(wǎng)后,就可以聯(lián)網(wǎng)使用了。
6、下載管理、運(yùn)營(yíng)
應(yīng)用公園提供運(yùn)營(yíng)管理后臺(tái)、下載站點(diǎn)、下載二維碼、手機(jī)管理助手等APP相關(guān)產(chǎn)品,一站式服務(wù),自動(dòng)配置,免去多次開(kāi)發(fā)成本,而且后期的功能、內(nèi)容的更新迭代自己既可以搞定,也不需要具體的編程技術(shù)。
自己制作app需要 編程知識(shí) 。但依靠第三方工具,三分鐘就可以做成專屬自己的APP。下面以簡(jiǎn)易網(wǎng)為例演示:
簡(jiǎn)網(wǎng)APP工廠三大特點(diǎn)
1、最低的成本:節(jié)省所有開(kāi)發(fā)成本,以及僅幾分鐘的時(shí)間成本。
2、實(shí)用的功能:貼近傳統(tǒng)網(wǎng)站的內(nèi)容編輯與發(fā)布方式。
3、靈活的運(yùn)營(yíng):生成APP后,一個(gè)人也可以完美運(yùn)營(yíng)。
先來(lái)了解一下APP工廠:三分鐘制作APP
使用簡(jiǎn)網(wǎng)APP工廠之前,我曾經(jīng)通過(guò)其他類似的APP公司制作過(guò)兩三個(gè)不同版本的免費(fèi)APP,簡(jiǎn)網(wǎng)的操作流程是制作門檻最低的一家。
不支持用戶名注冊(cè),需要使用微博賬號(hào)
新浪與騰訊微博用戶數(shù)幾乎覆蓋全網(wǎng)網(wǎng)民數(shù),我們默認(rèn)用戶已經(jīng)擁有微博賬號(hào),以便于進(jìn)行APP快速創(chuàng)建。
填寫(xiě)APP信息:幾分鐘搞定
制作APP之前我們需要做一些準(zhǔn)備工作,比如我們要明確我們要做一個(gè)怎樣的APP,我們要為這個(gè)APP準(zhǔn)備一張1024x1024的ICON以及一張114x114的小圖標(biāo),另外還需要一張640x1136的開(kāi)機(jī)圖。
從簡(jiǎn)網(wǎng)APP工廠的首頁(yè),經(jīng)過(guò)3次跳轉(zhuǎn),省略了網(wǎng)站注冊(cè)過(guò)程,通過(guò)模板挑選完成APP美工定案,所需的是APP的圖標(biāo)與應(yīng)用簡(jiǎn)介。全過(guò)程幾分鐘足矣。
快捷實(shí)用的后臺(tái)采編系統(tǒng)
我們制作了一個(gè)新聞資訊類的APP軟件,同時(shí)我們擁有了一個(gè)功能齊全的后臺(tái)更新系統(tǒng)。利用后臺(tái)可以完全解決APP內(nèi)容更新問(wèn)題,可以快速進(jìn)行新聞發(fā)布,包括文字、圖片、視頻、微博等形式,并且引入了完善的評(píng)論系統(tǒng)與社區(qū)系統(tǒng)。
筆者至今使用過(guò)三家大型網(wǎng)站的后臺(tái)系統(tǒng),由于種種 歷史 原因,這些后臺(tái)系統(tǒng)都存在或多或少的不合理設(shè)計(jì),也許是因?yàn)槌休d的功能過(guò)多,數(shù)據(jù)架構(gòu)過(guò)于復(fù)雜,在新入職人員上手操作時(shí),需要經(jīng)過(guò)長(zhǎng)時(shí)間的熟悉過(guò)程。
簡(jiǎn)網(wǎng)為我們制作的APP提供了統(tǒng)一的后臺(tái)模板,這個(gè)后臺(tái)的功能亮點(diǎn)在于不僅提供原始錄入,還提供也許是目前設(shè)計(jì)最為合理的網(wǎng)絡(luò)來(lái)源抓取功能。包括網(wǎng)頁(yè)、微博在內(nèi)的網(wǎng)絡(luò)內(nèi)容,都可以在大約1分鐘時(shí)間內(nèi)導(dǎo)入后臺(tái)中,并且實(shí)時(shí)呈現(xiàn)在用戶手機(jī)上的APP客戶端。
APP的生成時(shí)間約為三分鐘,APP容量只有3M,一般的寬帶都可以在1分鐘之內(nèi)下載好裝進(jìn)手機(jī)
我們得到了一個(gè)可安裝的APP軟件
同時(shí)獲得了一個(gè)功能完善的編輯后臺(tái)
快速的內(nèi)容抓取,讓后臺(tái)采編人員的數(shù)量可以降到最低,維持一個(gè)日更新量在100篇文章左右的APP客戶端,一個(gè)工作人員足矣。
內(nèi)容采編神器:發(fā)布到應(yīng)用
“發(fā)布到應(yīng)用”這個(gè)功能可以說(shuō)是管理后臺(tái)提供的最強(qiáng)大的一個(gè)功能,經(jīng)過(guò)簡(jiǎn)單的設(shè)置后,我們可以在幾秒鐘之內(nèi)把網(wǎng)絡(luò)內(nèi)容發(fā)布到我們的APP客戶端。
這樣一個(gè)媒體類APP就做好了。
很高興回答這個(gè)問(wèn)題。
我是從事安卓App開(kāi)發(fā)的,開(kāi)發(fā)過(guò)很多App,那么App是如何制作的。
頁(yè)面設(shè)計(jì)
我們看到的app都一個(gè)個(gè)頁(yè)面,每個(gè)頁(yè)面功能不同。首先是產(chǎn)品經(jīng)理通過(guò)調(diào)研整理需求,然后將需求整理成頁(yè)面(可以使用墨刀等網(wǎng)頁(yè)制作),然后在交給UI人員進(jìn)行專業(yè)設(shè)計(jì)和美化,最后將設(shè)計(jì)圖打包給開(kāi)發(fā)人員。
開(kāi)發(fā)設(shè)計(jì)
拿安卓舉例,開(kāi)發(fā)使用語(yǔ)言也分幾種,具體得根據(jù)實(shí)際情況來(lái)選擇。
1.原生開(kāi)發(fā)
安卓一般使用java語(yǔ)言開(kāi)發(fā),當(dāng)然現(xiàn)在也有kotlin語(yǔ)言進(jìn)行開(kāi)發(fā)。如何開(kāi)發(fā)就涉及到具體編程了,這里就不詳說(shuō)了。簡(jiǎn)單描述就是使用安卓提供的一系列控件來(lái)實(shí)現(xiàn)頁(yè)面,復(fù)雜點(diǎn)的頁(yè)面可以通過(guò)自定義控件來(lái)實(shí)現(xiàn)。
2.使用H5語(yǔ)言開(kāi)發(fā)
使用H5開(kāi)發(fā)的好處有很多,可以多端復(fù)用,比如瀏覽器端,ios端,當(dāng)然H5開(kāi)發(fā)的體驗(yàn)是沒(méi)有原生好的。結(jié)合我做過(guò)的項(xiàng)目來(lái)說(shuō),一般是這個(gè)頁(yè)面需要分享出去的話,就用H5開(kāi)發(fā)。
3.使用flutter開(kāi)發(fā)
flutter是近年來(lái)谷歌推出的一款UI框架,
使用dart語(yǔ)言進(jìn)行開(kāi)發(fā),支持跨平臺(tái),weight渲染直接操作硬件層,體驗(yàn)可媲美原生。但是flutter技術(shù)比較新,生態(tài)還不完善,開(kāi)發(fā)起來(lái)效率相對(duì)偏低
頁(yè)面數(shù)據(jù)填充
頁(yè)面開(kāi)發(fā)出來(lái)只是空殼子,沒(méi)有數(shù)據(jù)填充,這時(shí)候就需要通過(guò)接口獲取數(shù)據(jù),然后解析數(shù)據(jù),顯示在頁(yè)面上。
到此,一個(gè)大概的App制作流程就結(jié)束了。
首先你要清楚自己想要什么樣的APP,是做哪一方便的?簡(jiǎn)單的?還是復(fù)雜的
一下我就分為兩類進(jìn)行回答
一,簡(jiǎn)單APP
必要崗位
ui設(shè)計(jì)師(至少一個(gè))
主要負(fù)責(zé)APP頁(yè)面的搭建和交互的梳理
客戶端開(kāi)發(fā)人員(至少一個(gè))
目前市面上的APP開(kāi)發(fā)方式多為混合開(kāi)發(fā),如果做一個(gè)簡(jiǎn)單的APP可以選擇webapp,這樣不但可以減少開(kāi)發(fā)周期還可以控制開(kāi)發(fā)成本
服務(wù)端開(kāi)發(fā)(至少一個(gè))
目前服務(wù)器語(yǔ)言很多php,java,
node.js
非必要崗位
首先 ,我說(shuō)的非必要崗位不是說(shuō)這些崗位不重要,而是說(shuō)在為了減少成本的情況下,這樣崗位可以被別的崗位所替代
產(chǎn)品經(jīng)理
如果開(kāi)發(fā)的App功能簡(jiǎn)單,UI設(shè)計(jì)師就可以擔(dān)任這樣職責(zé)
測(cè)試工程師
當(dāng)然,在時(shí)間允許的情況下,開(kāi)發(fā)人員也可以是測(cè)試人員
二,復(fù)雜APP
復(fù)雜app可以考慮純?cè)_(kāi)發(fā),那么客戶端至少兩個(gè)人進(jìn)行開(kāi)發(fā)(安卓,IOS),或者考慮混合開(kāi)發(fā),及web前端+原生開(kāi)發(fā)人員
必要崗位
ui設(shè)計(jì)師,安卓開(kāi)發(fā)工程師,ios開(kāi)發(fā)工程師,后端開(kāi)發(fā)工程師,產(chǎn)品經(jīng)理,測(cè)試工程師,人員的多少可以根據(jù)項(xiàng)目的大小來(lái)定
三,必要成本
服務(wù)器 :這是開(kāi)發(fā)app必須要的,也就是我們放代碼的地方
上架審核所需費(fèi)用 :比如IOS上架審核的花好幾百,安卓要申請(qǐng)軟著等
今年六月的時(shí)候,萌生了開(kāi)發(fā)一個(gè)記賬 App 的想法,想去用自己的 App 記賬,管理收支。那時(shí)正好在英國(guó)是考試周,放假后,我回到了國(guó)內(nèi),準(zhǔn)備去實(shí)現(xiàn)我的計(jì)劃。沒(méi)想到這暑假很快就結(jié)束了,在這個(gè)暑假中經(jīng)歷的太多的事,準(zhǔn)備了要去美國(guó)讀研的考試,遇到了生命中的另一半,同時(shí),也將 Costuary for iPhone 帶到了這個(gè)世界。
Logo
說(shuō)道為什么要開(kāi)發(fā)這樣一個(gè) App ,因?yàn)楣P者在 UK 讀書(shū),市面上很少有記賬 App 能夠?qū)崿F(xiàn)實(shí)時(shí)匯率的換算,帶有這個(gè)功能的 App 也是操作繁雜。所以要自己開(kāi)發(fā)一個(gè),功能并沒(méi)有那么復(fù)雜的,并且能夠滿足自己在國(guó)外和國(guó)內(nèi)生活需求的 App,所以自己編寫(xiě)了 iPhone 的客戶端,為了獲取匯率和 Excel 導(dǎo)出,又用 Java 設(shè)計(jì)和編寫(xiě)了 Costuary 的后端服務(wù)器。
比起今年年初開(kāi)發(fā)的 Flat Weather,這個(gè)項(xiàng)目的代碼量大約是他的十倍,需要實(shí)現(xiàn)眾多的功能和模塊。
這篇文章將會(huì)介紹一下 Costuary 的功能與我開(kāi)發(fā)過(guò)程中的一些心得。
效果圖設(shè)計(jì)
說(shuō)到設(shè)計(jì),兩年前,我還是一個(gè) Android 開(kāi)發(fā)者,Google 的 Material Design 是我的最愛(ài),所以,Costuary 采用了 Android 5.0 之后采用的 Material Design 設(shè)計(jì)。其中摻雜了一些我自己的設(shè)計(jì),因?yàn)?Material Design 的控件有時(shí)候操作繁瑣。
早在 5 月份的時(shí)候已經(jīng)零零總總的用 Sketch 畫(huà)出了這個(gè)產(chǎn)品的 UI 和圖標(biāo),之后開(kāi)始了漫長(zhǎng)開(kāi)發(fā)的過(guò)程。
Sketch交互
與去年開(kāi)發(fā)的 Android 版不同,iPhone 版的 Costuary 采用了底部導(dǎo)航欄的設(shè)計(jì),相比于 Android 通常使用的 Navigation Drawer 的抽屜布局,底部導(dǎo)航欄的設(shè)計(jì)即使在右手操作 iPhone 的時(shí)候都不會(huì)太費(fèi)力。
UX功能 Features
Costuary 支持世界上主要貨幣的實(shí)時(shí)匯率轉(zhuǎn)換,所有外匯在統(tǒng)計(jì)時(shí)會(huì)轉(zhuǎn)換成主貨幣的數(shù)目,方便查看花銷。
日歷視圖能夠很直觀的反映出哪一天有消費(fèi)和收入。
說(shuō)到記賬軟件,量化消費(fèi)的圖表無(wú)疑是重要的一環(huán),Costuary 提供了餅狀圖來(lái)視覺(jué)化一段時(shí)間的花銷。
可以建立多個(gè)賬戶來(lái)表示自己的銀行卡,支付寶,現(xiàn)金等等。
可以看出本月的預(yù)算還有多少。
如果想要進(jìn)行更加詳細(xì)的分析,可以使用導(dǎo)出功能將賬本導(dǎo)出到 Excel。
允許備份賬本內(nèi)容到 iCloud。
開(kāi)發(fā)
去把一紙?jiān)O(shè)計(jì)變成真正的產(chǎn)品,這是一個(gè)獨(dú)立開(kāi)發(fā)者應(yīng)該具有的能力。只會(huì)寫(xiě)代碼不只是我唯一掌握的,能夠去設(shè)計(jì)出來(lái)自己想要的應(yīng)用并且將他實(shí)現(xiàn)才是我在做的事情。
這款應(yīng)用的開(kāi)發(fā)并沒(méi)有想象中的簡(jiǎn)單,需要自己去實(shí)現(xiàn)大量 Android UI 控件,很多圓角,陰影,字體,要慢慢的去調(diào)整,讓控件適合 iPhone 的屏幕。整個(gè)應(yīng)用的背后有 3 個(gè)關(guān)系型數(shù)據(jù)庫(kù)來(lái)儲(chǔ)存賬戶,賬本與各種匯率。與以前開(kāi)發(fā)的 Flat Weather 不同,Costuary 會(huì)產(chǎn)生大量的用戶數(shù)據(jù),所以整個(gè)軟件架構(gòu)的穩(wěn)定性變得異常重要,需要設(shè)計(jì)一些機(jī)制來(lái)防止數(shù)據(jù)丟失與損壞。
Development
為了實(shí)現(xiàn) App 獲取每日的匯率,并且在 iPhone 上能夠?qū)崿F(xiàn)賬本導(dǎo)出到 Excel ,我設(shè)計(jì)了一個(gè)服務(wù)器后端來(lái)處理這些繁雜的實(shí)物。每次 App 啟動(dòng)后會(huì)與我的服務(wù)器來(lái)更新最新的匯率。當(dāng)用戶選擇導(dǎo)出時(shí),賬本會(huì)被發(fā)送到服務(wù)器上并處理為 Excel 發(fā)送到用戶的郵箱里。
說(shuō)到服務(wù)器,就不得不提到用戶隱私了,因?yàn)閷?dǎo)出到 Excel 功能需要將賬本傳到我的服務(wù)器上做進(jìn)一步處理,很多人會(huì)覺(jué)得我侵犯了他的個(gè)人隱私。對(duì)此,為了保護(hù)我的權(quán)益與用戶的權(quán)益,我撰寫(xiě)了 Costuary 軟件許可及服務(wù)協(xié)議與 Costuary 隱私政策,這是我作為獨(dú)立開(kāi)發(fā)者這么多年后第一次去寫(xiě)許可協(xié)議。
Agreement資費(fèi)
與我的其他產(chǎn)品一樣,這款 App 依舊是免費(fèi)供大家使用的,作為獨(dú)立開(kāi)發(fā)者,我們都知道,絕大多數(shù)用戶不會(huì)去珍惜一個(gè)免費(fèi)的產(chǎn)品。就像 Flat Weather 一樣,雖然獲得了很多人的支持,但是也收到了很多人的吐槽。在 Costuary 中依然設(shè)計(jì)了一個(gè)的捐助按鈕,如果大家使用之后喜歡這個(gè)應(yīng)用,請(qǐng)支持我將他維護(hù)下去。
Please donate me尾巴
Costuary for iPhone 是我開(kāi)發(fā)出來(lái)過(guò)最大的軟件體系。我相信,能夠獨(dú)立開(kāi)發(fā)出來(lái)產(chǎn)品的人懂得不只是編程。一個(gè)人要去經(jīng)歷項(xiàng)目的全部生命周期:規(guī)劃,設(shè)計(jì),開(kāi)發(fā),運(yùn)營(yíng),維護(hù),營(yíng)銷,這些是我開(kāi)發(fā)這么多產(chǎn)品所學(xué)會(huì)的。
現(xiàn)在的 Costuary 只是第一個(gè)版本,還有很多 iPhone 的特性沒(méi)有來(lái)得及開(kāi)發(fā),以后會(huì)跟上的,比如 iPhone X 的適配,3D Touch、Today Widget、Touch ID 等等。
以前在少數(shù)派撰稿的時(shí)候,很多讀者會(huì)來(lái)問(wèn)我如何學(xué)習(xí)開(kāi)發(fā),我也特地去寫(xiě)過(guò)如何去學(xué)習(xí)編程,但我相信,真正想去學(xué)習(xí)的,想去為這個(gè)生態(tài)貢獻(xiàn)出自己的一份力的人,自己都會(huì)找到學(xué)習(xí)的方法。我的專業(yè)是電子電器而不是軟件工程,但是我不后悔當(dāng)年去學(xué)習(xí)編程。
最后,還是感謝在背后默默支持我的人,我會(huì)不斷地改進(jìn)與提升,如果 Costuary 真的在記賬方面給予了你便利,這是我莫大的榮幸。
如果想要了解我的更多作品可以訪問(wèn)我的個(gè)人博客 MikeTech,或者在少數(shù)派中閱讀我以前寫(xiě)過(guò)的文章。今年年初也在 iPhone 上寫(xiě)過(guò)一個(gè)天氣 App,天氣應(yīng)用 Flat Weather 的設(shè)計(jì)歷程
對(duì)了,關(guān)于記賬有什么用,如何記賬,如何養(yǎng)成記賬的習(xí)慣。為什么每個(gè)月末都捉襟見(jiàn)肘,除了沒(méi)錢,很可能是對(duì)財(cái)務(wù)管理的能力不強(qiáng)。想了解這一方面的知識(shí),不妨看一看我派的付費(fèi)閱讀欄目:從零開(kāi)始做好個(gè)人記賬
你好,非常感謝你的邀請(qǐng)。
開(kāi)發(fā)一個(gè)app的話首先
第一步、需要調(diào)研,分析開(kāi)發(fā)需求。
第二步、根據(jù)你的開(kāi)發(fā)需求整理一個(gè)開(kāi)發(fā)方案,選擇合理的架構(gòu)。
第三步、開(kāi)始研發(fā)。
第四步、測(cè)試。
第五步、上線試運(yùn)行。
第六步、查缺補(bǔ)漏后投入使用。
開(kāi)發(fā)一個(gè)app的話。有多種選擇??梢哉乙粋€(gè)第三方公司來(lái)進(jìn)行開(kāi)發(fā)。也可以自己招聘開(kāi)發(fā)團(tuán)隊(duì)。也可以交給比較信任的程序員朋友來(lái)進(jìn)行開(kāi)發(fā)。第三種方式的話,屬于接私活兒,成本較低。 當(dāng)然前提你得有認(rèn)識(shí)的人。
我也是程序員出身。參與過(guò)web網(wǎng)站開(kāi)發(fā)。傳統(tǒng)辦公開(kāi)發(fā)。H5開(kāi)發(fā)。微信小程序開(kāi)發(fā)。以及安卓開(kāi)發(fā)。有著較豐富的開(kāi)發(fā)經(jīng)驗(yàn)。自己完全可以勝任一個(gè)App,如果你有這方面的事需求的話,也可以私信我。我是山東的。如果方便的話也可以面談。
App軟件開(kāi)發(fā),從之前的溝通需求、規(guī)劃設(shè)計(jì)、程序開(kāi)發(fā)、測(cè)試修改、它的發(fā)布等。這是一個(gè)非常復(fù)雜和漫長(zhǎng)的過(guò)程,一旦進(jìn)入通信,就需要定期維護(hù)和功能變更。它需要大量的專業(yè)人員參與,成本自然很高。 所以,隨著更新市場(chǎng)的發(fā)展和人們福利的提高,現(xiàn)在已經(jīng)不像傳統(tǒng)開(kāi)發(fā)那么困難了。只需要?jiǎng)觿?dòng)鼠標(biāo),不需要觸碰代碼就可以完成制作app部分。
App開(kāi)發(fā)已成為企業(yè)發(fā)展的重要推動(dòng)力量
十年巨變!移動(dòng)互聯(lián)網(wǎng)已顛覆我們的時(shí)代,商業(yè)、社交、視頻、新聞、工具等領(lǐng)域,移動(dòng)應(yīng)用的滲透率已高達(dá)95%,在團(tuán)購(gòu) 旅游 和零售行業(yè),移動(dòng)端收入規(guī)模已超過(guò)PC端,手機(jī)APP已成為企業(yè)不可或缺的線上陣地。
不用編程就能制作app的在線平臺(tái),擺脫了很多復(fù)雜的流程,還能減少用戶的麻煩,不會(huì)制作,而且可以在平臺(tái)上查看詳細(xì)的課程,非常貼心的設(shè)置!在這里,我想說(shuō)的是,如果你想制作app的話,可以在平臺(tái)上查看詳細(xì)的課程。總的來(lái)說(shuō),這種方法會(huì)大大降低軟件開(kāi)發(fā)app的成本,節(jié)省時(shí)間,讓很多人解決了資金短缺和想快速制作app的問(wèn)題。
app是如何制作的,APP如何開(kāi)發(fā)?
隨著智能手機(jī)APP軟件的吸引力越來(lái)越大,越來(lái)越多的企業(yè)開(kāi)始開(kāi)發(fā)自己的APP應(yīng)用。企業(yè)要想開(kāi)發(fā)屬于自己企業(yè)的APP應(yīng)用,首先要分析自身的情況和市場(chǎng)對(duì)產(chǎn)品的需求。
在APP,開(kāi)發(fā)這件事上,企業(yè)一定要注意以下幾點(diǎn)。
1. 開(kāi)發(fā)APP應(yīng)用一定要明確以自己為中心,開(kāi)發(fā)APP是否能帶來(lái)巨大的利潤(rùn)。
2. 要了解目標(biāo)用戶的需求,配置APP吸引用戶,提高用戶購(gòu)買應(yīng)用的意愿。
3. 通過(guò)合作再次尋找潛在客戶,我相信開(kāi)發(fā)APP的收益遠(yuǎn)遠(yuǎn)大于成本。
開(kāi)發(fā)APP蘋(píng)果系統(tǒng),必須使用Xcode蘋(píng)果開(kāi)發(fā)工具,一般采用Objective-C或Swift語(yǔ)言。Objective-C是繼承了C語(yǔ)言的C字,可以直接用Objective-C語(yǔ)言進(jìn)行編程。如果你不懂?dāng)?shù)據(jù),差別很小。還有一些新的蘋(píng)果后綴語(yǔ)言,非常有用。
Andro系統(tǒng)的app都是用Java語(yǔ)言開(kāi)發(fā)的,Java語(yǔ)言已經(jīng)流行了20多年,這個(gè)趨勢(shì)還在持續(xù)和延續(xù)。如果想要安卓系統(tǒng)的app首先要掌握J(rèn)ava語(yǔ)言,對(duì)于說(shuō)C語(yǔ)言的人來(lái)說(shuō),學(xué)習(xí)Java還是很容易的。如果你對(duì)自學(xué)感興趣,Java網(wǎng)站上有很多培訓(xùn)課程,還有很多免費(fèi)培訓(xùn)。視頻,不想付費(fèi)。如果這個(gè)絕對(duì)是零基礎(chǔ)(沒(méi)學(xué)過(guò)其他編程語(yǔ)言,比如c語(yǔ)言),如果真的很感興趣,可以自學(xué),但是速度比較慢。
總結(jié):app開(kāi)發(fā)擁有多種方法,選擇最適合自己的方式方法很重要
答案寫(xiě)到這里,我想您應(yīng)該知道了app的開(kāi)發(fā)途徑或者方法是什么。如果您是小企業(yè)或者是個(gè)體工商戶,您可以找人幫忙開(kāi)發(fā)小程序或者自己在一些網(wǎng)站上進(jìn)行傻瓜式軟件開(kāi)發(fā)。正如上文所說(shuō),現(xiàn)在有很多的網(wǎng)站支持在線生成APP,常用的功能和接口都已經(jīng)設(shè)置好了,操作起來(lái)不是很難。如果您是大企業(yè),業(yè)務(wù)多訪問(wèn)量比較大,我的建議是您應(yīng)該聘請(qǐng)專業(yè)的軟件工程師開(kāi)發(fā)專門的app,避免后期出現(xiàn)的問(wèn)題沒(méi)辦法及時(shí)解決給您的企業(yè)帶來(lái)?yè)p失。
不懂的話,找專業(yè)的人幫忙,我就是專業(yè)的
app即application program。應(yīng)用程序。目前手機(jī)平臺(tái)是ios和安卓?jī)纱笃脚_(tái)的天下。本人不才從事安卓開(kāi)發(fā)。簡(jiǎn)單介紹一下吧你問(wèn)的這個(gè)問(wèn)題范圍太廣。ios和安卓開(kāi)發(fā)語(yǔ)言不同。ios使用的是object_c和swift。安卓是基于java。二者都屬于面向?qū)ο蟮恼Z(yǔ)言。開(kāi)發(fā)平臺(tái)安卓基于android studio早期使用的是eclipse+adt。不過(guò)已經(jīng)被淘汰了。那么怎樣開(kāi)發(fā)app?首先你需要一個(gè)后臺(tái)程序員寫(xiě)服務(wù)器以及搭建數(shù)據(jù)庫(kù)。其次你的會(huì)ios或是android其中之一那么這就是最簡(jiǎn)單的配置.現(xiàn)在流行混合開(kāi)發(fā)如果你再會(huì)點(diǎn)前端的h5和js就更好了。一般一個(gè)軟件公司的基本配置是一個(gè)前端一個(gè)ios一個(gè)安卓一個(gè)后臺(tái)?;揪蜐M足你搭建網(wǎng)站和手機(jī)應(yīng)用的需求了。不過(guò)你作為老板養(yǎng)這樣一個(gè)團(tuán)隊(duì)很費(fèi)錢。還不如找外包
軟件的生成需要經(jīng)歷以下幾個(gè)階段:
1、滿足用戶需求——建立軟件目標(biāo),設(shè)想產(chǎn)品功能,進(jìn)行場(chǎng)景化細(xì)分說(shuō)明;進(jìn)行可行性分析,用戶需求收集,用戶需求場(chǎng)景描述;場(chǎng)景問(wèn)題梳理;獲取用戶行為、想法;場(chǎng)景應(yīng)用痛點(diǎn),機(jī)會(huì)點(diǎn)
2、需求開(kāi)發(fā)與管理——建立用戶畫(huà)像,從軟件目標(biāo)出發(fā),進(jìn)行問(wèn)題梳理,場(chǎng)景行為分析,愿景分析,建立體驗(yàn)地圖
3、利用Axure繪制軟件原型,在用戶場(chǎng)景中切入,并組織軟件原型實(shí)施,在實(shí)施過(guò)程中進(jìn)行問(wèn)卷調(diào)查,收集問(wèn)題,記錄用戶行為,不斷改善軟件需求,進(jìn)行需求評(píng)審,進(jìn)入評(píng)審優(yōu)化
4、技術(shù)可行性分析——技術(shù)分析,場(chǎng)景分析,功能實(shí)現(xiàn)驗(yàn)證,
5、開(kāi)發(fā)計(jì)劃制定,實(shí)施,測(cè)試,驗(yàn)證,發(fā)布
圖片加載過(guò)程是由ImageProvider觸發(fā)的。而ImageProvider表示異步獲取圖片數(shù)據(jù)的操作,可以從資源,網(wǎng)絡(luò),文件等不同的渠道獲取。
首先,ImageProvider根據(jù)_ImageState中傳遞的圖片配置生成對(duì)應(yīng)的圖片緩存key,然后去ImageCache中查找是否由對(duì)應(yīng)的圖片緩存,如果有,通知刷新對(duì)應(yīng)的UI;如果沒(méi)有通過(guò)ImageStream異步加載,加載完成后更新緩存,然后通知_ImageState刷新UI。
ImageCache采用的是LRU(Least Recently Used)
文/陳爐軍
整理/LiveVideoStack
大家好,我是阿里巴巴閑魚(yú)事業(yè)部的陳爐軍,本次分享的主題是Flutter浪潮下的音視頻研發(fā)探索,主要內(nèi)容是針對(duì)閑魚(yú)APP在當(dāng)下流行的跨平臺(tái)框架Flutter的大規(guī)模實(shí)踐,介紹其在音視頻領(lǐng)域碰到的一些困難以及解決方案。
分享內(nèi)容主要分為四個(gè)方面,首先會(huì)對(duì)Flutter有一個(gè)簡(jiǎn)單介紹以及選擇Flutter作為跨平臺(tái)框架的原因,其次會(huì)介紹Flutter中與音視頻關(guān)系非常大的外接紋理概念,以及對(duì)它做出的一些優(yōu)化。之后會(huì)對(duì)閑魚(yú)在音視頻實(shí)踐過(guò)程中碰到的一些Flutter問(wèn)題提出了一些解決方案——TPM音視頻框架。最后是閑魚(yú)Flutter多媒體開(kāi)源組件的介紹。
Flutter
Flutter是一個(gè)跨平臺(tái)框架,以往的做法是將音頻、視頻和網(wǎng)絡(luò)這些模塊都下沉到C++層或者ARM層,在其上封裝成一個(gè)音視頻的SDK,供UI層的PC、iOS和Android調(diào)用。
而Flutter做為一個(gè)UI層的跨平臺(tái)框架,顧名思義就是在UI層也實(shí)現(xiàn)了一個(gè)跨平臺(tái)開(kāi)發(fā)??梢灶A(yù)想的是未Flutter發(fā)展的好的話,會(huì)逐漸變?yōu)橐粋€(gè)從底層到UI層的一個(gè)全鏈路的跨平臺(tái)開(kāi)發(fā),技術(shù)人員分別負(fù)責(zé)SDK和UI層的開(kāi)發(fā)。
在Flutter之前已經(jīng)有很多跨平臺(tái)UI解決方案,那為什么選擇Flutter呢?
我們主要考慮性能和跨平臺(tái)的能力。
以往的跨平臺(tái)方案比如Weex,ReactNative,Cordova等等因?yàn)榧軜?gòu)的原因無(wú)法滿足性能要求,尤其是在音視頻這種性能要求幾乎苛刻的場(chǎng)景。
而諸如Xamarin等,雖然性能可以和原生App一致,但是大部分邏輯還是需要分平臺(tái)實(shí)現(xiàn)。
我們可以看一下,為什么Flutter可以實(shí)現(xiàn)高性能:
原生的native組件渲染以IOS為例,蘋(píng)果的UIKit通過(guò)調(diào)用平臺(tái)自己的繪制框架QuaztCore來(lái)實(shí)現(xiàn)UI的繪制,圖形繪制也是調(diào)用底層的API,比如OpenGL、Metal等。
而Flutter也是和原生API邏輯一致,也是通過(guò)調(diào)用底層的繪制框架層SKIA實(shí)現(xiàn)UI層。這樣相當(dāng)于Flutter他自己實(shí)現(xiàn)了一套UI框架,提供了一種性能超越原生API的跨平臺(tái)可能性。
但是我們說(shuō)一個(gè)框架最終性能怎樣,其實(shí)取決于設(shè)計(jì)者和開(kāi)發(fā)者。至于現(xiàn)在到底是一個(gè)什么狀況:
在閑魚(yú)的實(shí)踐中,我們發(fā)現(xiàn)在正常的開(kāi)發(fā)沒(méi)有特意的去優(yōu)化UI代碼的情況下,在一些低端機(jī)上,F(xiàn)lutter界面的流暢性是比Native界面要好的。
雖然現(xiàn)在閑魚(yú)某些場(chǎng)景下會(huì)有卡頓閃退等情況,但是這是一個(gè)新事物發(fā)展過(guò)程中的必然問(wèn)題,我們相信未來(lái)性能肯定不會(huì)成為限制Flutter發(fā)展的瓶頸的。
在閑魚(yú)實(shí)踐Flutter的過(guò)程中,混合棧和音視頻是其中比較難解決的兩個(gè)問(wèn)題,混合棧是指一個(gè)APP在Flutter過(guò)程中不可能一口氣將所有業(yè)務(wù)全部重寫(xiě)為Flutter,所以這是一個(gè)逐步迭代的過(guò)程,這期間原生native界面與Flutter界面共存的狀態(tài)就稱之為混合棧。閑魚(yú)在混合棧上也有一些比較好的輸出,例如FlutterBoost。
外接紋理
在講音視頻之前需要簡(jiǎn)要介紹一下外接紋理的概念,我們將它稱之為是Flutter和Frame之間的橋梁。
Flutter渲染一幀屏幕數(shù)據(jù)首先要做的是,GPU發(fā)出的VC信號(hào)在Flutter的UI線程,通過(guò)AOT編譯的機(jī)器碼結(jié)合當(dāng)前Dart Runtime,生成Layer Tree UI樹(shù),Layer Tree上每一個(gè)葉子節(jié)點(diǎn)都代表了當(dāng)前屏幕上所需要渲染的每一個(gè)元素,包含了這些元素渲染所需要的內(nèi)容。將Layer Tree拋給GPU線程,在GPU線程內(nèi)調(diào)用Skia去完成整個(gè)UI的渲染過(guò)程。Layer Tree中有PictureLayer和TextureLayer兩個(gè)比較重要的節(jié)點(diǎn)。PictureLayer主要負(fù)責(zé)屏幕圖片的渲染,F(xiàn)lutter內(nèi)部實(shí)現(xiàn)了一套圖片解碼邏輯,在IO線程將圖片讀取或者從網(wǎng)絡(luò)上拉取之后,通過(guò)解碼能夠在IO線程上加載出紋理,交給GPU線程將圖片渲染到屏幕上。但是由于音視頻場(chǎng)景下系統(tǒng)API太過(guò)繁多,業(yè)務(wù)場(chǎng)景過(guò)于復(fù)雜。Flutter沒(méi)有一套邏輯去實(shí)現(xiàn)跨平臺(tái)的音視頻組件,所以說(shuō)Flutter提出了一種讓第三方開(kāi)發(fā)者來(lái)實(shí)現(xiàn)音視頻組件的方式,而這些音視頻組件的視頻渲染出口,就是TextureLayer。
在整個(gè)Layer Tree渲染的過(guò)程中,TextureLayer的數(shù)據(jù)紋理需要由外部第三方開(kāi)發(fā)者來(lái)指定,可以把視頻數(shù)據(jù)和播放器數(shù)據(jù)送到TextureLayer里,由Flutter將這些數(shù)據(jù)渲染出來(lái)。
TextureLayer渲染過(guò)程:首先判斷Layer是否已經(jīng)初始化,如果沒(méi)有就創(chuàng)建一個(gè)Texture,然后將Texture Attach到一個(gè)SufaceTexture上。
這個(gè)SufaceTexture是音視頻的native代碼可以獲取到的對(duì)象,通過(guò)這個(gè)對(duì)象創(chuàng)建的Suface,我們可以將視頻數(shù)據(jù)、攝像頭數(shù)據(jù)解碼放到Suface中,然后Flutter端通過(guò)監(jiān)聽(tīng)SufaceTexture的數(shù)據(jù)更新就可以順利把剛才創(chuàng)建的數(shù)據(jù)更新到它的紋理中,然后再將紋理交給SKIA渲染到屏幕上。
然而我們?nèi)绻枰肍lutter實(shí)現(xiàn)美顏,濾鏡,人臉貼圖等等功能,就需要將視頻數(shù)據(jù)讀取出來(lái),更新到紋理中,再將GPU紋理經(jīng)過(guò)美顏濾鏡處理后生成一個(gè)處理后的紋理。按Flutter提供的現(xiàn)有能力,必須先將紋理中的數(shù)據(jù)從GPU讀出到CPU中,生成Bitmap后再寫(xiě)入Surface中,這樣在Flutter中才能順利的更新到視頻數(shù)據(jù),這樣做對(duì)系統(tǒng)性能的消耗很大。
通過(guò)對(duì)Flutter渲染過(guò)程分析,我們知道Flutter底層需要渲染的數(shù)據(jù)就是GPU紋理,而我們經(jīng)過(guò)美顏濾鏡處理完成以后的結(jié)果也是GPU紋理,如果可以將它直接交給Flutter渲染,那就可以避免GPU-CPU-GPU這樣的無(wú)用循環(huán)。這樣的方法是可行的,但是需要一個(gè)條件,就是OpenGL上下文共享。
OpenGL
在說(shuō)上下文之前,得提到一個(gè)和上線文息息相關(guān)的概念:線程。
Flutter引擎啟動(dòng)后會(huì)啟動(dòng)四個(gè)線程:
第一個(gè)線程是UI線程,這是Flutter自己定義的UI線程,主要負(fù)責(zé)GPU發(fā)出的VSync信號(hào)時(shí)候用當(dāng)前Dart編譯的機(jī)器碼和當(dāng)前運(yùn)行環(huán)境創(chuàng)建出Layer Tree。
還有就是IO線程和GPU線程。和大部分OpenGL處理解決方案中一樣,F(xiàn)lutter也采取一個(gè)線程責(zé)資源加載,一部分負(fù)責(zé)資源渲染這種思路。
兩個(gè)線程之間紋理共享有兩種方式。一種是EGLImage(IOS是 CVOpenGLESTextureCache)。一種是OpenGL Share Context。Flutter通過(guò)Share Context來(lái)實(shí)現(xiàn)紋理共享,將IO線程的Context和GPU線程的Context進(jìn)行Share,放到同一個(gè)Share Group下面,這樣兩個(gè)線程下資源是互相可見(jiàn)可以共享的。
Platform線程是主線程,F(xiàn)lutter中有一個(gè)很奇怪的設(shè)定,GPU線程和主線程共用一個(gè)Context。并且在主線程也有很多OpenGL 操作。
這樣的設(shè)計(jì)會(huì)給音視頻開(kāi)發(fā)帶來(lái)很多問(wèn)題,后面會(huì)詳細(xì)說(shuō)。
音視頻端美顏處理完成的OpenGL紋理能夠讓Flutter直接使用的條件就是Flutter的上下文需要和平臺(tái)音視頻相關(guān)的OpenGL上下文處在一個(gè)Share Group下面。
由于Flutter主線程的Context就是GPU的Context,所以在音視頻端主線程中有一些OpenGL操作的話,很有可能使Flutter整個(gè)OpenGL被破壞掉。所以需要將所有的OpenGL操作都限制在子線程中。
通過(guò)上述這兩個(gè)條件的處理,我們就可以在沒(méi)有增加GPU消耗的前提下實(shí)現(xiàn)美顏和濾鏡等等功能。
TPM
在經(jīng)過(guò)demo驗(yàn)證之后,我們將這個(gè)方案應(yīng)用到閑魚(yú)音視頻組件中,但改造過(guò)程中發(fā)現(xiàn)了一些問(wèn)題。
上圖是攝像頭采集數(shù)據(jù)轉(zhuǎn)換為紋理的一段代碼,其中有兩個(gè)操作:首先是切進(jìn)程,將后面的OpenGL操作都切到cameraQueue中。然后是設(shè)置一次上下文。然后這種限制條件或者說(shuō)是潛規(guī)則往往在開(kāi)發(fā)過(guò)程中容易被忽略的。而這個(gè)條件一旦忽略后果就是出現(xiàn)一些莫名其妙的詭異問(wèn)題極難排查。因此我們就希望能抽象出一套框架,由框架本身實(shí)現(xiàn)線程的切換、上下文和模塊生命周期等的管理,開(kāi)發(fā)者接入框架以后只需要安心實(shí)現(xiàn)自己的算法,而不需要關(guān)心這些潛規(guī)則還有其他一些重復(fù)的邏輯操作。
在引入Flutter之前閑魚(yú)的音視頻架構(gòu)與大部分音視頻邏輯一樣采用分層架構(gòu):
1:底層是一些獨(dú)立模塊
2:SDK層是對(duì)底層模塊的封裝
3:最上層是UI層。
引入Flutter之后,通過(guò)分析各個(gè)模塊的使用場(chǎng)景,我們可以得出一個(gè)假設(shè)或者說(shuō)是抽象:音視頻應(yīng)用在終端上可以歸納為視頻幀解碼之后視頻數(shù)據(jù)幀在各個(gè)模塊之間流動(dòng)的過(guò)程,基于這種假設(shè)去做Flutter音視頻框架的抽象。
咸魚(yú)Flutter多媒體開(kāi)源組件
整個(gè)Flutter音視頻框架抽象分為管線和數(shù)據(jù)的抽象、模塊的抽象、線程統(tǒng)一管理和上下文同一管理四部分。
管線,其實(shí)就是視頻幀流動(dòng)的管道。數(shù)據(jù),音視頻中涉及到的數(shù)據(jù)包括紋理、Bit Map以及時(shí)間戳等。結(jié)合現(xiàn)有的應(yīng)用場(chǎng)景我們定義了管線流通數(shù)據(jù)以Texture為主數(shù)據(jù),同時(shí)可以選擇性的添加Bit Map等作為輔助數(shù)據(jù)。這樣的數(shù)據(jù)定義方式,避免重復(fù)的創(chuàng)建和銷毀紋理帶來(lái)的性能開(kāi)銷以及多線程訪問(wèn)紋理帶來(lái)的一些問(wèn)題。也滿足一些特殊模塊對(duì)特殊數(shù)據(jù)的需求。同時(shí)也設(shè)計(jì)了紋理池來(lái)管理管線中的紋理數(shù)據(jù)。
模塊:如果把管線和數(shù)據(jù)比喻成血管和血液,那框架音視頻的場(chǎng)景就可以比喻成器官,我們根據(jù)模塊所在管線的位置抽象出采集、處理和輸出三個(gè)基類。這三個(gè)基類里實(shí)現(xiàn)了剛才說(shuō)的線程切換,上下文切換,格式轉(zhuǎn)換等等共同邏輯,各個(gè)功能模塊通過(guò)集成自這些基類,可以避免很多重復(fù)勞動(dòng)。
線程:每一個(gè)模塊初始化的時(shí)候,初始化函數(shù)就會(huì)去線程管理的模塊去獲取自己的線程,線程管理模塊可以決定給初始化函數(shù)分配新的線程或者已經(jīng)分配過(guò)其他模塊的線程。
這樣有三個(gè)好處:
一是可以根據(jù)需要去決定一個(gè)線程可以掛載多少模塊,做到線程間的負(fù)載均衡。第二,多線程并發(fā)式能夠保證模塊內(nèi)的OpenGL操作是在當(dāng)前線程內(nèi)而不會(huì)跑到主線程去,徹底避免Flutter的OpenGL 環(huán)境被破壞。第三,多線程并行可以充分利用CPU多核架構(gòu),提升處理速度。
從Flutter端修改Flutter引擎將Context取出后,根據(jù)Context創(chuàng)建上下文的統(tǒng)一管理模塊,每一個(gè)模塊在初始化的時(shí)候會(huì)獲取它的線程,獲取之后會(huì)調(diào)用上下文管理模塊獲取自己的上下文。這樣可以保證每一個(gè)模塊的上下文都是與Flutter的上下文進(jìn)行Share的,每個(gè)模塊之間資源都是共享可見(jiàn)的,F(xiàn)lutter和音視頻native之間也是互相共享可見(jiàn)的。
基于上述框架如果要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的場(chǎng)景,比如畫(huà)面實(shí)時(shí)預(yù)覽和濾鏡處理功能,
1:需要選擇功能模塊,功能模塊包括攝像頭模塊、濾鏡處理模塊和Flutter畫(huà)面渲染模塊,
2:需要配置模塊參數(shù),比如采集分辨率、濾鏡參數(shù)和前后攝像頭設(shè)置等,
3:在創(chuàng)建視頻管線后使用已配置的參數(shù)創(chuàng)建模塊
4:最后管線搭載模塊,開(kāi)啟管線就可以實(shí)現(xiàn)這樣簡(jiǎn)單的功能。
上圖為整個(gè)功能實(shí)現(xiàn)的代碼和結(jié)構(gòu)圖。
結(jié)合上述音視頻框架,閑魚(yú)實(shí)現(xiàn)了Flutter多媒體開(kāi)源組件。
組要包含四個(gè)基本組件分別是:
1:視頻圖像拍攝組件
2:播放器組件
3:視頻圖像編輯組件
4:相冊(cè)選擇組件
現(xiàn)在這些組件正在走內(nèi)部開(kāi)源流程。預(yù)計(jì)9月份,相冊(cè)和播放器會(huì)實(shí)現(xiàn)開(kāi)源。
后續(xù)展望和規(guī)劃
1:實(shí)現(xiàn)開(kāi)頭所說(shuō)的從底層SDK到UI的全鏈路的跨端開(kāi)發(fā)。目前底層框架層和模塊層都是各個(gè)平臺(tái)各自實(shí)現(xiàn),反而是Flutter的UI端進(jìn)行了跨平臺(tái)的統(tǒng)一,所以后續(xù)會(huì)將底層也按照音視頻常用做法把邏輯下沉到C++層,盡可能的實(shí)現(xiàn)全鏈路跨平臺(tái)。
2:第二部分內(nèi)容為開(kāi)源共建,閑魚(yú)開(kāi)源的內(nèi)容不僅包括拍攝、編輯組件,還包括了很多底層模塊,希望有開(kāi)發(fā)者在基于Flutter開(kāi)發(fā)音視頻應(yīng)用時(shí)可以充分利用閑魚(yú)開(kāi)源出的音視頻模塊能力,搭建APP框架,開(kāi)發(fā)者只要去負(fù)責(zé)實(shí)現(xiàn)特殊需求模塊就可以,盡可能的減少重復(fù)勞動(dòng)。