鸿蒙开发初体验
點(diǎn)擊上方 "程序員小樂(lè)"關(guān)注,?星標(biāo)或置頂一起成長(zhǎng)
每天凌晨00點(diǎn)00分,?第一時(shí)間與你相約
????
每日英文
When you can't remember why you're hurt, that's when you're healed.
有一天,當(dāng)你發(fā)現(xiàn)再也記不起為了什么而受傷,那就是痊愈之時(shí)。
每日掏心話
幸福來(lái)源于我們不再抱怨那些遇到的麻煩,而對(duì)沒(méi)有遇到的困難充滿感激,生活就是一種恩賜!
來(lái)自:傷心的豬大腸?| 責(zé)編:樂(lè)樂(lè)
鏈接:juejin.im/post/6871999738720288781
程序員小樂(lè)(ID:study_tech)第 1006?次推文
往日回顧:?實(shí)戰(zhàn):上億數(shù)據(jù)如何秒查
??? ?
? ?正文? ?
前言
2020年9月10號(hào),鴻蒙2.0(HarmonyOS 2.0)系統(tǒng)正式發(fā)布,鴻蒙2.0面向應(yīng)用開(kāi)發(fā)者發(fā)布Beta版本,在2020年9月10發(fā)布大屏,手表,車機(jī)版鴻蒙,2020年12月發(fā)布手機(jī)版鴻蒙。在2020年9月10日,鴻蒙開(kāi)源路標(biāo)面向內(nèi)存128KB-128MB終端設(shè)備;2021年10月,將面向4GB以上所有設(shè)備。
背景
作為一個(gè)安卓開(kāi)發(fā)者,能夠看到國(guó)產(chǎn)的操作系統(tǒng)的發(fā)布確實(shí)很興奮,興奮之余,更想要看看具體是怎么一回事,首先打開(kāi)官網(wǎng),看看官網(wǎng)該系統(tǒng)的定義:HarmonyOS是一款“面向未來(lái)”、面向全場(chǎng)景(移動(dòng)辦公、運(yùn)動(dòng)健康、社交通信、媒體娛樂(lè)等)的分布式操作系統(tǒng)。在傳統(tǒng)的單設(shè)備系統(tǒng)能力的基礎(chǔ)上,HarmonyOS提出了基于同一套系統(tǒng)能力、適配多種終端形態(tài)的分布式理念,能夠支持多種終端設(shè)備。
對(duì)應(yīng)用開(kāi)發(fā)者而言,HarmonyOS采用了多種分布式技術(shù),使得應(yīng)用程序的開(kāi)發(fā)實(shí)現(xiàn)與不同終端設(shè)備的形態(tài)差異無(wú)關(guān),降低了開(kāi)發(fā)難度和成本。這能夠讓開(kāi)發(fā)者聚焦上層業(yè)務(wù)邏輯,更加便捷、高效地開(kāi)發(fā)應(yīng)用。該優(yōu)點(diǎn)在5G這個(gè)萬(wàn)物互聯(lián)的時(shí)代具有著巨大的優(yōu)勢(shì)。
安裝DevEco Studio
接下來(lái)下載DevEco Studio(IDE/開(kāi)發(fā)工具)來(lái)進(jìn)行體驗(yàn)一下軟件的開(kāi)發(fā),在這里可以看到目前的IDE只有Windows系統(tǒng)的(windows 10 64位),安裝過(guò)程可能中會(huì)出現(xiàn)gradle的安裝失敗,記得添加代理,在用戶目錄(打開(kāi)“此電腦”,在文件夾地址欄中輸入%userprofile%,進(jìn)入個(gè)人數(shù)據(jù)界面。)下創(chuàng)建gradle.properties文件,文件中添加,端口是代理的端口。
systemProp.https.proxyPort=63729 systemProp.http.proxyHost=127.0.0.1 systemProp.https.proxyHost=127.0.0.1 systemProp.http.proxyPort=63729gradle安裝成功,但在編譯過(guò)程中可能出現(xiàn)build失敗,錯(cuò)誤如下:
ERROR:?Cause:?mirrors.huaweicloud.com:443?failed?to?respond解決方式就是把所有的代理先關(guān)掉,然后你就會(huì)發(fā)現(xiàn)如絲般順滑。安裝完DevEco Studio后,打開(kāi)后可以看到界面和Android Studio非常相似。
布局開(kāi)發(fā)
一切看起來(lái)非常的熟悉,可以使用Java或JS等語(yǔ)言進(jìn)行開(kāi)發(fā),布局可以通過(guò)XML創(chuàng)建,size單位是vp。
<?xml?version="1.0"?encoding="utf-8"?> <DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:width="match_parent"ohos:height="match_parent"ohos:orientation="vertical"ohos:padding="32"><Textohos:id="$+id:text"ohos:width="match_content"ohos:height="match_content"ohos:layout_alignment="horizontal_center"ohos:text="My?name?is?Jackie."ohos:text_size="25vp"/><Buttonohos:id="$+id:button"ohos:width="match_content"ohos:height="match_content"ohos:layout_alignment="horizontal_center"ohos:text="My?name?is?Jackie."ohos:text_size="50"/> </DirectionalLayout>也可以通過(guò)Java代碼直接創(chuàng)建,點(diǎn)擊事件都是如此的親切。
@Override public?void?onStart(Intent?intent)?{super.onStart(intent);//?步驟1?聲明布局DirectionalLayout?directionalLayout?=?new?DirectionalLayout(context);//?步驟2?設(shè)置布局大小directionalLayout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT);directionalLayout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT);//?步驟3?設(shè)置布局屬性及ID(ID視需要設(shè)置即可)directionalLayout.setOrientation(Component.VERTICAL);directionalLayout.setPadding(32,?32,?32,?32);Text?text?=?new?Text(context);text.setText("My?name?is?Text.");text.setTextSize(50);text.setId(100);//?步驟4.1?為組件添加對(duì)應(yīng)布局的布局屬性DirectionalLayout.LayoutConfig?layoutConfig?=?new?DirectionalLayout.LayoutConfig(LayoutConfig.MATCH_CONTENT,LayoutConfig.MATCH_CONTENT);layoutConfig.alignment?=?LayoutAlignment.HORIZONTAL_CENTER;text.setLayoutConfig(layoutConfig);//?步驟4.2?將Text添加到布局中directionalLayout.addComponent(text);//?類似的添加一個(gè)ButtonButton?button?=?new?Button(context);layoutConfig.setMargins(0,?50,?0,?0);button.setLayoutConfig(layoutConfig);button.setText("My?name?is?Jackie.");button.setTextSize(50);button.setId(100);ShapeElement?background?=?new?ShapeElement();background.setRgbColor(new?RgbColor(0,?125,?255));background.setCornerRadius(25);button.setBackground(background);button.setPadding(10,?10,?10,?10);button.setClickedListener(new?Component.ClickedListener()?{@Override//?在組件中增加對(duì)點(diǎn)擊事件的檢測(cè)public?void?onClick(Component?Component)?{//?此處添加按鈕被點(diǎn)擊需要執(zhí)行的操作}});directionalLayout.addComponent(button);//?步驟5?將布局作為根布局添加到視圖樹(shù)中super.setUIContent(directionalLayout); }首頁(yè)的布局如下,通過(guò)Java代碼創(chuàng)建。
????@Overridepublic?void?onStart(Intent?intent)?{super.onStart(intent);System.out.println("onStart");LayoutConfig?config?=?new?LayoutConfig(LayoutConfig.MATCH_PARENT,?LayoutConfig.MATCH_PARENT);myLayout.setLayoutConfig(config);ShapeElement?element?=?new?ShapeElement();element.setRgbColor(new?RgbColor(255,?255,?255));myLayout.setBackground(element);Text?text?=?new?Text(this);text.setLayoutConfig(config);text.setText("CT?Jackie");text.setTextColor(new?Color(0xFF000000));text.setTextSize(50);text.setTextAlignment(TextAlignment.CENTER);myLayout.addComponent(text);super.setUIContent(myLayout);}效果如下:
生命周期
下面再來(lái)看看主界面的生命周期,實(shí)現(xiàn)了ILifecycle接口,生命周期狀態(tài)一共有七種。
搜索公眾號(hào)程序員小樂(lè)回復(fù)關(guān)鍵字“offer”,獲取算法面試題和答案。
public?static?enum?Event?{UNDEFINED,ON_START,ON_INACTIVE,ON_ACTIVE,ON_BACKGROUND,ON_FOREGROUND,ON_STOP;private?Event()?{}}界面啟動(dòng)時(shí)調(diào)用onStart()和onActive()。
2020-09-13?21:42:10.266?25547-25547[表情]?I/System.out:?onStart 2020-09-13?21:42:10.284?25547-25547[表情]?I/System.out:?onActive點(diǎn)擊返回鍵時(shí)調(diào)用。
2020-09-13?21:42:35.847?25547-25547/com.example.helloworld?I/System.out:?onInactive 2020-09-13?21:42:35.917?25547-25547/com.example.helloworld?I/System.out:?onBackground 2020-09-13?21:42:35.920?25547-25547/com.example.helloworld?I/System.out:?onStop至于UNDEFINED和ON_FOREGROUND暫時(shí)還不了解。
Gradle任務(wù)(Task)
甚至連gradle的Task都非常類似,打包命令是assembleDebug/Release。
>?Task?:entry:preBuild >?Task?:entry:compileDebugNativeWithCmake >?Task?:entry:collectDebugDependencies >?Task?:entry:mergeDebugResources >?Task?:entry:mergeDebugProfile >?Task?:entry:compileDebugResources >?Task?:entry:compileDebugIdl >?Task?:entry:compileDebugRFile >?Task?:entry:processDebugJavaResource >?Task?:entry:compileDebugJavaWithJavac >?Task?:entry:mergeDebugJavaResource >?Task?:entry:generateDebugClassesJar >?Task?:entry:mergeDebugProjectDex >?Task?:entry:generateDebugShell >?Task?:entry:processDebugShellManifest >?Task?:entry:compileDebugShellResources >?Task?:entry:linkDebugShellResources >?Task?:entry:compileDebugShellJavaWithJavac >?Task?:entry:mergeDebugShellDex >?Task?:entry:packageDebugShell >?Task?:entry:packageDebugSimplifyShell >?Task?:entry:validateDebugSigning >?Task?:entry:signDebugShell >?Task?:entry:packageDebugHap >?Task?:entry:signDebugHap >?Task?:entry:assembleDebug配置文件
配置文件是一個(gè)命名為config.json的文件,配置應(yīng)用的一些信息。
{"app":?{"bundleName":?"com.example.helloworld","vendor":?"example","version":?{"code":?1,"name":?"1.0"},"apiVersion":?{"compatible":?3,"target":?3}},"deviceConfig":?{"default":?{}},"module":?{"package":?"com.example.helloworld","name":?".HelloWorld","reqCapabilities":?["video_support"],"deviceType":?["wearable"],"distro":?{"deliveryWithInstall":?true,"moduleName":?"entry","moduleType":?"entry"},"abilities":?[{"skills":?[{"entities":?["entity.system.home"],"actions":?["action.system.home"]}],"orientation":?"landscape","formEnabled":?false,"name":?"com.example.helloworld.MainAbility","icon":?"$media:icon","description":?"$string:mainability_description","label":?"HelloWorld","type":?"page","launchType":?"standard"}]} }仔細(xì)看這個(gè)文件會(huì)越來(lái)越覺(jué)得這就是AndroidManifest.xml的json翻譯版。
反編譯角度看鴻蒙
既然看起來(lái)這么像安卓,我看來(lái)看看它編譯后的產(chǎn)物是什么,是不是也能像android一樣反編譯得到dex文件?
編譯后得到的是一個(gè)xxx.hap文件。
修改它的后綴名為.zip,解壓后可以看到里面有熟悉的assets,dex,apk文件等,把這個(gè)apk文件安裝后發(fā)現(xiàn)并不能使用。
搜索公眾號(hào)程序員小樂(lè)回復(fù)關(guān)鍵字“Java”,獲取Java面試題和答案。
下面我們先反編譯這個(gè)classes.dex文件第一個(gè)dex反編譯后出現(xiàn)錯(cuò)誤。
~/Desktop/fanbianyi/dex2jar-2.0???sh?d2j-dex2jar.sh?classes3.dex dex2jar?classes3.dex?->?./classes3-dex2jar.jar com.googlecode.d2j.DexException:?not?support?version.at?com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:151)at?com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:211)at?com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:104)at?com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:288)at?com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:32)原因是我們的工具版本太低了,解決方案就是升級(jí),升級(jí)版本后反編譯成功后為classes3-dex2jar.jar,打開(kāi)可以看到:
這里多了個(gè)ResourceTable文件,就是我們的資源id表。這里的dex文件包含的是我們開(kāi)發(fā)的代碼。
華為開(kāi)源鴻蒙OS 2.0,外國(guó)網(wǎng)友怎么看?
下面我們來(lái)反編譯apk文件,解壓后可以看到,里面是我們熟悉的內(nèi)容:
AndroidManifest.xml文件如下:
反編譯該dex文件可以看到,MainAbilityShellActivity最終是繼承了AbilityShellActivity:
ShellHelloWorld其實(shí)一個(gè)Application。
至此感覺(jué).hap文件像是對(duì)apk的一個(gè)包裝,最終的邏輯看起來(lái)好像還是android那套,或者說(shuō)android開(kāi)發(fā)人員上手會(huì)非常快,可能也是為將來(lái)兼容android系統(tǒng)做準(zhǔn)備。
分布式,跨設(shè)備遷移
跨設(shè)備遷移
下面來(lái)看看該系統(tǒng)的一些亮點(diǎn),比如跨設(shè)備遷移,聽(tīng)起來(lái)是個(gè)很牛逼炫酷的功能,比如把你的手機(jī)屏幕直接遷移到電腦或者pad上面以及進(jìn)行一些操作等等。
跨設(shè)備遷移(下文簡(jiǎn)稱“遷移”)支持將Page在同一用戶的不同設(shè)備間遷移,以便支持用戶無(wú)縫切換的訴求。以Page從設(shè)備A遷移到設(shè)備B為例,遷移動(dòng)作主要步驟如下:?
設(shè)備A上的Page請(qǐng)求遷移。
HarmonyOS處理遷移任務(wù),并回調(diào)設(shè)備A上Page的保存數(shù)據(jù)方法,用于保存遷移必須的數(shù)據(jù)。
HarmonyOS在設(shè)備B上啟動(dòng)同一個(gè)Page,并回調(diào)其恢復(fù)數(shù)據(jù)方法。
開(kāi)發(fā)者可以參考以下詳細(xì)步驟開(kāi)發(fā)具有遷移功能的Page。
分布式任務(wù)調(diào)度
在HarmonyOS中,分布式任務(wù)調(diào)度平臺(tái)對(duì)搭載HarmonyOS的多設(shè)備構(gòu)筑的“超級(jí)虛擬終端”提供統(tǒng)一的組件管理能力,為應(yīng)用定義統(tǒng)一的能力基線、接口形式、數(shù)據(jù)結(jié)構(gòu)、服務(wù)描述語(yǔ)言,屏蔽硬件差異;支持遠(yuǎn)程啟動(dòng)、遠(yuǎn)程調(diào)用、業(yè)務(wù)無(wú)縫遷移等分布式任務(wù)。
分布式任務(wù)調(diào)度平臺(tái)在底層實(shí)現(xiàn)Ability。
啟動(dòng)和關(guān)閉:向開(kāi)發(fā)者提供管理遠(yuǎn)程Ability的能力,即支持啟動(dòng)Page模板的Ability,以及啟動(dòng)、關(guān)閉Service和Data模板的Ability。
連接和斷開(kāi)連接:向開(kāi)發(fā)者提供跨設(shè)備控制服務(wù)(Service和Data模板的Ability)的能力,開(kāi)發(fā)者可以通過(guò)與遠(yuǎn)程服務(wù)連接及斷開(kāi)連接實(shí)現(xiàn)獲取或注銷跨設(shè)備管理服務(wù)的對(duì)象,達(dá)到和本地一致的服務(wù)調(diào)度。
遷移能力:向開(kāi)發(fā)者提供跨設(shè)備業(yè)務(wù)的無(wú)縫遷移能力,開(kāi)發(fā)者可以通過(guò)調(diào)用Page模板Ability的遷移接口,將本地業(yè)務(wù)無(wú)縫遷移到指定設(shè)備中,打通設(shè)備間壁壘。
總結(jié)
個(gè)人感覺(jué)鴻蒙的開(kāi)發(fā)是很接近Android開(kāi)發(fā)者的習(xí)慣,對(duì)于Android開(kāi)發(fā)人員來(lái)說(shuō)極易上手,但是Android現(xiàn)有的多設(shè)備協(xié)同支持做的很差,鴻蒙做了一些封裝和擴(kuò)展屏蔽掉底層的差異,在多設(shè)備,萬(wàn)物互聯(lián)的時(shí)代具有很大的優(yōu)勢(shì),越是多設(shè)備協(xié)同,鴻蒙越具有優(yōu)勢(shì)。
歡迎在留言區(qū)留下你的觀點(diǎn),一起討論提高。如果今天的文章讓你有新的啟發(fā),歡迎轉(zhuǎn)發(fā)分享給更多人。歡迎加入程序員小樂(lè)技術(shù)交流群,在后臺(tái)回復(fù)“加群”或者“學(xué)習(xí)”即可。
猜你還想看
阿里、騰訊、百度、華為、京東最新面試題匯集
優(yōu)秀的 Java 項(xiàng)目,代碼都是如何分層的?
審閱“史上“最爛的代碼
IDEA 上位?不!Eclipse Theia 1.0 發(fā)布!
嘿,你在看嗎?
總結(jié)
- 上一篇: Cesium介绍
- 下一篇: IOS开发笔记之推广安装(用网页判断是否