談及接觸到 HarmonyOS 應(yīng)用的開發(fā),主要是因?yàn)樵?2020 年年底接到華為一個(gè)項(xiàng)目為某兩所 985 高校開發(fā)實(shí)驗(yàn)案例手冊,一個(gè)是上層應(yīng)用方向的,一個(gè)是操作系統(tǒng)層的。
說實(shí)話,當(dāng)時(shí)只是知道 HarmonyOS,而沒有了解過其中任何開發(fā)技術(shù)。
但是這兩個(gè)層面自己也算很有底氣去接,首先是對新知識新技術(shù)的饑渴(特別還是國產(chǎn)化的),加上自己畢竟做過 10 年的應(yīng)用開發(fā)和 3 年的操作系統(tǒng)以及底層協(xié)議棧開發(fā)。
下面談?wù)勎沂侨绾螌W(xué)習(xí)一門新技術(shù)的吧。首先作為一個(gè)開發(fā)老鳥肯定是項(xiàng)目驅(qū)動學(xué)習(xí),這個(gè)已經(jīng)很多年都是這樣了,從最初的 VC 到 Delphi 到 PHP、Java 到 Android、Python 等等。
01
項(xiàng)目案例需求分析與項(xiàng)目移植
我這里就拿之前我之前編寫的實(shí)驗(yàn)指導(dǎo)手冊之一《HarmonyOS 手機(jī)通訊錄開發(fā) 實(shí)驗(yàn)指導(dǎo)手冊》這個(gè)說起吧。
編寫這個(gè)案例之前,首先是對這個(gè)案例需求基本不用我多想,很小一個(gè)案例,頭腦中已經(jīng)有一個(gè)原型出來了。
當(dāng)然沒有必要自己畫原型圖,這里貼一個(gè)最終實(shí)現(xiàn)的效果圖。
然后根據(jù)以往的項(xiàng)目經(jīng)驗(yàn)來構(gòu)想,如果使用 Android 或者 Vue 實(shí)現(xiàn)該是怎樣幾個(gè)步驟,其實(shí) Android 和 Vue 的語法雖然不一樣,但基本思路也是類似的,不同技術(shù)棧的切換對比式學(xué)習(xí)非常重要。
這里還有點(diǎn)需要切記,別著急看 API 和動手寫代碼。
經(jīng)過以上的構(gòu)思,我很快就已經(jīng)形成了一個(gè)初步的功能實(shí)現(xiàn)思路,并且能盡可能地多融匯一些開發(fā)常用的技術(shù)棧進(jìn)來:
實(shí)現(xiàn)通訊錄主頁 UI 布局。疑問點(diǎn):通訊錄的 UI 布局在 HarmonyOS 中如何實(shí)現(xiàn),里面涉及的 UI 組件 Sdk 是否具備。
實(shí)現(xiàn)聯(lián)系人列表靜態(tài)數(shù)據(jù)渲染。
實(shí)現(xiàn)按鈕點(diǎn)擊、列表點(diǎn)擊、長按等各種監(jiān)聽事件,使用日志打印模擬業(yè)務(wù)、debug 調(diào)試。
添加聯(lián)系人詳情頁面,實(shí)現(xiàn)頁面之間跳轉(zhuǎn)傳參。
通過彈出窗口來編寫添加聯(lián)系人頁面。
聯(lián)系人列表數(shù)據(jù)的動態(tài)刷新。
靜態(tài)數(shù)據(jù)切換為本地持久化數(shù)據(jù),比如是否存在 sqlite,相應(yīng)會對應(yīng)數(shù)據(jù)的 CRUD 操作。
靜態(tài)數(shù)據(jù)切換為服務(wù)端數(shù)據(jù),http 網(wǎng)絡(luò)通信如何使用?是否涉及權(quán)限控制。
自定義組件使用。
下面再來帶著這個(gè)思路和疑問去網(wǎng)上找資料。我個(gè)人習(xí)慣優(yōu)先查閱官網(wǎng)資料。前期大家也別太依賴博客,畢竟博客里面的坑會一大堆,還跳不出來,講到這希望社區(qū)別打我啊。
起碼我編寫完成系列手冊時(shí)沒有翻閱博客,當(dāng)然可能那個(gè)時(shí)候的相關(guān)博客也極其少吧,畢竟官網(wǎng)資料也很少并且還存在部分錯(cuò)誤。
02
閱讀官方開發(fā)文檔
不得不說,現(xiàn)在華為官方文檔非常強(qiáng)大,我這里講下看官方文檔的技巧吧,沒必要全篇通讀細(xì)讀,帶著項(xiàng)目需求去閱讀。
首先我就是尋找目錄,看看是不是我上面的功能需求 HarmonyOS Sdk 是不是都支持。
閱讀之后發(fā)現(xiàn) HarmonyOS 存在兩個(gè) SDK,Java 的和 JS 的,簡單看了下入門案例就知道咋弄了,不用過于糾結(jié)其中細(xì)節(jié)了。
JS 的我就對比 Vue 和微信小程序的思路去進(jìn)行即可,Java 的就先類比 Android 的去弄,等后面具體編寫代碼實(shí)現(xiàn)功能的時(shí)候再來排坑。
所以后面又對該項(xiàng)目編寫了一個(gè) JS 版本的通訊錄開發(fā),以及后面發(fā)現(xiàn) HarmonyOS 重要的分布式開發(fā)技術(shù),還編寫了 Java 和 JS 混合開發(fā),js FA 調(diào)用 java PA 的數(shù)據(jù)的內(nèi)容,這些都是在通讀文檔之后做了項(xiàng)目延申。
確認(rèn)好了 sdk 基本都支持我要的需求之后,下面就開始實(shí)施代碼編輯了。
03
開發(fā)必備 HelloWorld
作為一個(gè)老鳥,我一直給學(xué)生強(qiáng)調(diào) HelloWorld 的重要性。自行參照官網(wǎng)入門案例搭建開發(fā)環(huán)境,并且運(yùn)行起來 HelloWorld 項(xiàng)目。
官網(wǎng)步驟很詳細(xì),沒有啥多解釋的。我這里強(qiáng)調(diào)幾個(gè)關(guān)鍵點(diǎn),對 HelloWorld 工程項(xiàng)目組織結(jié)構(gòu)請好好看看。
個(gè)人認(rèn)為前期最主要的就是要熟悉這個(gè)項(xiàng)目組織結(jié)構(gòu),特別是還分 JS 版和 Java 版的,如有不清楚的請閱讀官方文檔對這塊的講解。
至于調(diào)試,前期只有網(wǎng)絡(luò)版的模擬器,并且要華為賬號認(rèn)證,每個(gè)小時(shí)會自動釋放,這個(gè)清楚習(xí)慣即可,沒必要糾結(jié)。
至于 DevEco Studio 這個(gè) IDE 我沒什么多說的,熟練使用過 IDEA 或者 Android Studio 等 JetBrains 全家桶產(chǎn)品的開發(fā)者來說,就順手拈來了。至于剛接觸的還是先花心簡單熟悉下常用操作吧。
04
代碼編寫、閱讀官方文檔、填坑
由于前面已經(jīng)分解了開發(fā)步驟,所以編寫代碼目的性非常明確,思路清晰,如果是初學(xué)者缺乏項(xiàng)目經(jīng)驗(yàn),從一個(gè)個(gè)小語法知識點(diǎn)開始學(xué)起,比如一個(gè)小小按鈕學(xué)半天,那樣開發(fā)和學(xué)習(xí)就太慢了。
所以我還是建議多用項(xiàng)目式貫穿學(xué)習(xí),特別是自己曾經(jīng)做過的項(xiàng)目移植或者需求非常清楚的項(xiàng)目代入。
既然知道了 Java SDK 開發(fā),然后發(fā)現(xiàn)可以和 Android 進(jìn)行對比開發(fā),那么真多 Android 老鳥來說要做的就是編寫代碼邊做好差異化記錄筆記即可。
之前我同事也在社區(qū)上發(fā)布了一篇《安卓VS鴻蒙第三方件切換寶典》。
首先強(qiáng)調(diào)一個(gè)編寫代碼習(xí)慣。首先是包結(jié)構(gòu)的合理劃分,包名清晰,然后就是類名、方法名、變量名、常量名命名規(guī)范,這樣即使注釋很少沒有詳細(xì)設(shè)計(jì)文檔也很方便閱讀代碼。
然后是 git 的使用,每完成一個(gè)核心步驟及時(shí)提交并且編寫簡要明了的提交日志。
然后就是一步步去解決問題了:
①實(shí)現(xiàn)通訊錄主頁 UI 布局
針對本項(xiàng)目案例先把上下結(jié)構(gòu)菜單欄和空列表布局出來,然后微微調(diào)整美觀細(xì)節(jié),此時(shí)你就會對布局內(nèi)容掌握的七七八八了,沒有必要進(jìn)一步深究了。
此時(shí)可以記錄下 Android 和 HarmonyOS 的布局知識點(diǎn)異同點(diǎn)。
②實(shí)現(xiàn)聯(lián)系人列表靜態(tài)數(shù)據(jù)渲染
發(fā)現(xiàn)和 Android 列表數(shù)據(jù)渲染實(shí)現(xiàn)類似,也是采用一個(gè) lsit ui 組件配合 provider 進(jìn)行實(shí)現(xiàn)。
③實(shí)現(xiàn)按鈕點(diǎn)擊、列表點(diǎn)擊、長按等各種監(jiān)聽事件,使用日志打印模擬業(yè)務(wù)、debug 調(diào)試
點(diǎn)擊事件監(jiān)聽是應(yīng)用中最常用來觸發(fā)業(yè)務(wù)邏輯的,前期在沒有實(shí)際業(yè)務(wù)的時(shí)候,請用日志打印來取代實(shí)際業(yè)務(wù)即可,初學(xué)者往往會吐槽 sysout、log 好無聊,后面你就會發(fā)現(xiàn)它最好用。
這里我重點(diǎn)強(qiáng)調(diào)一個(gè)問題,做開發(fā)一定要 hold 住關(guān)鍵點(diǎn),現(xiàn)在是要學(xué)習(xí)掌握點(diǎn)擊事件的觸發(fā),不用真要出一個(gè)實(shí)際業(yè)務(wù)場景。
比如做大數(shù)據(jù)分析,重點(diǎn)是采用哪些大數(shù)據(jù)技術(shù)去根據(jù)原數(shù)據(jù)集分析出我所關(guān)注的哪些維度的數(shù)據(jù)。這些才是核心,而不是這些數(shù)據(jù)如何漂亮的展示出來。
當(dāng)你覺得 console 下打印這些數(shù)據(jù)最漂亮的時(shí)候,我會覺得你進(jìn)步了。
當(dāng)然回過頭來,后面還是要做些這些事件里面加入實(shí)際業(yè)務(wù)的操作,比如長按刪除聯(lián)系人的操作。
這樣你就完全知道實(shí)際業(yè)務(wù)和最初所學(xué)基礎(chǔ)知識點(diǎn)是如何串聯(lián)起來的了,達(dá)到此目的即可。
④添加聯(lián)系人詳情頁面,實(shí)現(xiàn)頁面之間跳轉(zhuǎn)傳參
數(shù)據(jù)的交互可以說是應(yīng)用開發(fā)時(shí)候的核心,比如傳統(tǒng)的 Web 開發(fā)、前后端分離模式的 Web 開發(fā)、App 類 CS 程序開發(fā),都逃不過數(shù)據(jù)的交互。
實(shí)現(xiàn)此功能我們首先要拋開某門特定的編程技術(shù),而是想著以下幾個(gè)關(guān)鍵點(diǎn):
如何創(chuàng)建多個(gè)頁面
如何設(shè)置某個(gè)頁面為首頁
在哪里觸發(fā)頁面跳轉(zhuǎn)
前一個(gè)頁面的數(shù)據(jù)如何傳遞到下一個(gè)頁面
數(shù)據(jù)傳遞支持哪些數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)如何從下一個(gè)頁面回傳回來
然后我們再來去閱讀官方文檔找尋相應(yīng) API 進(jìn)行處理即可。
這里著重提示,我個(gè)人開發(fā)理念里面把 API 語法放到非常低的地位,重來不記憶 API。
比如你只需要知道 sdk 中肯定有個(gè) API 能夠?qū)崿F(xiàn)頁面跳轉(zhuǎn)的功能,然后自己能夠快速的查閱資料或者自己的筆記、編寫過的 demo,做到眼熟即可。
這樣保證常用的 API 在你很長一段時(shí)間沒有做此類開發(fā)之后依然能讓你在 1 分鐘之類解決問題。
特別是如果你學(xué)習(xí)過七八門編程語言之后,越發(fā)不可能去記各種 API 了。
⑤通過彈出窗口來編寫添加聯(lián)系人頁面
⑥聯(lián)系人列表數(shù)據(jù)的動態(tài)刷新
這兩步依然是查閱官方資料即可實(shí)現(xiàn),做好對比和記錄即可。
⑦靜態(tài)數(shù)據(jù)切換為本地持久化數(shù)據(jù),比如是否存在 sqlite,相應(yīng)會對應(yīng)數(shù)據(jù)的 CRUD 操作
這步涉及到數(shù)據(jù)庫的使用,查閱資料之后,發(fā)現(xiàn)依然是傳統(tǒng)的原生 sql 操作和 ORM 模型操作,至于 CRUD 我不多說了,初學(xué)者最開始主要都是干這個(gè),開發(fā)老鳥見到這個(gè)都想吐了。
這里不多說,我認(rèn)為原生 sql 雖然沒有 ORM 操作起來清爽,但是學(xué)習(xí)成本低,學(xué)會原生 sql 玩轉(zhuǎn)所有數(shù)據(jù)庫。因此我還是更推薦原生 sql 使用。
到這一步有一個(gè)我非常想重點(diǎn)強(qiáng)調(diào)的步驟就是,對方法(即函數(shù))的編寫,大的業(yè)務(wù)層面面向接口設(shè)計(jì),落實(shí)業(yè)務(wù)的時(shí)候面向?qū)ο笤O(shè)計(jì),實(shí)施落地的時(shí)候最重要的就是方法的設(shè)計(jì)編寫。
一個(gè)優(yōu)秀的代碼開發(fā)者,在想清楚需求之后,只需要編寫出方法的兩個(gè)關(guān)鍵要素,方法形參和返回值,那么他一定就能實(shí)現(xiàn)該業(yè)務(wù)。
這里就重點(diǎn)在于他對業(yè)務(wù)的深入理解和數(shù)據(jù)的交互,因此前期在編寫代碼的時(shí)候幾步偽代碼就可以完成一個(gè)功能模塊的設(shè)計(jì)與實(shí)現(xiàn)。
下面我編寫下偽代碼:
(1)---實(shí)現(xiàn)布局----
(2)在AbilitySlice中關(guān)聯(lián)布局,并且初始化要使用的各個(gè)UI組件,初始化監(jiān)聽事件
(3)編寫三個(gè)核心業(yè)務(wù)方法,用于數(shù)據(jù)的幾種場景切換
//獲取sqlite數(shù)據(jù)庫中的數(shù)據(jù),集成sqlite之后調(diào)用這個(gè)方法取代之前的靜態(tài)數(shù)據(jù)方法
private List《Contacts》 getSqliteData() {
}
//生成靜態(tài)的列表數(shù)據(jù)進(jìn)行模擬,在對接sqlite或者服務(wù)端之后不再使用
private List《Contacts》 getData() {
}
//通過http請求獲取服務(wù)端數(shù)據(jù)
private void getServerData() {
}
(4)菜單選擇監(jiān)聽事件切換數(shù)據(jù)源加載
switch (position) {
case 0:
getData();
break;
case 1:
getSqliteData()
break;
case 2:
getServerData();
break;
}
這里提到數(shù)據(jù)庫的操作,我們也可以引入習(xí)慣的 dao 接口設(shè)計(jì)考慮,編寫相應(yīng) dao 層,然后設(shè)計(jì)實(shí)現(xiàn)類進(jìn)行實(shí)現(xiàn)。
同時(shí)上面的偽代碼方法還可以封裝到一個(gè)獲取數(shù)據(jù)服務(wù)的 Service 接口中,然后利用業(yè)務(wù)接口進(jìn)行實(shí)現(xiàn)。此處依然是想強(qiáng)調(diào)設(shè)計(jì)先于代碼。
⑧靜態(tài)數(shù)據(jù)切換為服務(wù)端數(shù)據(jù),http 網(wǎng)絡(luò)通信如何使用?是否涉及權(quán)限控制
http 網(wǎng)絡(luò)通信在 app 開發(fā)中必不可少的東西,既然是 java SDK,那顯然會想到支持最原生的 HttpConnection api。
查閱官網(wǎng)資料也會發(fā)現(xiàn)肯定是支持的,但是一般不會使用原生的,往往會引入一些第三方優(yōu)秀庫進(jìn)行開發(fā)。
比如 okhttp 就是存粹的 java jar 包,進(jìn)入開發(fā)即可,由于不是 Android 開發(fā),這里不要引入 Android 的 aar 庫進(jìn)行開發(fā)。
網(wǎng)絡(luò)開發(fā)中就會再遇到各種不同的坑,比如權(quán)限申請、ui 主線程不能執(zhí)行網(wǎng)絡(luò)耗時(shí)任務(wù)等,這些都可以通過經(jīng)驗(yàn)或者閱讀報(bào)錯(cuò)日志一一解決。
提到網(wǎng)絡(luò)通信交互,不得不想到各種 MVC、MVP、MVVM 設(shè)計(jì)模式了,起初當(dāng)然最熟悉的還是 MVC,先使用傳統(tǒng)的 MVC 去進(jìn)行開發(fā),后續(xù)可以自行封裝 MVP 的開發(fā)模式。
⑨自定義組件使用
HarmonyOS 處于起步階段,最初的 sdk 開發(fā)包只會帶有基礎(chǔ)功能的開發(fā),如果全部基于原生 sdk 進(jìn)行開發(fā),項(xiàng)目開發(fā)效率肯定會比傳統(tǒng)的 Android、iOS 低太多。
因?yàn)樗麄円呀?jīng)非常成熟,有大量優(yōu)秀的開源第三方組件庫,說白了現(xiàn)在開發(fā)一個(gè)應(yīng)用就跟碼積木一樣。
現(xiàn)在就需要大量優(yōu)秀開發(fā)者造出各種優(yōu)秀的輪子出來讓大家可以更快速的開發(fā)項(xiàng)目。
編寫一個(gè)自定義組件確實(shí)比完成一個(gè)簡單的項(xiàng)目需求要更加有意思和成就感,即使一個(gè)非常小的組件,那么這個(gè)就需要耐心閱讀官方sdk api甚至底層代碼實(shí)現(xiàn)了。
當(dāng)然現(xiàn)在官網(wǎng)文檔很齊全,我在編寫第一個(gè)組件的時(shí)候還是消耗了很多精力的,那個(gè)時(shí)候文檔缺乏,只能看比較生澀的 API 文檔,然后半猜半試搗鼓出來。
⑩重要特性功能引入
讀完官方文檔之后,發(fā)現(xiàn)了分布式數(shù)據(jù)通信、協(xié)同、流轉(zhuǎn)等重要技術(shù),后面就主要思考使用場景將其整合開發(fā)進(jìn)去。
本案例正好可以運(yùn)用分布式 pa 和 fa 的互相調(diào)用,對于這個(gè)功能引用也可以完美的通過該項(xiàng)目案例進(jìn)行整合,這種整合類的也能更考驗(yàn)對新知識的融會貫通。
比如 js 開發(fā)一個(gè)通訊錄 fa,然后 java 開發(fā)通訊錄數(shù)據(jù)服務(wù) pa,fa 去獲取 pa 中的數(shù)據(jù)即可。
05
無法解決的坑如何求助
這里著重給初學(xué)者一個(gè)忠告,不要遇到一個(gè)問題就馬上求助問人,一個(gè)問題出現(xiàn)首先要通過查看日志進(jìn)行解決,自行翻閱資料,反復(fù)嘗試,錯(cuò)誤復(fù)現(xiàn)手段記錄,對比場景解決等措施自行想辦法解決。
只有經(jīng)過反復(fù)嘗試發(fā)現(xiàn)是問題的時(shí)候再來求助老師,并且求助之前能夠清晰的描述問題現(xiàn)象。
在項(xiàng)目開發(fā)中發(fā)現(xiàn)了官方文檔、工具等各種 Bug,做好了充分記錄和證據(jù)論證,然后提交給了華為方進(jìn)行求助和整改,對于缺失的關(guān)鍵 API 操作或者技術(shù)描述也能明確提出合理化訴求進(jìn)行求助。
06
開發(fā)完成之后的項(xiàng)目復(fù)盤
如下:
梳理總結(jié)開發(fā)思路,主要是分析前期的思路是否存在不準(zhǔn)確的地方
梳理回顧開發(fā)過程中遇到的坑點(diǎn),自己是如何一步步填坑的
整理相關(guān)文檔,進(jìn)行歸檔留存
整理該項(xiàng)目中所運(yùn)用到的技術(shù)棧
梳理該項(xiàng)目待持續(xù)改進(jìn)的地方
07
本項(xiàng)目所用到的相關(guān)的一些技術(shù)點(diǎn)
如下:
HarmonyOS 移動應(yīng)用開發(fā)工具(DevEco Studio)使用。
UI 組件使用,包括 Text,Button,TextFiled,Image,RadioButton,RadioContainer,ToastDialog,ListContainer。
UI 布局的使用,包括 DirectionalLayout,DependentLayout。
日志打印,HiLog 的使用。
各種事件監(jiān)聽操作與業(yè)務(wù)邏輯實(shí)現(xiàn)。(重難點(diǎn))
ListContainer 子布局結(jié)合 RecycleItemProvider 的使用。(重難點(diǎn))
對話框以及自定義對話框的使用。(重難點(diǎn))
頁面生命周期以及頁面之間跳轉(zhuǎn)與傳參。
自定義組件(同時(shí)涉及到 Canvas)以及如何調(diào)用。(重難點(diǎn))
數(shù)據(jù)存儲操作,主要涉及 sqlite 數(shù)據(jù)庫存儲。(重難點(diǎn))
通過HTTP網(wǎng)絡(luò)通信與服務(wù)端交互。(重難點(diǎn))
多線程通信。(重難點(diǎn))
代碼編程規(guī)范、設(shè)計(jì)模式。(重難點(diǎn))
08
個(gè)人總結(jié)
學(xué)習(xí)沒有捷徑,只有依靠一腔熱血和持之以恒的努力。反復(fù)跳坑填坑,多了自然觸類旁通,即使剛新接觸一個(gè)技術(shù),也能快速搞定一個(gè)項(xiàng)目的移植,比如這個(gè)小項(xiàng)目案例從剛接觸到一天開發(fā)完成都足夠了。
學(xué)習(xí)編程切記執(zhí)著語法和 API,而要注重思維鍛煉,多練習(xí)多踩坑多對比多總結(jié)才是王道。
對于開發(fā)老鳥,我對快速掌握 HarmonyOS 開發(fā)的建議是將自己原有的項(xiàng)目移植,并且盡可能多融入一些技術(shù)點(diǎn)。
對于初學(xué)者,我建議是找到一個(gè)我這種項(xiàng)目貫穿式案例然后配合自己查閱官方資料進(jìn)行結(jié)合學(xué)習(xí),也會事半功倍。
應(yīng)用做多了,會慢慢失去興趣了,都是各種數(shù)據(jù)交互和 UI 渲染,這時(shí)強(qiáng)烈推薦大家去關(guān)注下操作系統(tǒng)層的源碼啊,此時(shí) c 的代碼或許會看起來更親切哦。
我這里推薦的不是開發(fā)板和上層傳數(shù)據(jù)這類應(yīng)用開發(fā),而是操作系統(tǒng)內(nèi)核代碼,值得一看。
責(zé)任編輯:haq
-
華為
+關(guān)注
關(guān)注
216文章
35197瀏覽量
255760 -
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2642瀏覽量
68042 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2121瀏覽量
32884
原文標(biāo)題:鴻蒙開發(fā),小白入坑指南!
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
AN154 GD32VW553快速開發(fā)指南

AIGC入門及鴻蒙入門
超值音棒參考設(shè)計(jì)套件開發(fā)指南

MSP430? MCU開發(fā)指南

瑞芯微RK3566鴻蒙開發(fā)板OpenHarmony標(biāo)準(zhǔn)系統(tǒng)應(yīng)用兼容性測試指導(dǎo)

RA/RX電機(jī)應(yīng)用開發(fā)指南

評論