亚洲日韩久久|国偷自产一区二区三区蜜臀国|国产一区二区日韩|99热这里只亚洲无码,无码

代碼給你解密:華為如何用分布式軟總線串聯(lián)起一個(gè)新生態(tài)

日期:2020-06-03 來(lái)源:電子創(chuàng)新網(wǎng)作者:winniewei閱讀:30

“萬(wàn)物互聯(lián)”似乎是這些年被提的最多的一個(gè)概念,在我們的理解中萬(wàn)物互聯(lián)似乎就是將生活中的每個(gè)實(shí)物都接入到網(wǎng)絡(luò)中。不過(guò)因?yàn)椤叭f(wàn)物互聯(lián)”概念中,“造物”的廠商千千萬(wàn),各自接入網(wǎng)絡(luò)的方式又五花八門。所以在絕大部分情況下,即便萬(wàn)物真能接入網(wǎng)絡(luò),體驗(yàn)也是割裂的。

華為的“萬(wàn)物互聯(lián)”實(shí)現(xiàn)方式有些另辟蹊徑的意思:分布式技術(shù)通過(guò)“分布式軟總線”,將硬件資源融合為硬件池,不僅實(shí)現(xiàn)硬件互聯(lián),而且讓硬件資源可以相互利用。典型比如WPS與華為終端分布式技術(shù)聯(lián)手打造的分布式文件,可以手機(jī)中的文檔,可以在PC上直接查看、編輯、保存,提升跨終端工作效率。

5月27日,華為在線上舉辦了一場(chǎng)HDD華為終端分布式生態(tài)技術(shù)交流會(huì),除了華為自己針對(duì)這種分布式生態(tài)的技術(shù)講解和發(fā)展現(xiàn)狀,也拉來(lái)了不少第三方開(kāi)發(fā)者講述接入生態(tài)的價(jià)值和過(guò)程。我們也期望通過(guò)這篇文章,面向開(kāi)發(fā)者談?wù)勅A為生態(tài)究竟是怎么回事,以及要加入生態(tài),會(huì)不會(huì)特別麻煩。

分布式技術(shù)能做到什么?

我們借用一個(gè)具體的例子來(lái)看看,分布式技術(shù)究竟有哪些能力??拼笥嶏w的辦公本應(yīng)該是比較早接入到華為分布式生態(tài)中的一類產(chǎn)品。主要解決的問(wèn)題是跨設(shè)備傳輸文件,就是在手機(jī)和辦公本之間做筆記、網(wǎng)文、圖書(shū)等的分享。

而科大訊飛在智能辦公本中,期望解決的問(wèn)題是:

- 辦公本不能拍照(受限于電子墨水屏的刷新率),那么利用手機(jī)的攝像頭,就能直接將筆記、教案拍攝存儲(chǔ)在辦公本里;

- 在手機(jī)上看到的各種網(wǎng)文、圖書(shū)可以方便地在辦公本上觀看;

- 當(dāng)然,其中還有一些數(shù)據(jù)安全的考量,比如說(shuō)用戶不希望把重要的筆記同步到互聯(lián)網(wǎng)上。

而在雙方合作后,華為終端分布式技術(shù)Share Kit便能夠解決這些問(wèn)題,其采用華為私有傳輸協(xié)議,實(shí)現(xiàn)一鍵分享和更多的數(shù)據(jù)互通。在科大訊飛的辦公本上,其特性至少包括了快速發(fā)現(xiàn)設(shè)備;PAKE密鑰交換做到數(shù)據(jù)安全交換;快速信道能力協(xié)商,根據(jù)業(yè)務(wù)調(diào)整物理通路來(lái)實(shí)現(xiàn)高速傳輸。

在具體開(kāi)發(fā)的Share Kit集成過(guò)程里,科大訊飛辦公本涉及到集成發(fā)送和接收功能,除了最上層Launcher集成Share Kit 接口,還需要在HAL(硬件抽象層)和framework層做一些適配??拼笥嶏w方面則表示,針對(duì)framework和HAL層,華為有提供代碼修改流程圖,可以非常輕松地搞定;而且即便集成階段遇到問(wèn)題,華為也提供服務(wù)支持,可以共同解決問(wèn)題。

對(duì)于很多硬件廠商來(lái)說(shuō),如果只需實(shí)現(xiàn)發(fā)送功能,那么整個(gè)開(kāi)發(fā)過(guò)程會(huì)更簡(jiǎn)單,只需上層Launcher集成Share Kit 接口即可。

分布式生態(tài)能力還在擴(kuò)充

除了Share Kit外,CaaS Kit是另外一個(gè)典型的分布式Kit,比如接入了CaaSKit的無(wú)人機(jī)產(chǎn)品,可以直接在無(wú)人機(jī)APP應(yīng)用內(nèi)撥打暢連視頻通話,無(wú)人機(jī)鏡頭拍攝的畫面可直接作為視頻來(lái)源顯示在對(duì)方的屏幕上;Drift運(yùn)動(dòng)相機(jī)利用DeviceVirtualization Kit能力,可以在運(yùn)動(dòng)的時(shí)候發(fā)起暢連通話并將鏡頭一鍵轉(zhuǎn)移到Drift鏡頭,讓對(duì)方體驗(yàn)第一運(yùn)動(dòng)視角帶來(lái)的緊張刺激;極米投影儀在集成Cast+Kit后,為用戶帶來(lái)流暢、高清的家庭娛樂(lè)投屏體驗(yàn)。

在理解了華為的分布式生態(tài)究竟是什么,以及能做什么以后。接下來(lái)我們以其中的DeviceVirtualization Kit和Cast+Kit為例,簡(jiǎn)單談?wù)勔獙⑦@些能力接入到自己的應(yīng)用或設(shè)備中,具體過(guò)程和易用性如何,畢竟易用性是吸引開(kāi)發(fā)者的一大重點(diǎn)。

從0 開(kāi)始接入終端分布式

在前期準(zhǔn)備階段,開(kāi)發(fā)者需要在線提交申請(qǐng),華為會(huì)把相應(yīng)的SDK提供給開(kāi)發(fā)者。開(kāi)發(fā)可以選擇華為的DevEco Studio——這是一個(gè)全流程覆蓋的IDE。當(dāng)前的beta版DevEco Studio需要在開(kāi)發(fā)者聯(lián)盟做申請(qǐng);也可以選擇Android Studio。

通過(guò)DevEco Studio的Kit Manager簡(jiǎn)單勾選Kit、添加依賴庫(kù)之后,就進(jìn)入開(kāi)發(fā)階段了。

(1)DeviceVirtualization Kit

DeviceVirtualization Kit(以下簡(jiǎn)稱DV Kit)能夠?qū)⒏浇脑O(shè)備或組件轉(zhuǎn)換為手機(jī)的虛擬組件,將其能力作為手機(jī)的能力來(lái)使用。比如說(shuō)外部的攝像頭、音箱、顯示器、話筒,甚至如心率傳感器這類設(shè)備組件,令其成為手機(jī)的眼睛、嘴巴、耳朵等等。

這里從應(yīng)用開(kāi)發(fā)者的角度來(lái)談一談接入過(guò)程。有關(guān)前期在開(kāi)發(fā)者聯(lián)盟的注冊(cè)、獲取簽名證書(shū)指紋以及向華為方的接口權(quán)限申請(qǐng)這里不再贅述。這里著重說(shuō)接入過(guò)程。首先是聲明虛擬外設(shè)的使用權(quán)限,以及聲明該應(yīng)用調(diào)用DV Kit對(duì)應(yīng)接口需要的權(quán)限,比如攝像頭、音頻、身體傳感器的權(quán)限等。申請(qǐng)不同的Android權(quán)限,在AndroidMenifest.xml文件中添加相應(yīng)權(quán)限,例如:

<uses-permission android:name="android.permission.CAMERA"/>

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

<uses-permission android:name="com.huawei.permission.DISTRIBUTED_VIRTUALDEVICE"/>

這里申請(qǐng)的是虛擬攝像頭、虛擬麥克風(fēng)對(duì)應(yīng)的Android權(quán)限;最后一行是在應(yīng)用需要使用外部的虛擬分布式外設(shè)時(shí),所需申請(qǐng)的權(quán)限。

DV Kit開(kāi)發(fā)基本方法是,首先創(chuàng)建基礎(chǔ)DV Kit對(duì)象,并連接后端服務(wù)進(jìn)行初始化;通過(guò)該對(duì)象獲取VirtualDeviceManager服務(wù)。通過(guò)VirtualDeviceManager服務(wù)可以發(fā)現(xiàn)當(dāng)前手機(jī)能夠控制的虛擬設(shè)備。比如前文中的例子,VirtualDeviceManager服務(wù)發(fā)現(xiàn)Drift運(yùn)動(dòng)相機(jī),并返回運(yùn)動(dòng)相機(jī)當(dāng)前支持的是Camera(攝像頭)、Speaker(揚(yáng)聲器)能力。

按照上圖思路,首先初始化連接DV Kit服務(wù),服務(wù)初始化結(jié)果通過(guò)onConnect回調(diào)返回。連接成功后,調(diào)用getKitService獲取VirtualDeviceManager服務(wù)實(shí)例,用于控制虛擬設(shè)備:

//獲取DvKit對(duì)象并連接DvKit服務(wù)

DvKit.getInstance().connect(getApplicationContext(), new IDvKitConnectCallback() {

//服務(wù)連接成功后的回調(diào)通知

@Override

public void onConnect(int result) {

addLog("msdp service connect");

mVirtualDeviceManager = (VirtualDeviceManager) DvKit.getInstance().getKitService(VIRTUAL_DEVICE_CLASS);

mVirtualDeviceManager.subscribe(EnumSet.of(VIRTUALDEVICE), observer);

}

//服務(wù)斷開(kāi)后的回調(diào)通知

@Override

public void onDisconnect() {

addLog("msdp service disconnect");

}

});

接下來(lái)就是設(shè)備發(fā)現(xiàn),如前文所述連接成功,獲取到VirtualDeviceManager服務(wù),應(yīng)用就能調(diào)用VirtualDeviceManager服務(wù)的startDiscovery接口用于發(fā)現(xiàn)周圍的可用設(shè)備。發(fā)現(xiàn)的設(shè)備會(huì)通過(guò)IDiscoveryCallback回調(diào)的onFound接口返回:

//開(kāi)始發(fā)現(xiàn)設(shè)備

mVirtualDeviceManager.startDiscovery(new IDiscoveryCallback() {

//設(shè)備發(fā)現(xiàn)時(shí)的回調(diào)接口

@Override

public void onFound(VirtualDevice device, int state) {

if (device == null) {

addLog("onDevice callback but device is null");

} else {

HwLog.d(TAG, "onDevice Found: " + Util.hideSensitiveInfo(device.getDeviceId()) + " Name: "

+ device.getDeviceName() + " Type:" + device.getDeviceType());

if (!mVirtualDeviceMap.containsKey(device.getDeviceId())) {

addLog("onDevice Found: " + device.getDeviceId() + " Name: " + device.getDeviceName() + " Type:"

+ device.getDeviceType());

mVirtualDeviceMap.put(device.getDeviceId(), device);

handler.sendMessage(handler.obtainMessage(DEVICE_ADD, device));

}

}

}

//發(fā)現(xiàn)狀態(tài)變更的回調(diào)通知

@Override

public void onState(int state) {

}

});

在發(fā)現(xiàn)虛擬設(shè)備之后,應(yīng)用就可以調(diào)用虛擬設(shè)備的getDeviceCapability()接口獲取設(shè)備支持能力,按需選擇具體的能力。具體是調(diào)用enableVirtualDevice來(lái)使能所需使能的設(shè)備和能力,支持同時(shí)傳入多個(gè)能力。應(yīng)用使能的結(jié)果可以通過(guò)subscribe接口傳入的回調(diào)對(duì)象來(lái)獲得:

mVirtualDeviceManager.enableVirtualDevice(deviceId, EnumSet.of(CAMARA), null);

//調(diào)用subscribe時(shí)傳入的observer對(duì)象

private IVirtualDeviceObserver observer = new IVirtualDeviceObserver() {

//虛擬設(shè)備狀態(tài)變化時(shí)的回調(diào)通知

@Override

public void onDeviceStateChange(VirtualDevicevirtualDevice, intreturncode) {

}

//虛擬設(shè)備能力狀態(tài)變化時(shí)的回調(diào)通知

@Override

public void onDeviceCapabilityStateChange(VirtualDevicevirtualDevice, Capability capability, intreturncode) {

if (returncode == EventType.EVENT_DEVICE_CAPABILITY_ENABLE) {

//當(dāng)設(shè)備能力使能成功時(shí),應(yīng)用處理使能成功流程

onEnable(virtualDevice, capability);

} else if (returncode == EventType.EVENT_DEVICE_CAPABILITY_DISABLE) {

//當(dāng)設(shè)備能力去使能成功時(shí),應(yīng)用處理去使能成功流程

onDisable(virtualDevice, capability);

} else {

//當(dāng)虛擬設(shè)備能力狀態(tài)異常時(shí),應(yīng)用應(yīng)處理異常流程

onError(virtualDevice, capability, returncode);

}

}

};

這里是以虛擬Camera能力為例,在虛擬Camera能力接入后,應(yīng)用可以通過(guò)getData接口來(lái)獲取虛擬設(shè)備(比如Drift運(yùn)動(dòng)相機(jī))的虛擬Camera id。應(yīng)用隨后就能和傳統(tǒng)獲取手機(jī)的本地前后置攝像頭一樣,來(lái)獲取虛擬Camera的屬性信息(getCameraCharacteristics),以及打開(kāi)虛擬Camera(openCamera),示例如下:

//通過(guò)虛擬設(shè)備的getData接口獲取設(shè)備虛擬Camera的ID

String cameraId = device.getData(Constants.ANDROID_CAMERAID_FRONT);

//使用CameraManager的getCameraCharacteristics接口獲取虛擬Camera的屬性信息

CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);

CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);

//使用CameraManager的openCamera接口打開(kāi)虛擬Camera

manager.openCamera(cameraId, mStateCallback, null)

“去使能”是通過(guò)調(diào)用disableVirtualDevice接口來(lái)實(shí)現(xiàn)的,比如去使能攝像頭能力:

mVirtualDeviceManager.disableVirtualDevice(deviceId, EnumSet.of(CAMERA));

整體DV Kit提供服務(wù)的斷連,釋放底層資源:

DvKit.getInstance().disConnect();

另外各種應(yīng)用的具體實(shí)現(xiàn)也各有不同,例如有些可能需要使用虛擬Display,有些則需要虛擬Sensor(如Drift Life應(yīng)用),或者使用本地消息通知等。這在華為開(kāi)發(fā)者文檔中都有比較詳細(xì)的介紹,這里不再一一列舉。

整個(gè)過(guò)程還是比較清晰和便捷的,對(duì)于一般開(kāi)發(fā)者而言,代碼難度也不高;其流程對(duì)于App開(kāi)發(fā)的整體業(yè)務(wù)存在的影響實(shí)際上都是比較小的,這是融入分布式生態(tài)比較便利的體現(xiàn)。

(2)Cast+ Kit

在日常生活中,我們經(jīng)常需要投屏玩游戲、看電影等方式實(shí)現(xiàn)跨屏幕協(xié)同。而一些第三方廠商,如極米就有多款投影儀集成了華為終端分布式技術(shù)Cast+ Kit。從現(xiàn)場(chǎng)演示來(lái)看,令人印象比較深刻的就是低延遲,這對(duì)于投屏玩游戲還是相對(duì)重要的。

Cast+Kit在設(shè)備側(cè)需要與華為進(jìn)行合作協(xié)議簽署后獲取。對(duì)于設(shè)備側(cè)而言,開(kāi)發(fā)過(guò)程首先也是申請(qǐng)權(quán)限,包括允許訪問(wèn)網(wǎng)絡(luò)連接、獲取當(dāng)前WiFi接入狀態(tài)和熱點(diǎn)信息、獲取設(shè)備當(dāng)前WiFi頻率信息等。

上面這張圖給出了簡(jiǎn)略的調(diào)用流程。其大步驟分成了:首先做變量聲明和實(shí)例獲?。?/p>

private PlayerClientmPlayerClient;

private ProjectionDevicemProjectionDevice;

//獲取PlayerClient實(shí)例

mPlayerClient = PlayerClient.getInstance();

啟動(dòng)服務(wù)并注冊(cè)監(jiān)聽(tīng):實(shí)現(xiàn)IEventListener.Stub()

private IEventListenermCallback = new IEventListener.Stub() {

//上報(bào)連接狀態(tài)。

public booleanonEvent(inteventId, String type) {

//根據(jù)連接狀態(tài)進(jìn)行對(duì)應(yīng)的配置及邏輯處理。

return true;

}

//上報(bào)顯示相關(guān)事件。

public booleanonDisplayEvent(inteventId, DisplayInfodisplayInfo) {

//根據(jù)連接狀態(tài)進(jìn)行對(duì)應(yīng)的配置及邏輯處理。

return true;

}

};

啟動(dòng)服務(wù):

mPlayerClient.init(context);

注冊(cè)回調(diào)接口:

mPlayerClient.registerCallback(mCallback);

隨后進(jìn)行投屏業(yè)務(wù)相關(guān)設(shè)置,設(shè)置鑒權(quán)模式信息:

AuthInfoauthInfo = null;

if (needPassword) {

//密碼模式,設(shè)置6位密碼(需要支持混合密碼的能力)

authInfo = new AuthInfo(AuthInfo.AUTH_MODE_PWD);

authInfo.setAuthCode(password);

} else {

//PIN碼模式

authInfo = new AuthInfo(AuthInfo.AUTH_MODE_GENERIC);

}

booleanisAuthModeSuccessfullySet = mPlayerClient.setAuthMode(authInfo);

If (isAuthModeSuccessfullySet) {

//更新本地密碼 or 更新UI

}

設(shè)置大屏端設(shè)備的投屏能力,首先構(gòu)造HiSightCapability對(duì)象:

HiSightCapability capability = new HiSightCapability(1920, 1080, 1920, 1080);

設(shè)置投屏顯示幀率,默認(rèn)為30fps:

capability.setVideoFps(30);

根據(jù)平臺(tái)配置低時(shí)延策略:

capability.setMediaCodecConfigureFlag(2)

設(shè)置投屏能力:

mPlayerClient.setCapability(capability);

根據(jù)選用芯片的不同,可選用HiSightCapability提供的不同方法,設(shè)定平臺(tái)的解碼優(yōu)化參數(shù):

HiSightCapability.setMediaCodecConfigureFlag(int flag)

HiSightCapability. setMediaFormatInteger(String name, int value)

HiSightCapability. setMediaFormatFloat(String name, float value)

HiSightCapability. setMediaFormatLong(String name, long value)

HiSightCapability. setMediaFormatString(String name, String value)

配置大屏端設(shè)備信息,包括大屏端設(shè)備名稱、設(shè)備類型:

private DeviceInfomDeviceInfo = new DeviceInfo(mTvDeviceName, DeviceInfo. TYPE_TV);

并設(shè)置設(shè)備可被周圍的設(shè)備發(fā)現(xiàn):

mPlayerClient.setDiscoverable(true, mDeviceInfo);

在大屏設(shè)備首次收到移動(dòng)端連接請(qǐng)求后,會(huì)上報(bào)EVENT_ID_PIN_CODE_SHOW信息,并提供對(duì)端設(shè)備信息。在首次連接成功后,再次通過(guò)PIN碼模式發(fā)起連接請(qǐng)求時(shí),會(huì)跳出PIN碼鑒權(quán)步驟:

if (displayInfo != null) {

//設(shè)備連接需要的PIN碼

String pinCode = displayInfo.getPinCode();

//按照UX規(guī)范開(kāi)發(fā)PIN碼界面以展示PIN碼

showPinCode(pinCode, mProjectionDevice.getDeviceName());

//設(shè)置允許手機(jī)連接(用于不彈框讓用戶選擇的場(chǎng)景)

mPlayerClient.setConnectRequestChooseResult(new ConnectRequestChoice(

Constant.CONNECT_REQ_CHOICE_ALWAYS, mProjectionDevice));

}

在手機(jī)正確輸入PIN碼鑒權(quán)通過(guò)后,大屏端應(yīng)用會(huì)上報(bào)EVENT_ID_CONNECT_REQ信息,另外也包含移動(dòng)端設(shè)備信息:

if (displayInfo != null) {

//獲取請(qǐng)求連接的移動(dòng)端設(shè)備信息

mProjectionDevice = displayInfo.getProjectionDevice();

}

在EVENT_ID_CONNECT_REQ之后,會(huì)順序上報(bào)EVENT_ID_DEVICE_CONNECTED和EVENT_ID_PAUSED消息。PAUSED消息下,大屏端可以設(shè)置Surface并開(kāi)始播放投屏視頻流,為加快起播速度,也可提前(如EVENT_ID_CONNECT_REQ消息下)啟動(dòng)投屏Acitivity和Surface的創(chuàng)建。

mProjectionDevice為Event_ID_CONNECT_REQ消息中從DisplayInfo中獲取的對(duì)端設(shè)備信息,可通過(guò)其獲取DeviceId,再通過(guò)DeviceID構(gòu)造TrackControl對(duì)象做投屏使用。投屏成功,大屏端將上報(bào)EVENT_ID_CASTING消息,標(biāo)識(shí)當(dāng)前正在投屏。

具體實(shí)現(xiàn)上,首先設(shè)計(jì)應(yīng)用投屏界面XML布局:

<com.huawei.castpluskit.HiSightSurfaceView

android:id="@+id/HiSightSurfaceView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_centerInParent="true" />

另外應(yīng)用層面,要求保證投屏過(guò)程中不能錄屏、截屏、錄音:

mHiView.setSecure(true);

再添加SurfaceHolder的回調(diào),在surfaceCreated監(jiān)聽(tīng)中設(shè)置投屏控件

SurfaceHoldersurfaceHolder = mHiView.getHolder();

surfaceHolder.addCallback(mSurfaceHolderCallback);

private SurfaceHolder.CallbackmSurfaceHolderCallback = new SurfaceHolder.Callback() {

@Override

public void surfaceCreated(SurfaceHolder holder) {

isSurfaceReady = true;

if(isReceivePaused) {

mPlayerClient.setHiSightSurface(mHiView.getHolder().getSurface());

}

}

}

最后開(kāi)始投屏:

mPlayerClient.play(new TrackControl(mProjectionDevice.getDeviceId()));

斷開(kāi)連接:

mPlayerClient.disconnectDevice(mProjectionDevice);

對(duì)絕大部分開(kāi)發(fā)者而言,這都是一個(gè)相當(dāng)簡(jiǎn)單快速的集成過(guò)程。從這些開(kāi)發(fā)者的代碼不難發(fā)現(xiàn),華為在Kit以及系統(tǒng)層面,為簡(jiǎn)化開(kāi)發(fā)難度,還是花了不少心思的。而對(duì)用戶來(lái)說(shuō),投屏質(zhì)量和效率都是能夠得到保證的,用戶不需要安裝app,也沒(méi)有復(fù)雜操作;而且延遲各方面的體驗(yàn)也都在同類的無(wú)線投屏方案中顯得比較靠譜——這些也是開(kāi)發(fā)者不需要關(guān)心的。

從DevEco Studio看華為的開(kāi)發(fā)生態(tài)

針對(duì)開(kāi)發(fā)流程,最后再談?wù)勀壳叭蕴幵赽eta階段的DevEco Studio工具。如前文所述這就是個(gè)來(lái)自華為的IDE,整體是為華為的全場(chǎng)景智慧化戰(zhàn)略設(shè)想所做的。面向的當(dāng)然包括了應(yīng)用開(kāi)發(fā)和設(shè)備開(kāi)發(fā),內(nèi)部集成了華為的分布式能力。

完整的DevEco Studio是基于Intellij開(kāi)源代碼,加上華為的開(kāi)放能力支持。另外華為也基于Android Studio做了DevEco Toolkit插件,作為另一種形態(tài)提供給開(kāi)發(fā)者使用。

DevEco Studio的某些特性,本身也是在為分布式生態(tài)構(gòu)建提供便利,這是在分布式能力接入本身就比較簡(jiǎn)單的情況下,所做的一些加分項(xiàng)。比如說(shuō):

前文就提到的,DevEco Studio針對(duì)這些分布式能力有集中管理和呈現(xiàn)的方案,開(kāi)發(fā)者可以直接查看、管理這些Kit,并且在有需要時(shí)通過(guò)勾選就將某個(gè)Kit融入到開(kāi)發(fā)中;甚至還能進(jìn)行Kit的一鍵升級(jí)操作。這很大程度上提供了開(kāi)發(fā)的便利性。

另外,所謂的“拖拽式生成API代碼”,即調(diào)用API功能的代碼樣例可以直接拖動(dòng)到代碼編輯區(qū)。若樣例代碼依賴某些特殊的包,則在拖動(dòng)操作后,會(huì)自動(dòng)引入依賴包、自動(dòng)生成頭部import。這些都還是頗具特色的。

在開(kāi)發(fā)周期的調(diào)測(cè)方面,華為提供了遠(yuǎn)程真機(jī),大概有5000多個(gè)華為機(jī)型,不同的系統(tǒng)版本、屏幕分辨率等可做調(diào)測(cè)。與此同時(shí),華為另外還提供了云測(cè)和DFX診斷服務(wù)、“非侵入式”的數(shù)據(jù)分析。

不言而喻,降低開(kāi)發(fā)難度——不管是完善IDE的體驗(yàn),還是降低接入Kit的技術(shù)難度——本質(zhì)上都是為了吸引更多的開(kāi)發(fā)者加入到這個(gè)生態(tài)中來(lái)?,F(xiàn)階段是華為1+8+N生態(tài)的擴(kuò)展期,華為期望構(gòu)建起的是以智能手機(jī)為中心,將所有周邊智能設(shè)備通過(guò)分布式能力串聯(lián)起來(lái)的生態(tài)。這是華為在萬(wàn)物互聯(lián)方面的龐大視野,也是華為對(duì)萬(wàn)物互聯(lián)樣貌的理解。

這樣的布局,顯然打破了智能手機(jī)自身生態(tài)的局限,也并不局限在單純的智能家居或者某種具體使用場(chǎng)景,描繪的是一幅令I(lǐng)oT真正構(gòu)成統(tǒng)一生態(tài)的圖景。現(xiàn)如今華為側(cè)打造了這一生態(tài)的基礎(chǔ)或平臺(tái),并正逐步補(bǔ)足和完善;而要讓生態(tài)真正活躍、豐富起來(lái),仍然要靠三方開(kāi)發(fā)者的共同努力,這是值得期待的。

打賞
聯(lián)系客服 投訴反饋  頂部