由於要驗證個人幾個應用可否移植到鴻蒙,仔細看了下鴻蒙,固然做爲開發者,確定要從開發環境看起。java
鴻蒙OS的開發工具叫作DevEco Studio,和Android Studio同樣,也是基於IDEA。程序員
由於構建工具是gradle,因此天然在命令行用gradlew assembleDebug試了一下,果真開始編譯了:shell
看下輸出文件:json
39k的hap文件,這就是一個純粹的鴻蒙應用,對應安卓的apk,這是沒有簽名的debug版本,用7zip打開這個hap文件看看:服務器
這幾個文件都能理解,安卓的manifest文件變成了config.json。但讓我沒想到的是,這裏竟然包了一個apk文件。試着把這個apk解出來,再用7zip打開,還真是個標準apk網絡
既然是apk,天然放到普通安卓手機上試一下咯,安裝沒有問題,圖標也看到了,點開...閃退,用adb看一下日誌:app
04-09 15:12:53.334 7450 7450 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "ohos.abilityshell.HarmonyApplication" on path: DexPathList[[zip file "/data/app/com.example.hello_hm-THrK3d5xftGaJlBnx92w_A==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.hello_hm-THrK3d5xftGaJlBnx92w_A==/lib/arm64, /system/lib64, /product/lib64]] 04-09 15:12:53.334 7450 7450 E AndroidRuntime: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:230) 04-09 15:12:53.334 7450 7450 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:379) 04-09 15:12:53.334 7450 7450 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:312) 04-09 15:12:53.334 7450 7450 E AndroidRuntime: ... 16 more
ClassNotFound,看來這個apk是不能跑在純安卓上的,只能跑在鴻蒙上,那這個apk是什麼意思? 也許是爲了鴻蒙的底層是安卓時,能夠跑這個apk達到讓底層安卓管理鴻蒙應用的目的吧,反過來也就是說,若是哪一天鴻蒙徹底脫離安卓,天然就不須要這個apk了,這只是個人想法,用adb驗證一下。工具
能夠看到,經過adb shell能夠看到這個鴻蒙應用,用dumpsys能夠看到當前的Activity叫作MainAbilityShellActivity,但這是咱們代碼裏沒有的東西,從哪裏來的?應該就是上面這個自動生成的apk跑出來的。佈局
引用一下官方文檔,鴻蒙應用是由一個或多個HAP(HarmonyOS Ability Package)包以及屬性文件pack.info文件組成。這點和安卓不一樣,安卓一個應用是一個apk。性能
HAP是Ability的部署包,HarmonyOS應用代碼圍繞Ability組件展開,它是由一個或多個Ability組成。Ability分爲兩種類型:FA(Feature Ability,中文名稱:元程序)和PA(Particle Ability,中文名稱:元服務)。FA/PA是應用的基本組成單元,可以實現特定的業務功能。FA有UI界面,而PA無UI界面。
官方語言挺繞口,個人理解,Ability就是組件,FA對應安卓的Activity,PA對應安卓Service。Ability加上資源文件打包起來就是hap,對應安卓的apk。
我沒有運行鴻蒙的真機,只能選擇模擬器運行,這個模擬器是雲加載的,須要先驗證華爲開發者帳號,而後就能夠看到了:
四種模擬器,表明四種設備類型,我要驗證個人手機應用,天然就選了P40,啓動很快,也不佔用本地內存,很好。點擊IDE裏的調試,就能夠運行到模擬器中了。模擬器上有個倒計時,應該是雲端模擬器不能佔用太長的時間,超時會被釋放。
嘗試了一下調試,怎麼也設置不了斷點,按照文檔作了各類設置都不行,只好去華爲開發者網站提交一個問題,很快次日收到了回覆,問題修復並提供了升級包下載。同時看了一下華爲的文檔,若是要真機調試,須要先申請調試證書,並配置簽名信息,也就是說,估計華爲的簽名策略會收緊,向蘋果看齊,將來鴻蒙的應用市場可能只有官方一家。
個人幾個應用雖然是普通安卓應用,但因爲都用到了比較多的安卓服務和硬件特性,應該能比較能說明鴻蒙的兼容性,在看個人App以前,先看下這個模擬器的版本,後面兼容性測試都是基於這個版本。
先來看碎片記憶,這個應用使用了懸浮窗和桌面小部件,用adb安裝一下,沒有問題,運行並導入詞庫,碎片記憶的懸浮窗已經跑起來了。
再想試試桌面小部件,但是雲端模擬器不支持長按桌面加小部件,只支持雙指捏合,這應該是EMUI11的一個改動,在雲端模擬器,沒辦法觸發雙指,因此暫時還看不到小部件的支持狀況。
再試試隱祕參數,這是一個硬件檢測和性能測試工具,使用了不少安卓底層的API,在安裝以前我是有點懷疑它可否正常運行的,但實際狀況是:
不只正常運行,還竟然測出了顯示屏和觸控廠商,這在純安卓版的P40上都測不出的,兼容性看起來沒什麼問題。性能部分就有意思了,SOC跑分急劇下降,顯示刷新率20hz,內存、存儲性能所有降低的厲害,按道理,若是隻是遠程真機,不該該下降性能,只是有網絡延遲,因此估計是模擬器致使的,彷佛是一個跑在P40物理機上的虛擬機。
最後看下微動手勢,這個一個須要無障礙服務和陀螺儀傳感器才能工做的的手勢工具。
配置無障礙服務沒有問題,但惋惜由於在雲端,沒辦法觸發陀螺儀手勢,看來這個只能經過真機才能驗證了。但從幾個應用總體來看,當前鴻蒙在兼容apk方面沒什麼問題。
回頭再來看下鴻蒙工程文件,整個工程有些部分和安卓仍是類似的,這對於安卓程序員來講比較友好,能夠快速上手,有一些概念也能夠相互對照:
安卓 | 鴻蒙 | |
---|---|---|
項目配置 | AndroidManifest.xml | config.json |
應用標識 | package | bundle |
字符資源 | strings.xml | string.json |
調試shell | adb | hdc |
gradle配置 | build.gradle | build.gradle |
看一下項目的佈局文件和源碼,UI部分代碼須要徹底重寫了,不可能兼容安卓的Layout和控件了,大部分的API都不一致了,只是有些在安卓中能夠找到一個依稀的影子,但接口都是不同的。
這說明了一個問題,若是不是以安卓兼容模式運行,現有的安卓應用要想移植到鴻蒙,工做量仍是很大的,基本上須要徹底重寫。
整個上手的感受仍是不錯,IDE、文檔、模擬器都挺順暢的,hello-world對原安卓開發人員也保持了剛好的「熟悉」,這已經很是不錯了,做爲常常評估各類奇奇怪怪系統的開發者,一半以上的系統都是由於不成熟的hello-world把我嚇退的,這一點鴻蒙已經有一個好的起點。
在兼容性方面,看起來不用太擔憂,如今的鴻蒙由於自帶安卓,能夠運行apk,起碼從個人幾個App來看,除了沒法驗證的幾個地方,都沒有問題,固然將來若是鴻蒙剝離安卓,那就要考驗第三方的跟進度了,目前看,應用須要重寫才能兼容鴻蒙。