引用原文出处:https://zhuanlan.zhihu.com/p/371262225
原作者:name1e5s

前几天拆了个鸿蒙的 OTA 升级包,解包后发现那目录结构我太熟悉了,再随便看几个文件就明白了其实这鸿蒙就是安卓套壳。不过啊,我还是想知道除去 UI 上的修改,鸿蒙是否在 AOSP 的基础上改了部分内容,如果有,改了多少。今天晚上正好无事可做,就稍微看看解包的文件,找了找华为改了哪些内容。

结论

0. 鸿蒙手机版内核就是 Linux,没有什么乱七八糟的微内核

  1. 鸿蒙改了安卓的启动流程,多设置了个环境变量 MAPLE_RUNTIME,同时预先加载了一些自己的 Java 类
  2. 鸿蒙自己的 ohos 包大多通过方舟编译器被塞到了 .so 文件里,看不到实现,但是确实自己加了一些东西出来
  • 根据去年年末别人对 DevEco 的拆包,其实是能看到最核心的 ohos.aafwk.ability.Ability 里面就是把安卓的 Activity 包了一层

3. 方舟编译器真的可以用

过程

我们都知道,Android 的启动流程是这样的:

  1. bootloader 初始化一些最基本的状态,之后载入并运行 Linux 内核
  2. 内核启动,加载驱动,初始化外设等等等等,最后开启第一个用户态进程 init
  3. init 读 init.rc,创建 /dev 等目录,初始化 SELinux,创建 ServiceManager,运行 Zygote 转到 Java 世界等等等等
  4. Zygote 创建 SystemServer,开 Launcher

在这个启动流程中,init.rc 是比较重要的,这里面记录了 init 进程要做的一些工作。我们先来看鸿蒙的 init.rc

import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /init.usb.configfs.rc
import /init.${ro.zygote}.rc
import /init.mygote64.rc
...

下面都是一些常规的项目,就不列出了,在这个文件的开头除去初始化硬件的 /vendor/etc/init/hw/init.${ro.hardware}.rc,还有一个 init.mygote64.rc 看起来就不是安卓自带的文件,打开看看内容:

service mygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --nice-name=zygote64 --socket-name=mygoteclass maindisabledpriority -20user rootgroup root readproc reserved_disksocket mygote stream 660 root systemsocket usap_mygote_pool_primary stream 660 root systemonrestart write /sys/android_power/request_state wakeonrestart write /sys/power/state ononrestart restart zygoteonrestart restart zygote_secondarywritepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks /dev/blkio/foreground/taskssetenv MAPLE_RUNTIME libandroidmpl-rt.socritical

相比常规的 Zygote 启动语句,这里除去 socket 的名字不一样外,还多了个设置环境变量的语句:

setenv MAPLE_RUNTIME libandroidmpl-rt.so

这个梅普露 Runtime 以前稍微看过一点方舟编译器的都会有印象,它们的 IR 就叫做 MAPLE IR,想必与这个环境变量相关的文件就是鸿蒙自己修改/加的文件了罢。搜一下看看:

➜  system grep -r MAPLE_RUNTIME ./ 2>&1 | grep matches
Binary file .//apex/com.android.runtime.release.apex matches
Binary file .//lib64/libandroid_runtime.so matches
Binary file .//lib64/libmapleframework.so matches
Binary file .//lib64/libmaplecore-all.so matches
Binary file .//lib64/libmaplehwPartBasicplatform.so matches
Binary file .//lib64/libmaplehwframework.so matches
Binary file .//lib64/libmaplezframework.z.so matches
Binary file .//bin/bootstrap/linker64 matches
Binary file .//bin/bootstrap/linker matches
Binary file .//bin/bootstrap/linker_asan64 matches
Binary file .//bin/bootstrap/linker_asan matches
Binary file .//bin/crash_dump64 matches
Binary file .//bin/crash_dump32 matches
Binary file .//bin/decouple_cache matches
Binary file .//framework/maple/boot-zframework.z_classes2.cdex matches
Binary file .//framework/maple/boot-zframework.z_classes.cdex matches
Binary file .//framework/boot-zframework.z.vdex matches
Binary file .//framework/hwPartBasicplatform.jar matches
Binary file .//framework/hwframework.jar matches
Binary file .//framework/framework.jar matches
Binary file .//framework/arm/boot-core-libart.art matches
Binary file .//framework/arm64/boot-core-libart.art matches
Binary file .//priv-app/InProcessNetworkStack/InProcessNetworkStack.apk matches
Binary file .//lib/libandroid_runtime.so matches

还真不少,简单的看一下都是什么:

  • /lib64/libmaple*.so 推测是鸿蒙的运行时,开发鸿蒙引用的 ohos.aafwk 包估计都会在里面,看文件名可能还用到了方舟编译器编译?
  • /framework/arm*/boot-core-libart.art 安卓的 ART 虚拟机启动时预加载的一些包的映像
  • /bin/bootstrap/* 一些处理初始化的程序
  • /framework/*framework.jar,系统的框架文件
  • /lib/libandroid_runtime.so 安卓的运行时,Zygote 启动就会调里面的一些函数

最近要早睡,我时间有限,简单的看一下其中的两个重量级文件。

/framework/*framework.jar

这里只看 com.android.internal.os.ZygoteInit,就是 Zygote 初始化后运行的第一个 Java 类。会做一些类的预加载啦,环境的初始化等事情。通过反编译,可以注意到,在 preloadClasses 里面,除了常规的加载 /system/etc/preloaded-classes 列出来的类之外,还加载了 /system/etc/preloaded-harmony-classes 里面的文件,打开看看这个文件列了什么:

➜  framework cat ../etc/preloaded-harmony-classes | head -10
ohos.app.AbilityContext
ohos.app.AbilityManager
ohos.app.Application
ohos.app.Context
ohos.app.ContextDeal
ohos.app.dispatcher.task.TaskPriority
ohos.app.dispatcher.threading.WorkerPoolConfig
ohos.app.dispatcher.TaskDispatcherContext
ohos.app.dispatcher.TaskExecutor
ohos.app.ProcessInfo

是鸿蒙自己定义的一些类呢,预加载这些类可以加速鸿蒙程序的执行,可以理解。除此之外,在 preloadResources 函数引用的 C++ 程序中,除了常规的加载 /system/framework/framework-res.apk 之外,还额外加载了 /system/framework/framework-res-hwext.apk,想必是鸿蒙用的一些资源文件。

libmaplezframework.z.so

先看看这个文件的头:

➜  lib64 readelf -a libmaplezframework.z.so
...
节头:[号] 名称              类型             地址              偏移量大小              全体大小          旗标   链接   信息   对齐[ 0]                   NULL             0000000000000000  000000000000000000000000  0000000000000000           0     0     0
...[23] .maple.gcrootsmap PROGBITS         00000000020ad768  0209d7680000000000024aa8  0000000000000000  WA       0     0     8[24] .reg_jni_tab      PROGBITS         00000000020d2210  020c2210000000000000d3a0  0000000000000000   A       0     0     8[25] .reg_jni_func_tab PROGBITS         00000000020df5b0  020cf5b000000000000069d0  0000000000000000  WA       0     0     8[26] .muid_tab         PROGBITS         00000000020e5f80  020d5f8000000000001ed240  0000000000000000  WA       0     0     8[27] .mpl_version      PROGBITS         00000000022d31c0  022c31c0000000000000000c  0000000000000000   A       0     0     8[28] .classmetadata    PROGBITS         00000000022d31d0  022c31d000000000000e9d28  0000000000000000  WA       0     0     8[29] .classmetada[...] PROGBITS         00000000023bcef8  023acef80000000000008fe4  0000000000000000  WA       0     0     8[30] .refl_strtab      PROGBITS         00000000023c5ee0  023b5ee0000000000036a45a  0000000000000000   A       0     0     8[31] .refl_strtab.hot  PROGBITS         0000000002730340  02720340000000000002e1a0  0000000000000000   A       0     0     8[32] .bss              NOBITS           000000000275f000  0274e4e0000000000000b828  0000000000000000  WA       0     0     8[33] .maple_java_[...] PROGBITS         0000000000000000  0274e4e00000000000000030  0000000000000000           0     0     1[34] .maple_java_[...] PROGBITS         0000000000000000  0274e5100000000000000020  0000000000000000           0     0     1[35] .maple_java_[...] PROGBITS         0000000000000000  0274e530000000000000000c  0000000000000000           0     0     1[36] .maple_java_[...] PROGBITS         0000000000000000  0274e53c00000000000fa7f6  0000000000000000           0     0     1[37] .shstrtab         STRTAB           0000000000000000  02848d3200000000000001d9  0000000000000000           0     0     1
... 

这种 Section 的排布还真没见过,上网搜一搜,最后发现 .refl_strtab 这些只在方舟编译器的源码中出现过,推测这文件是方舟编译器生成的产物。对照方舟编译器源码,了解到 .refl_strtab 是一些编译出来的类的符号字符串。看看都有啥:

➜  lib64 objdump -s -j .refl_strtab libmaplezframework.z.so | head -15libmaplezframework.z.so:   file format elf64-littleaarch64Contents of section .refl_strtab:23c5ee0 00676574 4861704d 6f64756c 65496e66  .getHapModuleInf23c5ef0 6f7c2829 4c6f686f 732f6275 6e646c65  o|()Lohos/bundle23c5f00 2f486170 4d6f6475 6c65496e 666f3b00  /HapModuleInfo;.23c5f10 6765744d 69737369 6f6e4964 7c282949  getMissionId|()I23c5f20 00766973 69744443 4d504c7c 284c6f68  .visitDCMPL|(Loh23c5f30 6f732f63 6f6d2f73 756e2f6f 72672f61  os/com/sun/org/a23c5f40 70616368 652f6263 656c2f69 6e746572  pache/bcel/inter23c5f50 6e616c2f 67656e65 7269632f 44434d50  nal/generic/DCMP23c5f60 4c3b2956 00766973 69744249 50555348  L;)V.visitBIPUSH23c5f70 7c284c6f 686f732f 636f6d2f 73756e2f  |(Lohos/com/sun/23c5f80 6f72672f 61706163 68652f62 63656c2f  org/apache/bcel/ 

看起来 ohos 相关的包的实现都被编译到了这个 so 里面,在外面搜了下也确实没搜到相关的文件,这至少证明了方舟编译器确实是存在的。

著作权归原作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

鸿蒙比AOSP 多了什么相关推荐

  1. 终于把鸿蒙说明白了,关于安卓系统、AOSP(安卓开源项目)和鸿蒙系统比较

    把鸿蒙说得很明白了,小白们不要给小米.蓝绿厂泼污水文忽悠了,以为鸿蒙就和当年的龙芯一样把鸿蒙说得很明白了,小白们不要给小米.蓝绿厂泼污水文忽悠了,以为鸿蒙就和当年的汉芯一样买芯片换掉商标就行! 关于安 ...

  2. 华为鸿蒙2.0打游戏,网友Mate X2升级鸿蒙2.0:部分游戏体验比EMUI更好 功耗却更低...

    近日,华为的鸿蒙2.0系统已经开始公测,不少用户已经报名参加并收到了华为的推送,系统由基于安卓定制的EMUI 11切换到鸿蒙OS. 对网友来说,升级鸿蒙OS会有什么变化?这个问题是最关键,也最影响他们 ...

  3. 鸿蒙OS 2.0流畅度实测:差距到底多大?

    出处:电脑报(ID:CQCPCW 编辑:崔崔 最近一段时间,部分华为Mate X2用户和开发者已经陆续收到了鸿蒙2.0 Beta版升级推送,不少机型都有更新.且不同机型收到鸿蒙 OS 2.0 测试版的 ...

  4. 为什么“鸿蒙”不是第二个“安卓”,如何看待Harmony OS里的Android痕迹?

    ​华为将在6月2日晚8点举办鸿蒙操作系统及华为全场景新品发布会.官方微博也在同一时间更名为Harmony OS,同时更新了鸿蒙操作系统的开机视频.--Harmony OS会带来哪些改变? " ...

  5. 曝荣耀仍未获得谷歌Android授权;诋毁鸿蒙的OPPO员工离职;微信圈子将停止运营|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  6. 华为鸿蒙 OS 2.0 系统流畅度实测:差距到底多大?

    这是「进击的Coder」的第 434 篇技术分享 编辑:崔崔 来源:电脑报(ID:CQCPCW) " 阅读本文大概需要 5 分钟. " 最近一段时间,部分华为 Mate X2 用户 ...

  7. 吊打安卓?鸿蒙OS 2,android热更新流程

    根据视频显示,测试第一步清空后台,接着依次打开微博.酷安.Bilibili和和平精英.EMUI 11下微博无开屏广告.B站开屏广告3秒,而鸿蒙下微博有广告.B站开屏广告5秒. 所以前三款APP,都是E ...

  8. 对比安卓!鸿蒙OS 2.0流畅度实测:差距到底多大?

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 3.5 分钟. 出处:电脑报(ID:CQCPCW) 编辑:崔崔 Hello,大家好,我是良月柒. 最近一段时间,部分华为Mat ...

  9. 鸿蒙 OS 2.0 公测!已适配多款机型

    code小生 一个专注大前端领域的技术平台 公众号回复Android加入安卓技术群 来源 | 电脑报(ID:CQCPCW) 如若转载请联系原公众号 最近一段时间,部分华为Mate X2用户和开发者已经 ...

最新文章

  1. Android maps应用
  2. 【深度学习入门到精通系列】特别正经的合理调参介绍~❤️
  3. Chrome 技术篇-常用web调试技巧清除缓存并硬性重新加载
  4. drop、delete与truncate的区别 和 delete是否记录日志
  5. tkinter笔记:通过点击button 控制标签的显示 (莫烦python笔记)
  6. 一起教育科技携手神策数据,数据赋能智能教育新时代
  7. 寻找丢失的数字(二)
  8. leetcode 200. Number of Islands | 200. 岛屿数量(Java)
  9. Win7搭建FTP服务器
  10. git提交代码到码云
  11. android9叫什么名字,白猜这么多名字!谷歌Android 9.0正式发布:命名Android Pie
  12. if 与 while
  13. Android 网络权限配置
  14. android版 wifi伴侣,wifi伴侣下载|wifi伴侣安卓版2016最新版 3.7.5 - 系统天堂
  15. Android 救援模式(Rescue Mode)原理剖析
  16. 利用java实现发送邮件
  17. 2014湖南农业大学ACM校赛
  18. PEPL命令-交互式解释器
  19. 理解CMMI 3级过程域非常好的例子
  20. 如何改变pycharm的背景颜色

热门文章

  1. 小程序云开发如何实现微信支付功能
  2. AI翻译正流行 哪些行业将来会被人工智能所取代?
  3. 第一天、python之路
  4. 在甲骨文云容器实例(Container Instances)上部署Oracle Linux 7 Desktop
  5. Web自动化测试:模拟键盘事件(Keys)
  6. Maven使用第一行红叉报错
  7. Place:30-574 vhdl
  8. 43、一种图像边缘粗糙度计算方法
  9. 工作那些事(十四)项目经理和项目成员
  10. python文本框焦点设置_如何在tkinter输入框中设置焦点