summaryrefslogtreecommitdiffstats
path: root/code/projects/ohos_compile.html
diff options
context:
space:
mode:
Diffstat (limited to 'code/projects/ohos_compile.html')
-rw-r--r--code/projects/ohos_compile.html226
1 files changed, 197 insertions, 29 deletions
diff --git a/code/projects/ohos_compile.html b/code/projects/ohos_compile.html
index bf72035..fd52643 100644
--- a/code/projects/ohos_compile.html
+++ b/code/projects/ohos_compile.html
@@ -5,20 +5,17 @@
5 <meta charset="utf-8" /> 5 <meta charset="utf-8" />
6 <meta name="generator" content="pandoc" /> 6 <meta name="generator" content="pandoc" />
7 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
8 <title>OpenHarmony 3.2 编译</title> 8 <title>OHOS全量编译记录</title>
9 <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> 9 <link rel="stylesheet" href="https://test.qin-juan-ge-zhu.top/common/CSS/pandoc.css">
10 <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/js/myhighlight.js"></script> 10 <script type="text/javascript" src="https://test.qin-juan-ge-zhu.top/common/js/myhighlight.js"></script>
11 <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script> 11 <script type="text/javascript" src="https://test.qin-juan-ge-zhu.top/common/script4code.js"></script>
12</head> 12</head>
13 13
14<body> 14<body>
15 <div class="pandoc"> 15 <div class="pandoc">
16 <div class="main"> 16 <div class="main">
17 <header id="title-block-header"> 17 <p class="title">OHOS 全量编译记录</p>
18 <p class="title">OpenHarmony 3.2 编译</p>
19 </header>
20 <!-- 鸿蒙开发环境搭建 --> 18 <!-- 鸿蒙开发环境搭建 -->
21 <p>[toc]</p>
22 <blockquote> 19 <blockquote>
23 <p>本次编译环境搭建参考了以下博客:</p> 20 <p>本次编译环境搭建参考了以下博客:</p>
24 <ul> 21 <ul>
@@ -39,7 +36,8 @@
39 <h2 id="硬件环境">硬件环境</h2> 36 <h2 id="硬件环境">硬件环境</h2>
40 <p>编译过程使用的是 37 <p>编译过程使用的是
41 <code>Ubuntu</code>,经测试,<code>Ubuntu 22.04 LTS</code>/<code>Ubuntu 20.04 LTS</code>/<code>Ubuntu 18.04 LTS</code> 38 <code>Ubuntu</code>,经测试,<code>Ubuntu 22.04 LTS</code>/<code>Ubuntu 20.04 LTS</code>/<code>Ubuntu 18.04 LTS</code>
42 均可用。</p> 39 均可用。
40 </p>
43 <p>网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:</p> 41 <p>网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:</p>
44 <ul> 42 <ul>
45 <li><strong>内存必须在 10G 以上</strong>,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)</li> 43 <li><strong>内存必须在 10G 以上</strong>,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)</li>
@@ -109,39 +107,45 @@ ssh-keygen -t rsa -C &quot;your-email-address&quot;</code></pre>
109 <p>此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。</p> 107 <p>此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。</p>
110 <h1 id="系统源码编译">系统源码编译</h1> 108 <h1 id="系统源码编译">系统源码编译</h1>
111 <h2 id="配置-repo-工具">配置 repo 工具</h2> 109 <h2 id="配置-repo-工具">配置 repo 工具</h2>
112 <p><strong>注意:前两条命令需要以 root 身份执行!!!</strong></p> 110 <pre><code>curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 &gt; ~/repo
113 <pre><code># 以下两条命令需要以root身份执行 111chmod a+x ~/repo
114sudo -s 112sudo mv ~/repo /usr/local/bin/repo
115curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 &gt; /usr/local/bin/repo 113sudo chown root:root /usr/local/bin/repo
116chmod a+x /usr/local/bin/repo
117exit
118 114
119# 这条普通身份也可以
120pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests</code></pre> 115pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests</code></pre>
121 <p>之所以前两条命令需要以 root 身份而不能是 sudo,是因为<code>/usr/local/bin</code>是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root 116 <p>需要注意的是,不能直接使用 sudo 搭配管道,这是因为<code>/usr/local/bin</code>是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root
122 身份执行,但<strong>重定向时候 sudo 用的也是当前用户身份</strong>,权限不足,自然报错。(<strong>如果是管道,那么 sudo 117 身份执行,但<strong>重定向时候 sudo 用的也是当前用户身份</strong>,权限不足,自然报错。(<strong>如果是管道,那么 sudo
123 也是只对当前命令有效,而不是对后续的整个管道有效。</strong>)</p> 118 也是只对当前命令有效,而不是对后续的整个管道有效。</strong>)</p>
124 <h2 id="获取源码">获取源码</h2> 119 <h2 id="获取源码">获取源码</h2>
120 <p>这里需要注意的是,一般情况下最好使用带有 v 和 Release 的版本。不带 Release 不是发布版,会随时更新代码,容易编译出错;带 Release 的也有两种 tag,是带 v 和不带 v
121 的区别,如<code>OpenHarmony-v4.0-Release</code>和<code>OpenHarmony-4.0-Release</code>。二者的区别主要在于,不带 v
122 的是官方维护的稳定版,也会更新代码,厂商的补丁一般只针对带 v 的使用。</p>
125 <p>通过 repo + https/ssh 下载:</p> 123 <p>通过 repo + https/ssh 下载:</p>
126 <pre><code># 通过http下载,这里需要注意你需要的ohos的版本 124 <pre><code># 如果需要的是特定分支,-b后边改成对应分支名
127repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify 125# repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
128# 如果需要的是特定分支,-b后边改成对应分支名
129# 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字, 126# 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字,
130# 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下: 127# 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下:
131# repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v3.2-Release --no-repo-verify 128# repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v3.2-Release --no-repo-verify
132# 除使用https外,也可以通过ssh下载 129# 除使用https外,也可以通过ssh下载
133# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify 130# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify
134 131repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v4.0-Release --no-repo-verify
135repo sync -c 132repo sync -c
136repo forall -c &#39;git lfs pull&#39;</code></pre> 133repo forall -c &#39;git lfs pull&#39;</code></pre>
137 <h2 id="prebuilts-与编译">prebuilts 与编译</h2> 134 <h2 id="补丁与编译">补丁与编译</h2>
135 <p>首先,打上厂商的补丁。下载对应版本补丁后,将补丁文件放到源码根目录下,执行:</p>
136 <pre><code>unzip purple_pi_oh_patch.zip
137cd purple_pi_oh_patch
138./ido_patch.sh</code></pre>
139 <p>看到<code>patch complete</code>字样,说明补丁成功。接下来进行 prebuilts 和编译:</p>
138 <pre><code># 先在源码根目录下执行脚本,安装编译器及二进制工具 140 <pre><code># 先在源码根目录下执行脚本,安装编译器及二进制工具
139bash build/prebuilts_download.sh 141bash build/prebuilts_download.sh
140# 再执行如下命令进行版本编译 142
143# 编译
141# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能 144# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能
142sudo ./build.sh --product-name rk3568 --ccache
143# 如果是64位cpu,需要加上--target-cpu=arm64 145# 如果是64位cpu,需要加上--target-cpu=arm64
144sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64</code></pre> 146# 编译rk3568时
147# sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64
148sudo ./build.sh --product-name purple_pi_oh --ccache --no-prebuilt-sdk --target-cpu=arm64</code></pre>
145 <h2 id="编译完成">编译完成</h2> 149 <h2 id="编译完成">编译完成</h2>
146 <p>编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的<code>out/rk3568/packages/phone/images</code>目录下。</p> 150 <p>编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的<code>out/rk3568/packages/phone/images</code>目录下。</p>
147 <p>自此源码编译成功,即可进行镜像烧录。</p> 151 <p>自此源码编译成功,即可进行镜像烧录。</p>
@@ -181,14 +185,75 @@ sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64</code></pre>
181sudo mount -o remount -rw / 185sudo mount -o remount -rw /
182sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell</code></pre> 186sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell</code></pre>
183 <p>而后在 gparted 中点击<code>gparted-&gt;刷新设备</code>,即可进行分区扩展。</p> 187 <p>而后在 gparted 中点击<code>gparted-&gt;刷新设备</code>,即可进行分区扩展。</p>
188 <h2 id="ninja-编译报错-code-4000">Ninja 编译报错 <code>Code 4000</code></h2>
189 <p>编译 rk3568 过程中可能会出现以下报错:</p>
190 <pre><code>[OHOS ERROR] Code: 4000
191[OHOS ERROR] Reason: ninja phase failed</code></pre>
192 <p>详细的报错信息已经丢失,将就着看吧。反正别的办法都不好使的时候试试这个。</p>
193 <p>此时执行以下内容即可:</p>
194 <pre><code>rm -rf out
195sed -i &#39;s/CONFIG_DEBUG_INFO_BTF=y/# CONFIG_DEBUG_INFO_BTF=y/g&#39; kernel/linux/config/linux-5.10/rk3568/arch/arm64_defconfig</code></pre>
196 <p>而后重新编译。</p>
197 <h2 id="另一个code-4000">另一个<code>Code 4000</code></h2>
198 <p>编译时报错如下:</p>
199 <pre><code>ninja: build stopped: subcommand failed.
200[OHOS ERROR] Traceback (most recent call last):
201[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/services/ninja.py&quot;, line 49, in _execute_ninja_cmd
202[OHOS ERROR] SystemUtil.exec_command(
203[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/util/system_util.py&quot;, line 63, in exec_command
204[OHOS ERROR] raise OHOSException(
205[OHOS ERROR] exceptions.ohos_exception.OHOSException: Please check build log in /home/player/Desktop/ohos/src/out/purple_pi_oh/build.log
206[OHOS ERROR]
207[OHOS ERROR] During handling of the above exception, another exception occurred:
208[OHOS ERROR]
209[OHOS ERROR] Traceback (most recent call last):
210[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/containers/status.py&quot;, line 47, in wrapper
211[OHOS ERROR] return func(*args, **kwargs)
212[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py&quot;, line 67, in run
213[OHOS ERROR] raise exception
214[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py&quot;, line 65, in run
215[OHOS ERROR] super().run()
216[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/modules/interface/build_module_interface.py&quot;, line 72, in run
217[OHOS ERROR] raise exception
218[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/modules/interface/build_module_interface.py&quot;, line 70, in run
219[OHOS ERROR] self._target_compilation()
220[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py&quot;, line 103, in _target_compilation
221[OHOS ERROR] self.target_compiler.run()
222[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/services/ninja.py&quot;, line 38, in run
223[OHOS ERROR] self._execute_ninja_cmd()
224[OHOS ERROR] File &quot;/home/player/Desktop/ohos/src/build/hb/services/ninja.py&quot;, line 52, in _execute_ninja_cmd
225[OHOS ERROR] raise OHOSException(&#39;ninja phase failed&#39;, &#39;4000&#39;)
226[OHOS ERROR] exceptions.ohos_exception.OHOSException: ninja phase failed
227[OHOS ERROR]
228[OHOS ERROR] Code: 4000
229[OHOS ERROR]
230[OHOS ERROR] Reason: ninja phase failed
231[OHOS ERROR]
232[OHOS ERROR] Solution: Please check the compile log at out/{compiling product}/build.log, If you could analyze build logs.
233[OHOS ERROR] Or you can try the following steps to solve this problem:
234[OHOS ERROR] 1. cd to OHOS root path
235[OHOS ERROR] 2. run &#39;hb clean --all&#39; or &#39;rm -rf out build/resources/args/*.json&#39;.
236[OHOS ERROR] 3. repo sync
237[OHOS ERROR] 4. repo forall -c &#39;git lfs pull&#39;
238[OHOS ERROR] 5. bash build/prebuilts_download.sh
239[OHOS ERROR] 6. rebuild your product or component
240[OHOS ERROR]
241[OHOS ERROR] If you still cannot solve this problem, you could post this problem on:
242[OHOS ERROR] https://gitee.com/openharmony/build/issues
243[OHOS ERROR]</code></pre>
244 <p>在报错信息之上,还有很多很多行,大致意思是正在对某些文件或仓库拉补丁,输出了补丁的 commit 信息。报错中最后提示的解决办法其实是无效的,我全量删除源码、甚至重装虚拟机,都还会遇到这个问题。</p>
245 <p>仔细分析报错信息,发现报错的根本原因是在 python 中<strong>处理一个 Exception 时,又抛出了另一个
246 Exception,导致程序异常终止</strong>。上网搜索可知,这种问题的一般原因是 python
247 同时拉取或爬取大量网页内容,但都失败了,导致同时出现两个异常,程序崩溃。具体到我们这里,问题就是拉补丁失败了,我检查了一下我的网络环境,发现我挂着梯子,梯子质量不是那么好。尝试将梯子关掉后,再次编译,问题解决。
248 </p>
184 <h2 id="一个奇怪的报错gn-failed">一个奇怪的报错——<code>GN Failed</code></h2> 249 <h2 id="一个奇怪的报错gn-failed">一个奇怪的报错——<code>GN Failed</code></h2>
185 <p>这是一个很奇怪的报错,我们尚未找到真正的原因所在,只知道如何暂时地绕过去。</p> 250 <p>这是一个很奇怪的报错,我们尚未找到真正的原因所在,只知道如何暂时地绕过去。</p>
186 <h3 id="问题描述与复现">问题描述与复现</h3> 251 <h3 id="问题描述与复现">问题描述与复现</h3>
187 <p>问题复现方法为在编译过程中,执行以下命令:</p> 252 <p>问题复现方法为在编译过程中,执行以下命令:</p>
188 <pre><code>./build.sh --product-name rk3568 --ccache</code></pre> 253 <pre><code>./build.sh --product-name rk3568 --ccache</code></pre>
189 <p>该命令是指导书中写的编译命令,但执行时候会出错;<strong>与上文所述的经确认无误的编译命令不同在于没加<code>sudo</code></strong>。</p> 254 <p>该命令是指导书中写的编译命令,但执行时候会出错;<strong>与上文所述的经确认无误的编译命令不同在于没加<code>sudo</code></strong>。</p>
190 <p>如果按照指导书的命令来,不出意外编译将会报错: <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_1.png" /> 255 <p>如果按照指导书的命令来,不出意外编译将会报错: <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_1.png" /> <img
191 <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_2.png" /></p> 256 src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_2.png" /></p>
192 <p><strong>以下是该问题的具体描述:</strong></p> 257 <p><strong>以下是该问题的具体描述:</strong></p>
193 <p><code>build.log</code>如下:</p> 258 <p><code>build.log</code>如下:</p>
194 <pre><code>Set cache size limit to 100.0 GB 259 <pre><code>Set cache size limit to 100.0 GB
@@ -311,6 +376,109 @@ sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev
311 <p>将编译出来的 NDK 的 zip 解压到你想要的目录下,然后将该目录添加到环境变量中,即可使用。</p> 376 <p>将编译出来的 NDK 的 zip 解压到你想要的目录下,然后将该目录添加到环境变量中,即可使用。</p>
312 <p>注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK 377 <p>注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK
313 还未我们提供编译所需的全套服务,如编译工具链配置文件<code>ohos.toolchain.cmake</code>、头文件、库文件等。快说,谢谢 ohos~</p> 378 还未我们提供编译所需的全套服务,如编译工具链配置文件<code>ohos.toolchain.cmake</code>、头文件、库文件等。快说,谢谢 ohos~</p>
379 <p>为了更方便地使用 NDK,鄙人不才,写了两个脚本,分别用于 cmake 编译和单文件编译:</p>
380 <pre><code>#!/bin/bash
381
382#######################################################################
383# File Name : compile.sh
384# Encoding : utf-8
385# Author : We-unite
386# Email : weunite1848@gmail.com
387# Created Time : 2024-11-18 15:19:15
388#######################################################################
389
390set -e
391
392if [ $UID -eq 0 ]; then
393 echo &quot;Please do not run this script as root&quot;
394 exit 1
395fi
396
397if [ $# -ne 2 ]; then
398 echo &quot;Usage: $0 &lt;static|shared&gt; &lt;v7|v8&gt;&quot;
399 exit 1
400fi
401
402if [ $2 == &quot;v8&quot; ]; then
403 arch=arm64-v8a
404elif [ $2 == &quot;v7&quot; ]; then
405 arch=armeabi-v7a
406else
407 echo &quot;Invalid architecture: $2&quot;
408 exit 1
409fi
410
411link=$1 # static or shared
412native_path=~/app/native
413
414export PATH=$native_path/build-tools/cmake/bin:$PATH
415
416# 使用cmake编译,编译生成的文件运行在rk3568上
417cmake -B build -D OHOS_STL=c++_$link -D OHOS_ARCH=$arch \
418 -D OHOS_PLATFORM=OHOS \
419 -D CMAKE_TOOLCHAIN_FILE=$(find $native_path -name ohos.toolchain.cmake)
420cmake --build build</code></pre>
421 <pre><code>#!/bin/bash
422
423#######################################################################
424# File Name : compile-tiny.sh
425# Encoding : utf-8
426# Author : We-unite
427# Email : weunite1848@gmail.com
428# Created Time : 2024-11-16 13:06:58
429#######################################################################
430
431set -e
432# 如果是root,报错
433if [ $(id -u) -eq 0 ]; then
434 echo &quot;Do not run as root&quot;
435 exit 1
436fi
437
438if [ $# -ne 2 ]; then
439 echo &quot;Usage: $0 &lt;src file&gt; [armv8-a|armv7-a]&quot;
440 exit 1
441fi
442
443native=~/app/native
444file=$1
445targetFile=${file%.*}
446arch=$2
447
448case $arch in
449 armv8-a)
450 compiler=$native/llvm/bin/aarch64-unknown-linux-ohos
451 targetPlatform=aarch64-linux-ohos
452 ;;
453 armv7-a)
454 compiler=$native/llvm/bin/armv7-unknown-linux-ohos
455 targetPlatform=arm-linux-ohos
456 ;;
457 *)
458 echo &quot;Unsupported arch&quot;
459 exit 1
460 ;;
461esac
462
463case ${file##*.} in
464 c)
465 compiler=$compiler-clang
466 ;;
467 cpp)
468 compiler=$compiler-clang++
469 ;;
470 *)
471 echo &quot;Unsupported file type&quot;
472 exit 1
473 ;;
474esac
475
476export CPATH=
477
478$compiler -o $targetFile $file -Wall \
479 --target=$targetPlatform \
480 --sysroot=$native/sysroot \
481 -march=$arch -mfloat-abi=softfp</code></pre>
314 <h1 id="完结撒花">完结撒花</h1> 482 <h1 id="完结撒花">完结撒花</h1>
315 <p>本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢:</p> 483 <p>本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢:</p>
316 <ul> 484 <ul>
@@ -323,8 +491,8 @@ sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev
323 </li> 491 </li>
324 </ul> 492 </ul>
325 <p>不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……</p> 493 <p>不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……</p>
326 <p class="time">2024.2.12,甲辰年正月初三<br>2024.4.24改</p> 494 <p class="time">2024.2.12,甲辰年正月初三<br>2024.4.24改<br>2024.11.19改</p>
327 <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script> 495 <script src="https://test.qin-juan-ge-zhu.top/common/js/comment.js"></script>
328 </div> 496 </div>
329 </div> 497 </div>
330</body> 498</body>