更多信息请访问:https://harmonyos.51cto.com,与华为官方共同打造的鸿蒙技术社区,今年年初编译烧录了OpenHarmony系统,来自1.0版到2.0版变化很大,都运行在3516开发板上。2.0虽然加入了Linux内核,界面也更接近手机系统,但离真正的HarmonyOS还是有差距。如果要达到手机端HarmonyOS的效果,可能需要结合OpenHarmony框架和AOSP内核。今天就尝试自己编译AOSP11,为以后可能的探索做一些预研。前期准备硬件设备配置越高越好。虚拟机编译至少需要16G内存+300G硬盘空间。我自己的桌面有24G内存。之前的内存只有8G,一开始编译不了。我使用的软件环境是VMware+Ubuntu20.04系统的虚拟机。虚拟机的安装这里就不说了。网上有很多。配置下载源因为国外地址可能无法访问或者访问速度慢,我们需要添加国内数据源:打开源列表sudogedit/etc/apt/sources.list将清华源复制到源列表,不要动之前的源debhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focalmainrestricteduniversemultiversesedeb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focalmainrestricteduniversemultiversesedebhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-updatesmainrestricteduniversemultiversesedebsrchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-updatesmainrestricteduniversemultiversesedebhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-backportsmainrestricteduniversemultiversesedeb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-backportsmainrestricteduniversemultiversesedebhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-securitymainrestricteduniversemultiversesedeb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/focal-securitymainrestricteduniversemultiverses保存sudoap后更新源-getupdatesudoapt-getupgrade下载源码配置好国内数据源后,我们就可以开始下载源码了。网速越快越好,因为AOSP的源码在轻压缩包里有124G,网速不好。下载需要时间只是时间太长了。这里不建议下载压缩包解压,因为我们的硬盘容量有限,我这里预留了300G的空间,124G的压缩包不足以完成解压,所以选择下载直接源文件。下载git,配置环境变量#安装git,配置自己的git账号sudoapt-getinstallgitgitconfig--globaluser.email"xxxx@xx.com"gitconfig--globaluser.name"xxxx"#??配置PATH环境变量mkdir~/binecho"PATH=~/bin:\$PATH">>~/.bashrcsource~/.bashrcinstallcurlsudoapt-getinstallcurldownloadrepoPATH=~/bin:$PATHcurlhttps://mirrors.tuna.tsinghua.edu.cn/git/git-repo>~/bin/repochmoda+x~/bin/repo下载AOSP源码#创建并初始化aosp仓库目录mkdiraospcdaosprepoinit-uhttps://aosp.tuna.tsinghua.edu.cn/platform/manifest-bandroid-11.0.0_r3--repo-url=https://gerrit-googlesource.lug.ustc.edu.cn/git-repo#Synccodereposync等待代码下载完成,我们就可以开始编译了。编译安装依赖库,AOSP编译需要依赖的库很多,而这些Ubuntu系统可能没有自带,所以我们需要提前安装好,以免编译到一半报错浪费时间。sudoapt-getinstalllibx11-dev:i386libreadline6-dev:i386libgl1-mesa-devg++-multilibsudoapt-getinstall-ygitflexbisongperfbuild-essentiallibncurses5-dev:i386sudoapt-getinstalltofrodospython-markdownlibxml2-utilsxsltproczlib1g-dev:i386sudoapt-getinstallgit-coregnupgflexbisongperfbuild-essentialsudoapt-getinstallzipcurlzlib1g-devgcc-multilibg++-multilibsudoapt-getinstalllibc6-dev-i386sudoapt-getinstalllib32ncurses5-devx11proto-core-devlibx11-devsudoapt-getinstalllibgl1-mesa-devlibxml2-utilsxsltprocunzipm4sudoapt-getinstalllib32z-devccachesudoapt-getinstalllibssl-devsudoapt-getinstalllibncurses5初始化编译环境,执行编译命令sourcebuild/envsetup.shlunch31通过lunch指令设置编译目标,即生成的镜像运行在什么样的设备上。我准备在模拟器上运行,所以我选择31(即aosp_x86_64-eng)。模拟器是x86平台,运行速度会更快。这里也可以使用lunchaosp_x86_64-eng这样的编译目标名,因为不同版本的编译目标名序号不一样。编译目标的格式:BUILD-BUILDTYPE,例如上面的aosp_x86_64-eng的BUILD为aosp_x86_64,BUILDTYPE为eng。BUILD是指特定函数组合的特定名称,表示编译后的镜像可以运行的环境。其中,aosp(AndroidOpenSourceProject)代表Android开源项目;arm表示系统运行在arm架构处理器上,arm64表示64位arm架构处理器,x86表示x86架构处理器。BUILDTYPE指的是编译的类型,通常分为三种:-user:表示编译出来的系统镜像是可以正式发布到市场的版本,其权限是有限制的(比如没有root权限,不能dedug等)-userdebug:root权限和debug权限是根据用户版本开启的。-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),也自带很多调试工具。选择编译目标后,会打印出对应平台的编译参数。make-j8通过make命令编译代码,使用-j参数设置参与编译的线程数,提高编译速度。需要注意的是,参与编译的线程越多越好。一般根据你机杯的核心来决定:core*2,也就是当前CPU核心的两倍。我的桌面是i7四核处理器,所以我可以在这里用8个线程进行编译。然后是漫长的等待。如果不缺少依赖库,几个小时后会看到编译成功的信息。编译时间取决于您机器的性能。这是我的虚拟机编译时的资源占用情况。CPU应该够用了,使用率一直在50%左右,而内存消耗达到了20G。可以看出AOSP编译对内存的要求很高,当我们编译到90%的时候,会产生大量的文件,对硬盘的读写速度也非常高。我这里用的是机械硬盘,读写速度最多也就十几M,所以生成文件的时候硬盘使用率一直是100%。如果条件允许可以用固态硬盘编译,速度应该会快很多。六个多小时后,终于编译完成。运行模拟器编译完成后,可以通过以下命令运行安卓模拟器,命令如下:sourcebuild/envsetup.shlunch(选择刚才设置的目标版本,比如我这里选择31)emulator如果你在编译完成后马上运行模拟器,因为之前我们已经执行了source和lunch命令,所以现在你只需要执行运行模拟器的命令:emulator如果你的虚拟机没有开启虚拟化功能,你不能直接运行仿真如果使用服务器会报错。在这种情况下,您需要关闭虚拟机并配置虚拟化选项。然后重启虚拟机,进入aosp目录,运行模拟器。如果直接使用模拟器,会报找不到命令的错误。因为我们重启了虚拟机,需要重新初始化刚才编译的环境:sourcebuild/envsetup.shlunch31emulator这样我们就使用自己编译的AOSP镜像启动了Android模拟器。可以看到这个模拟器的界面和我们平时看到的谷歌原生系统不一样,因为谷歌系统自带的很多应用都没有开源。是的,AOSP里安装的demo应用都安装在这里,界面没有谷歌原生系统那么漂亮。至此,整个AOSP的编译过程就结束了。一般来说,机器硬件是硬性要求。其他方面,编译命令也很简单。编译脚本已经写好,自动化程度很高。相比之下,鸿蒙系统自己搭建编译环境比较麻烦,AOSP的编译更类似于鸿蒙的docker编译方式。整个环境比较完整,不需要额外安装或配置太多。AOSP编译完成后会在out/target/product/generic_x86/目录下生成一些img文件,模拟器启动主要使用system.img、userdata.img和ramdisk.img这三个文件,LinuxKernel就是使用prebuilds目录下对应平台的内核文件。这些文件在编译openharmony的过程中也会用到。它们非常相似。当我们需要烧录系统的时候,也会用到这些文件。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区
