操作系統(tǒng):macOS Big Sur
為昭通等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及昭通網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、網(wǎng)站制作、昭通網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
前置需求:
ok,開始搞jenkins
1、使用homebrew安裝jenkins
Terminal運(yùn)行命令brew install Jenkins
2、運(yùn)行jenkins
Terminal運(yùn)行命令jenkins,最終出現(xiàn) Jenkins is fully up and running代表運(yùn)行成功
3、初始化jenkins
在瀏覽器地址欄輸入
然后首次安裝啟動(dòng)就會(huì)出現(xiàn)新手引導(dǎo),根據(jù)引導(dǎo)操作
自定義jenkins那里選擇安裝推薦的插件
PS:這里我很多插件都安裝失敗了,這個(gè)沒關(guān)系,可以進(jìn)去再自己安裝或者不再安裝貌似也沒啥影響,繼續(xù)向下操作即可
最后的實(shí)例配置那,默認(rèn)即可,也可以設(shè)置一個(gè)地址
PS:如果要設(shè)置的話,就是自己的電腦ip地址+8080端口就行,配置完之后系統(tǒng)管理里報(bào)了一個(gè)反向代理設(shè)置有誤,目前沒發(fā)現(xiàn)這個(gè)報(bào)錯(cuò)有什么不好的影響,這個(gè)地址也可以以后在jenkins系統(tǒng)管理-系統(tǒng)配置里改的,這個(gè)主要是用來讓別的同事來訪問時(shí)要用的,自己用的話就不用設(shè)置,額外說一個(gè),如果同事電腦掛了vpn,大概率是訪問不了你設(shè)置的這個(gè)地址的,退掉vpn即可
4、安裝插件
進(jìn)來第一步就是安裝插件了,這里要用到哪些我也是根據(jù)別人的博客找的,但是由于我主要是用shell命令,所以好像很多都沒用上,但是安裝了也不虧。。。
gitLab Plugin、gitLab Hook Plugin、Xcode integration、keychains and provisioning profiles Management,DingTalk等
PS:說下這個(gè)Upload Keychain or Provisioning Profile File插件,這個(gè)是用來管理iOS證書和配置文件的,但是吐血的是,無論如何都傳不上去,搞到頭禿,最后沒辦法,放棄治療,好在還有別的辦法,往下看
然后DingTalk這個(gè)是在構(gòu)建成功后自動(dòng)通知到釘釘群的插件,我這邊用到了,下面也有介紹
5、iOS相關(guān)設(shè)置
系統(tǒng)管理-Manage Credentials
點(diǎn)擊 Stores scoped to Jenkins下面的域-全局,然后就可以添加全局憑據(jù)了,這里要添加的是:
Upload Keychain or Provisioning Profile File插件用不了,配置文件在這里添加也是一樣的
6、Android相關(guān)設(shè)置
系統(tǒng)管理-系統(tǒng)配置-全局屬性-環(huán)境變量
Android SDK設(shè)置
系統(tǒng)管理-全局工具配置
JDK設(shè)置
Gradle設(shè)置
7、釘釘插件通知配置
在釘釘群的設(shè)置-智能群助手-添加自定義機(jī)器人
要復(fù)制一下webhook鏈接,下面要用,還有關(guān)鍵字設(shè)置,要釘釘和jenkins一致
在jenkins系統(tǒng)管理-系統(tǒng)配置中,設(shè)置釘釘,點(diǎn)擊測試如果群聊能收到通知就可以
8、新建任務(wù)
這里是Android和iOS各建一個(gè),選擇freestyle即可,兩邊別的都一樣,就是shell命令不一樣,下面會(huì)貼
點(diǎn)開新建的任務(wù),點(diǎn)擊配置
①描述和釘釘
②git信息
git這里是自己項(xiàng)目的git地址和之前全局配置的git賬號(hào)密碼,也可以再這里添加新的賬號(hào)密碼
③構(gòu)建觸發(fā)器和構(gòu)建環(huán)境都不用選
④構(gòu)建
選擇執(zhí)行shell,然后填寫shell命令(iOS和Android我都貼上了,可以自己參考和修改)
里面的一些關(guān)鍵密碼和文件名等,我改成了文字描述或者***,都填自己的
此shell支持的一些功能:清空指定文件夾,替換指定文件,替換指定文件的指定內(nèi)容,導(dǎo)出安裝包,上傳蒲公英,安裝包重命名(version+build+時(shí)間),安裝包上傳svn
Android apk打包shell
⑤構(gòu)建后操作也不用做,保存
9、點(diǎn)擊立即構(gòu)建
如果構(gòu)建失敗可以點(diǎn)擊當(dāng)次構(gòu)建,然后點(diǎn)擊查看控制臺(tái)輸出,查看具體報(bào)錯(cuò)進(jìn)行修改,一般來說只要androidStudio和xcode能夠編譯成功的話,這邊問題都不大,一般都是一些小問題要改,如果構(gòu)建成功,就會(huì)通知到釘釘群了
Flutter有兩個(gè)常用的狀態(tài)類:
標(biāo)記為dirty,執(zhí)行的markNeedsBuild,定義在Element類中:
當(dāng)前Element節(jié)點(diǎn)被標(biāo)記為dirty,同時(shí)調(diào)用owner的scheduleBuildFor方法:
將element元素添加到全局的“臟”鏈表里。
BuildOwner用來管理哪些需要更新的Widget。這個(gè)owner最開始被初始化的地方在WidgetsBinding的initInstances方法中,隨后初始化了onBuildScheduled方法,對(duì)應(yīng)執(zhí)行的是_handleBuildScheduled,定義在WidgetsBinding類中:
ensureVisualUpdate 方法定義在SchedulerBinding類中:
在提交下一幀繪制的時(shí)候會(huì)調(diào)用到scheduleFrame方法,提交給引擎繪制,看看scheduleFrame方法,也定義在SchedulerBinding類中:
提交給引擎繪制之后,會(huì)收到onDrawFrame的回調(diào),最終執(zhí)行到_handleDrawFrame方法中,對(duì)應(yīng)的是handleDrawFrame方法,定義在SchedulerBinding類中:
在RendererBinding的initInstances方法中添加了一個(gè)回調(diào)到這個(gè)List中,對(duì)應(yīng)的是RenderBinding的drawFrame方法,對(duì)應(yīng)的節(jié)點(diǎn)進(jìn)行繪制渲染操作。
WidgetsBinding中的drawFrame方法:
看看這里的buildScope方法,定義在BuildOwner方法中。在上面 scheduleBuildFor 方法介紹中有提到:"scheduleBuildFor 是把一個(gè) element 添加到 _dirtyElements 鏈表,以便當(dāng)[WidgetsBinding.drawFrame]中調(diào)用 buildScope 的時(shí)候能夠重構(gòu) element。onBuildScheduled()是一個(gè) BuildOwner 的回調(diào)"。在 drawFrame 中調(diào)用 buildOwner.buildScope(renderViewElement)更新 elements。
_dirtyElements列表在遍歷的過程中執(zhí)行rebuild方法,此時(shí)將所有標(biāo)記為dirty的Element節(jié)點(diǎn)依次執(zhí)行rebuild,preformRebuild,build,updateChild,update方法,執(zhí)行界面更新。完成build,update操作完成之后,后續(xù)會(huì)將需要繪制的RenderObject添加到需要layout的列表中,等待繪制渲染。所有繪制完成之后將_dirtyElments列表清空,_inDirtyList標(biāo)記位置為false。
提交給引擎繪制渲染
看看super.drawFrame(),這里就執(zhí)行到了RendererBinding類中,定義如下:
這里就是將最終需要繪制渲染的畫面提交給引擎的地方了,繪制完成之后就在界面顯示更新后的視圖了。
path_provider是flutter提供的一個(gè)獲取應(yīng)用存儲(chǔ)路徑的插件,它封裝了統(tǒng)一的api來獲取Android和ios兩個(gè)平臺(tái)的應(yīng)用存儲(chǔ)路徑,提供的api如下:
getTemporaryDirectory():獲取應(yīng)用臨時(shí)文件夾,該文件夾用來保存應(yīng)用的緩存,可以隨時(shí)刪除用于清緩存,對(duì)應(yīng)于Android的getCacheDir()和ios的NSTemporaryDirectory();
getApplicationDocumentsDirectory():獲取應(yīng)用安裝路徑,在應(yīng)用被卸載的時(shí)候刪除,對(duì)應(yīng)Android的AppDate目錄和iOS的NSDocumentDirectory目錄;
getExternalStorageDirectory():獲取存儲(chǔ)卡目錄,僅支持Android;
我們通過File和Directory來創(chuàng)建文件和文件夾時(shí)首先要獲取到應(yīng)用的相關(guān)路徑,不然會(huì)報(bào)錯(cuò);
File對(duì)象和Directory對(duì)象封裝在dart:io中,使用時(shí)需要先引入該庫:
Directory對(duì)象提供listSync()方法獲取文件夾里的內(nèi)容,該方法返回一個(gè)數(shù)組;
文件和文件夾都通過delete刪除,delete異步,deleteSync同步;如果一個(gè)文件夾是非空的刪除會(huì)報(bào)錯(cuò),刪除非空文件夾需要先清空該文件夾:
flutter對(duì)json序列化需要引入 dart:convert 庫:
通過jsonEncode/jsonDecode來轉(zhuǎn)換json對(duì)象:
// 將test目錄下的info.json復(fù)制到test2目錄下的info2.json中
引入包archive包:
壓縮:
壓縮前使用ZipFileEncoder先聲明處理壓縮的對(duì)象,調(diào)用該對(duì)象的zipDirectory方法壓縮文件,該方法接受兩個(gè)參數(shù),第一個(gè)是要壓縮文件/文件夾的路徑,第二個(gè)是壓縮包的保存路徑;
解壓:
如下,
當(dāng)你添加完所有環(huán)境變量,或者多次卸掉重裝android studio后,再次插入手機(jī),或者是開啟模擬器的時(shí)候,vscode或android studio都顯示no devices的時(shí)候,以下簡單的解決方法或許能幫到你。
1、先檢查自己以往是否有安裝adb。在cmd中查看adb的版本。輸入:adb version。
2、如果有安裝的話,建議在C:WindowsSystem和C:WindowsSystem32刪除adb.exe, AdbWinApi.dll和AdbWinUsbApi.dll三個(gè)文件即可。
3、你在android studio經(jīng)過了一頓操作,例如安裝了一系列的sdk文件,還有創(chuàng)建了模擬器之后,也執(zhí)行了第二步,環(huán)境變量也設(shè)置好了,在cmd中輸入adb version。
這就代表了你已經(jīng)徹底清除了舊版本的adb,用的是目前最新版本的adb。這個(gè)也會(huì)隨著flutter upgrade的更新而更新。我今天更新了flutter版本,adb應(yīng)該是最新的。
4、在管理員模式下打開cmd,輸入adb devices,會(huì)看見當(dāng)前已經(jīng)打開了的安卓設(shè)備。
5、輸入adb connect 你安卓設(shè)備的名字 。我的安卓設(shè)備名字是4ad32643。所以我就輸入adb connect 4ad32543。
failed那一行不用管,這時(shí)候看回vscode或者是android studio,即會(huì)出現(xiàn)設(shè)備,可進(jìn)行flutter的正常調(diào)試。