返回值
+返回值
|
返回值说明
|
@@ -72,7 +88,7 @@ hdc\_std -h / hdc\_std help
hdc\_std -v / hdc\_std version
-- **-t key**
+### -t key
用于连接指定设备标识为key的设备。
@@ -115,11 +131,11 @@ hdc\_std -t _key_ shell (-t后面添加的_key_ 需要替换为上面
> **说明:**
>一台开发机可支持多个设备连接,每个设备有其唯一的设备标识,如果通过网络与设备连接,其标识为tcp:port格式,如果通过usb连接则标识为设备sn号。该命令需要跟随具体操作命令。
-## 查询设备列表
+## 查询设备列表的命令
查询设备列表涉及以下命令:
-**list targets\[-v\]**
+### list targets\[-v\]
显示所有已经连接的目标设备列表
@@ -161,7 +177,7 @@ hdc\_std list targets -v
服务进程涉及以下命令:
-- **target mount**
+### target mount
以读写模式挂载/system等分区。
@@ -197,7 +213,7 @@ hdc\_std list targets -v
hdc\_std target mount
-- **smode \[off\]**
+### smode \[off\]
授予后台服务进程root权限, 使用off参数取消授权。
@@ -207,7 +223,7 @@ hdc\_std smode
hdc\_std smode off
-- **kill \[-r\]**
+### kill \[-r\]
终止服务进程。
@@ -243,7 +259,7 @@ hdc\_std smode off
hdc\_std kill
-- **start \[-r\]**
+### start \[-r\]
启动服务进程。
@@ -281,7 +297,7 @@ hdc\_std start
网络部分涉及以下命令:
-- **tconn _host_\[:_port_\]\[-remove\]**
+### tconn _host_\[:_port_\]\[-remove\]
通过【ip地址:端口号】来指定连接的设备
@@ -322,7 +338,7 @@ hdc\_std start
hdc\_std tconn 192.168.0.100:8710
-- **tmode usb**
+### tmode usb
执行后设备端对应daemon进程重启,并首先选用usb连接方式。
@@ -358,7 +374,7 @@ hdc\_std tconn 192.168.0.100:8710
hdc\_std tmode usb
-- **tmode port _port-number_**
+### tmode port _port-number_
执行后设备端对应daemon进程重启,并优先使用网络方式连接设备,如果连接设备再选择usb连接。
@@ -401,7 +417,7 @@ hdc\_std tmode port 8710
文件部分涉及以下命令:
-- **file send _local remote_**
+### file send _local remote_
发送文件至远端设备。
@@ -442,7 +458,7 @@ hdc\_std tmode port 8710
hdc\_std file send E:\\a.txt /data/local/tmp/a.txt
-- **file recv \[-a\] _remote local_**
+### file recv \[-a\] _remote local_
从远端设备接收文件至本地。
@@ -492,7 +508,7 @@ hdc\_std file recv /data/local/tmp/a.txt ./a.txt
应用部分涉及以下命令:
-- **install \[-r/-d/-g\] _package_**
+### install \[-r/-d/-g\] _package_
安装OpenHarmony package。
@@ -543,7 +559,7 @@ hdc\_std file recv /data/local/tmp/a.txt ./a.txt
hdc\_std install _hwadmin.hap_
-- **uninstall \[-k\] _package_**
+### uninstall \[-k\] _package_
卸载OpenHarmony应用。
@@ -588,7 +604,7 @@ hdc\_std uninstall _package_
调试涉及以下命令:
-- **hilog**
+### hilog
支持抓取log信息。
@@ -622,7 +638,7 @@ hdc\_std uninstall _package_
hdc\_std hilog
-- **shell \[_command_\]**
+### shell \[_command_\]
远程执行命令或进入交互命令环境。
@@ -656,3 +672,37 @@ hdc\_std hilog
hdc\_std shell
+## 常见问题
+
+### hdc\_std连接不到设备
+
+- **现象描述**
+
+ 执行 "hdc\_std list targets"命令后结果为:\[Empty\]
+
+- **解决方法**
+ 1. 设备没有被识别:
+
+ 在设备管理器中查看是否有hdc设备,在通用串行总线设备中会有“HDC Device”信息。如果没有,hdc无法连接。此时需要插拔设备,或者烧写最新的镜像。
+
+ 2. hdc\_std工作异常:
+
+ 可以执行"hdc kill"或者"hdc start -r"杀掉hdc服务或者重启hdc服务,然后再执行hdc list targets查看是否已经可以获取设备信息。
+
+ 3. hdc\_std与设备不匹配:
+
+ 如果设备烧写的是最新镜像,hdc\_std也需要使用最新版本。由于hdc\_std会持续更新,请从开源仓developtools\_hdc\_standard中获取,具体位置在该开源仓的prebuilt目录。
+
+
+
+## hdc\_std运行不了
+
+- **现象描述**
+
+ 点击hdc\_std.exe文件无法运行。
+
+- **解决方法**
+
+ hdc\_std.exe不需要安装,直接放到磁盘上就能使用,也可以添加到环境变量中。通过打开cmd执行hdc\_std命令直接使用。
+
+
diff --git "a/zh-cn/device-dev/subsystems/hdc_std\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/zh-cn/device-dev/subsystems/hdc_std\345\270\270\350\247\201\351\227\256\351\242\230.md"
deleted file mode 100644
index 3f83fba3e9943bb252fec4fc273a197c3fcd9ec7..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/hdc_std\345\270\270\350\247\201\351\227\256\351\242\230.md"
+++ /dev/null
@@ -1,39 +0,0 @@
-# hdc\_std常见问题
-
-- [hdc\_std连接不到设备](#section1221016541119)
-- [hdc\_std运行不了](#section219185710311)
-
-## hdc\_std连接不到设备
-
-- **现象描述**
-
- 执行 "hdc\_std list targets"命令后结果为:\[Empty\]
-
-- **可能原因和解决方法**
- 1. 设备没有被识别:
-
- 在设备管理器中查看是否有hdc设备,在通用串行总线设备中会有“HDC Device”信息。如果没有,hdc无法连接。此时需要插拔设备,或者烧写最新的镜像。
-
- 2. hdc\_std工作异常:
-
- 可以执行"hdc kill"或者"hdc start -r"杀掉hdc服务或者重启hdc服务,然后再执行hdc list targets查看是否已经可以获取设备信息。
-
- 如果一直获取不到设备信息,请在任务管理器中查询是否有adb进程,该进程可能会对hdc产生干扰,可以将其杀掉后重复执行上面的步骤。
-
- 3. hdc\_std与设备不匹配:
-
- 如果设备烧写的是最新镜像,hdc\_std也需要使用最新版本。由于hdc\_std会持续更新,请从开源仓developtools\_hdc\_standard中获取,具体位置在该开源仓的prebuilt目录。
-
-
-
-## hdc\_std运行不了
-
-- **现象描述**
-
- 点击hdc\_std.exe文件无法运行。
-
-- **可能原因和解决方法**
-
- hdc\_std.exe不需要安装,直接放到磁盘上就能使用,也可以添加到环境变量中。通过打开cmd执行hdc\_std命令直接使用。
-
-
diff --git "a/zh-cn/device-dev/subsystems/\345\217\257\344\277\241\350\256\276\345\244\207\347\276\244\347\273\204\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/zh-cn/device-dev/subsystems/\345\217\257\344\277\241\350\256\276\345\244\207\347\276\244\347\273\204\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md"
deleted file mode 100755
index bf9fb41b5170c999b590ae30bfa2c91e1aaa2d30..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/\345\217\257\344\277\241\350\256\276\345\244\207\347\276\244\347\273\204\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md"
+++ /dev/null
@@ -1,264 +0,0 @@
-# 可信设备群组管理开发指导
-
-- [场景介绍](#section18502174174019)
-- [接口说明](#section1633115419401)
-- [开发步骤](#section17516229192313)
-- [调测验证](#section427316292411)
-
-## 场景介绍
-
-当分布式业务需要利用软总线提供的设备间安全会话通信时,可以使用可信设备群组管理服务在设备间创建可信群组。在OpenHarmony下提供异账号下基于PIN、二维码、碰一碰等设备认证能力和同华为账号群组下的设备认证能力,分布式应用可基于该能力建立和使用设备间的安全可信关系。对于未登录华为账号的设备,可以通过PIN码输入、二维码扫描后获取的设备连接信息和PIN码信息,再通过可信设备群组管理提供的群组创建,群组成员添加,主动建立设备间可信关系;在有其它业务应用已经创建并分享了设备可信群组的情况下或者登录了相同的华为账号后,也可以通过可信设备群组管理提供的查询能力,复用这些可信群组。
-
-## 接口说明
-
-可信群组管理组件当前提供innerkits接口,仅供系统应用调用,相关接口及功能描述如下:
-
-**表 1** 群组管理器提供的JAVA API接口功能介绍
-
-
-接口名
- |
-描述
- |
-
-
-public static DeviceGroupManager getInstance(Abilityability, StringappID, IHichainGroupCallbackcallbackHandler)
- |
-获取群组管理的实例,并注册一个请求的listen回调。
- |
-
-int createGroup(String appId, String groupName, int groupType, String groupInfo)
- |
-创建一个可信群组。
- |
-
-public int deleteGroup(String gourpId)
- |
-删除一个可信群组。
- |
-
-public String getLocalConnectInfo()
- |
-获取本地设备的网络连接信息。
- |
-
-int addMemberToGroup(String appId, long requestId, String addParams, String connectParams, int groupType)
- |
-添加成员到指定群组ID的可信群组。
- |
-
-int deleteMemberFromGroup(String appId, long requestId, String deleteParams, String connectParams)
- |
-从指定群组里删除可信成员。
- |
-
-int cancelRequest(long requestId)
- |
-取消正在进行的请求,如添加成员,删除成员。
- |
-
-List<String> listJoinedGroups(int groupType)
- |
-查询指定群组类型下本设备加入的群组信息列表。
- |
-
-List<String> listTrustedDevices(String groupId)
- |
-查询指定群组里可信设备的信息列表。
- |
-
-boolean isDeviceInGroup(String groupId, String deviceId)
- |
-查询指定设备ID的设备是否加入了指定ID的群组。
- |
-
-List<String> getGroupInfo(String queryParams)
- |
-根据输入参数,查询符合条件的群组的信息列表。
- |
-
-int setFriendsList(String groupId, List<String> friendsList)
- |
-向指定ID的群组,添加群组访问的友元名单
- |
-
-List<String> getFriendsList(String groupId)
- |
-获取指定群组里的友元名单
- |
-
-int registerGroupNotice(String groupId, IHichainGroupChangeListener groupChangeListener)
- |
-注册指定群组发生变化的回调listen
- |
-
-int revokeGroupNotice(String groupId)
- |
-取消对指定群组变化的listen
- |
-
-
-
-
-**表 2** 群组管理器提供的C++ API,供内部系统应用通过SA查询群组信息;
-
-
-接口名
- |
-描述
- |
-
-
-DeviceAuthProxy()
- |
-获取一个可信群组管理代理的实例。
- |
-
-~DeviceAuthProxy()
- |
-可信群组管理代理的实例的析构函数。
- |
-
-static int CheckAccessToGroup(const std::string &groupId, const std::string &pkgName);
- |
-判断指定包名的应用,是否对指定群组具有访问权限。
- |
-
-static int CheckAccessToDevice(const std::string &connDeviceId, const std::string &pkgName);
- |
-判断指定包名的应用,对指定的设备所加入的群组,是否具有访问权限。
- |
-
-static std::vector<std::string> GetRelatedGroupInfo(const std::string &connDeviceId);
- |
-获取指定ID的设备与本地设备存在可信管理的所有群组的基本信息。
- |
-
-
-
-
-## 开发步骤
-
-群组管理的开发步骤比较简单,大体的流程就是先获取一个实例,获取实例的同时就注册了群组操作结果的通知回调,获取到实例后就可以对群组进行成员的添加、删除和群组的友元设置以及群组的相关的查询操作。
-
-**场景一** 创建群组,下面首先以创建群组为例,说明群组管理类的创建以及接口使用方法:
-
-```
-private HwDeviceGroupManager hwDeviceGroupManager;
-...
-private HichainGroupCallback groupCallbackByA = new HichainGroupCallback() {
- @Override public void onFinish(long requestId, GroupOperation operationCode, String returnData) {
-
- }
- @Override public void onError(long requestId, GroupOperation operationCode, int errorCode, String errorReturn) {
-
- }
- @Override public String onRequest(long requestId, GroupOperation operationCode, String reqParams) {
- JSONObject onRequestJson = generateConfirmation(REQUEST_ACCEPTED);
- return onRequestJson.toString();
- }
-};
-...
-Optional context = convertAbilityToContext(mAbility);
-Context ctxt = context.get();
-hwDeviceGroupManager = HwDeviceGroupManager.getInstance(ctxt, APP_ID, groupCallbackByA);
-int ret = hwDeviceGroupManager.createGroup(APP_ID, GROUP_NAME, GROUP_TYPE, GROUP_INFO);
-```
-
-1. 在类成员里申明群组管理实例的私有成员变量
-
- ```
- private HwDeviceGroupManager hwDeviceGroupManager;
- ```
-
-2. 创建一个群组管理操作回调;
-
- ```
- private HichainGroupCallback groupCallbackByA = new HichainGroupCallback();
- ```
-
-3. 在构造函数里创建一个群组管理的实例, 在分布式场景中,位于不同设备的同业务应用,应该设置相同的APP\_ID;
-
- ```
- hwDeviceGroupManager = HwDeviceGroupManager.getInstance(ctxt, APP_ID, groupCallbackByA);
- ```
-
-4. 调用createGroup创建一个群组,当函数返回为0,在表明创建群组的请求已正确提交;
-
- ```
- int ret = hwDeviceGroupManager.createGroup(APP_ID, GROUP_NAME, GROUP_TYPE, GROUP_INFO);
- ```
-
-5. 群组创建成功,会收到一个onFinish的回调,回调函数中operationCode参数为OperationCode.CREATE, 表明是创建群组操作,returnData为Json格式数据,会包含一个“groupId”的字段,返回创建的群组的Id值。
-
-**场景二** 添加成员,在创建群组后,我们希望把目标设备经过设备认证加入到群组中,后续就可以通过软总线向目标设备发起可信的加密通信;
-
-```
-deviceGroupManager = DeviceGroupManager.getInstance(mAbility, APP_ID, hichainGroupCallback);
-private static final String CONN_PARAM ="{\"DEVICE_ID\":\"11111111\",\"WIFI_IP\":\"192.168.43.149\",\"WIFI_PORT\":\"30000\",\"BLE_MAC\":\"\"}";
-private static final String ADD_PARAM ="{\"groupId\":\"344C1C8B149\",\"groupName\":\"myGroup\",\"addId\":\"11111111\",\"isAdmin\":\"false\"}";
-private static final int GROUP_TYPE = 256;
-int result = deviceGroupManager.addMemberToGroup(APP_ID, reqId, ADD_PARAM, CONN_PARAM, GROUP_TYPE);
-```
-
-1. 获取群组管理的实例;
-
- ```
- deviceGroupManager = HwDeviceGroupManager.getInstance(mAbility, APP_ID, hichainGroupCallback);
- ```
-
-2. 设置添加成员的网络连接参数,为JSON格式,为软总线支持的网络参数字段,包括WIFI\_IP,WIFI\_PORT,BLR\_MAC,DEVICE\_ID等,具体连接参数要求参见软总线;
-
- ```
- String CONN_PARAM ="{\"DEVICE_ID\":\"11111111\",\"WIFI_IP\":\"192.168.43.149\",\"WIFI_PORT\":\"30000\",\"BLE_MAC\":\"\"}";
- ```
-
-3. 设置添加成员的成员信息参数,为JSON格式,包括欲添加的群组ID,群组名,是否是管理员,若是主动邀请对方加入,则isAdmin字段为true,若是主动加入对方群组,则isAdmin为false
-
- ```
- String ADD_PARAM ="{\"groupId\":\"344C1C8B149\",\"groupName\":\"myGroup\",\"addId\":\"11111111\",\"isAdmin\":\"false\"}";
- ```
-
-4. 设置欲添加的群组的群组类型为256,即点对点群组;
-
- ```
- private static final int GROUP_TYPE = 256;
- ```
-
-5. 在HichainGroupCallback 的onRequest函数,参见场景一列出的generateConfirmation传入指定的参数,其中PIN\_CODE为为PIN码,由上层业务提供界面给用户输入,确保分布式场景两端设置的PIN码一致,后续步骤才能成功;
-
- ```
- private JSONObject generateConfirmation(int confirmation) {
- JSONObject jsonObject = new JSONObject();
- try { jsonObject.put("pinCode", PIN_CODE);
- jsonObject.put("confirmation", confirmation);
- } catch (JSONException e) {
- LogUtil.error(TAG, "" + e.getMessage());
- }
- return jsonObject;
- }
- ```
-
-6. 调用群组管理的添加成员接口
-
- ```
- result = deviceGroupManager.addMemberToGroup(APP_ID, reqId, ADD_PARAM, CONN_PARAM, GROUP_TYPE);
- ```
-
-7. 若添加成功,将会收到HichainGroupCallback.onFinish的回调,其中operationCode参数为OperationCode.JOIN
-8. 添加成员成功后,业务可以调用软总线请求创建设备间安全会话。
-
-## 调测验证
-
-1 在OpenHarmony上开发应用App。
-
-2 根据开发指导开发,开发应用App。
-
-3 执行创建群组操作,如果收到onFinish回调,代表创建群组成功。
-
-4 在分布式组网的节点部署相同的App,假设当前部署的有节点A和节点B;
-
-5 通过上层将节点B的连接参数,通过扫码的方式,传递到节点A,
-
-6 节点A上App创建一个群组group1,节点A上App调用添加成员接口,将B加入到group1中,若收到HichainGroupCallback.onFinish,表明加入群组成功;
-
diff --git "a/zh-cn/device-dev/subsystems/\345\256\211\345\205\250.md" "b/zh-cn/device-dev/subsystems/\345\256\211\345\205\250.md"
old mode 100755
new mode 100644
index 88ce479aa01d95df97297fd45bd3ac17d0d16ff1..2ac7b9aa571ab686272175d28f8984c388a8ef7d
--- "a/zh-cn/device-dev/subsystems/\345\256\211\345\205\250.md"
+++ "b/zh-cn/device-dev/subsystems/\345\256\211\345\205\250.md"
@@ -1,6 +1,6 @@
# 安全
-- **[概述](概述-7.md)**
+- **[概述](概述-2.md)**
- **[应用验签开发指导](应用验签开发指导.md)**
@@ -8,6 +8,4 @@
- **[IPC通信鉴权开发指导](IPC通信鉴权开发指导.md)**
-- **[可信设备群组管理开发指导](可信设备群组管理开发指导.md)**
-
diff --git "a/zh-cn/device-dev/subsystems/\345\272\224\347\224\250\346\235\203\351\231\220\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/zh-cn/device-dev/subsystems/\345\272\224\347\224\250\346\235\203\351\231\220\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md"
old mode 100755
new mode 100644
diff --git "a/zh-cn/device-dev/subsystems/\345\272\224\347\224\250\351\252\214\347\255\276\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/zh-cn/device-dev/subsystems/\345\272\224\347\224\250\351\252\214\347\255\276\345\274\200\345\217\221\346\214\207\345\257\274.md"
old mode 100755
new mode 100644
diff --git "a/zh-cn/device-dev/subsystems/\345\274\200\345\217\221\345\256\236\344\276\213-6.md" "b/zh-cn/device-dev/subsystems/\345\274\200\345\217\221\345\256\236\344\276\213-6.md"
deleted file mode 100755
index 39c2377cd403b1b3aaed2c97947c6cea63b4e6dc..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/\345\274\200\345\217\221\345\256\236\344\276\213-6.md"
+++ /dev/null
@@ -1,112 +0,0 @@
-# 开发实例
-
-- [去电开发实例](#section286643718507)
-- [来电开发实例](#section3205350105014)
-
-## 去电开发实例
-
-去电的调用流程示例如下图所示:
-
-**图 1** 去电调用流程图
-
-
-
-
-当应用触发去电动作时,RIL Adapter会接收到拨打电话的请求,OnRequest\(\)会根据拨打电话请求ID调用拨打电话的接口。在该接口里会把电话服务传过来的数据封装为对应的AT指令发送到Modem,Modem执行完拨号命令后通过OnRequestResponse\(\)接口把响应结果上报给RIL Adapter。
-
-```
-#include
-#include
-#include
-#include
-#include "atchannel.h"
-#include "at_tok.h"
-#include "hdf_log.h"
-#include "ril.h"
-
-static void OnRequest(int request, void *data, size_t datalen, RIL_Token token)
-{
- HDF_LOGI("OnRequest request = %{public}d start \n", request);
- switch (request) {
- case HREQ_CALL_DIAL:
- SendDialRequest(data, datalen, token);
- break;
- ……
- default:
- break;
- }
-}
-
-// 将去电ID和参数转换成对应的AT命令,通过send_at_request发送给Modem
-static void SendDialRequest(void *data, size_t datalen __unused, RIL_Token token)
-{
- char *atCmd;
- const char *clir;
- int ret;
- DialInfo *pDial;
- pDial = (DialInfo *) data;
-
- if (!strncmp(pDial->address, "*31#", 4)) {
- HDF_LOGI("clir suppression");
- clir = "i";
- num = (char *)&(pDial->address[4]);
- } else if (!strncmp(pDial->address, "#31#", 4)) {
- HDF_LOGI("clir invocation");
- clir = "I";
- num = (char *)&(pDial->address[4]);
- } else {
- HDF_LOGI("set clir state to default");
- clir = "";
- num = (char *)pDial->number;
- }
-
- asprintf(&atCmd, "ATD%s%s;", pDial->address, clir);
- ret = send_at_request(atCmd, NULL);
- free(atCmd);
- // 命令执行完成后调用该接口,将Modem执行的结果反馈给RIL Adapter
- OnRequestResponse(t, RIL_RESULT_SUCCESS, NULL, 0);
-}
-```
-
-## 来电开发实例
-
-来电的调用流程示例如下图所示:
-
-**图 2** 来电调用流程图
-
-
-
-
-Modem设备节点读取线程s\_tid\_read会循环读取Modem上报的消息,当Modem接收到来电时会主动上报来电相关的信息;
-
-当该线程通过调用OnNotificationResponse\(\)解析到Modem上报的数据是以"+CRING"、"RING"等字符开头时,表示有来电事件,然后通过OnRadioEventNotify\(HNOTI\_CALL\_STATUS, NULL, 0\)上报给RIL Adapter完成来电事件上报。
-
-```
-#include
-#include "atchannel.h"
-#include "at_tok.h"
-#include "hdf_log.h"
-#include "ril.h"
-
-bool IsCallStatusUpdated(const char *s)
-{
- return (StrBeginWith(s, "+CRING:")
- || StrBeginWith(s, "RING")
- || StrBeginWith(s, "NO CARRIER")
- || StrBeginWith(s, "+CCWA"));
-}
-
-// 将Modem上报数据解析为对应的Modem事件
-static void OnNotificationResponse(const char *s, const char *sms_pdu)
-{
- char *line = NULL, *p;
- HDF_LOGI("OnNotificationResponse = %{public}s sState = %{public}d", s, sState);
- // 解析到以"+CRING:"等字符开头的数据时,转换为来电事件
- if (IsCallStatusUpdated(s)) {
- // 通知RIL Adapter有来电事件
- OnRadioEventNotify(HNOTI_CALL_STATUS, NULL, 0);
- }
- ……
-}
-```
-
diff --git "a/zh-cn/device-dev/subsystems/\345\274\200\345\217\221\346\214\207\345\257\274-3.md" "b/zh-cn/device-dev/subsystems/\345\274\200\345\217\221\346\214\207\345\257\274-1.md"
similarity index 100%
rename from "zh-cn/device-dev/subsystems/\345\274\200\345\217\221\346\214\207\345\257\274-3.md"
rename to "zh-cn/device-dev/subsystems/\345\274\200\345\217\221\346\214\207\345\257\274-1.md"
diff --git "a/zh-cn/device-dev/subsystems/\345\274\200\345\217\221\346\214\207\345\257\274-5.md" "b/zh-cn/device-dev/subsystems/\345\274\200\345\217\221\346\214\207\345\257\274-5.md"
deleted file mode 100755
index cd3f58d79fd22f548f694d86830562b3494428c2..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/\345\274\200\345\217\221\346\214\207\345\257\274-5.md"
+++ /dev/null
@@ -1,11 +0,0 @@
-# 开发指导
-
-- **[Modem厂商库集成指导](Modem厂商库集成指导.md)**
-
-- **[Modem厂商库初始化开发指导](Modem厂商库初始化开发指导.md)**
-
-- **[Modem业务请求及响应开发指导](Modem业务请求及响应开发指导.md)**
-
-- **[Modem事件上报开发指导](Modem事件上报开发指导.md)**
-
-
diff --git "a/zh-cn/device-dev/subsystems/\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/zh-cn/device-dev/subsystems/\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md"
index 2b37619913040891523cba68ded948d628a273f5..0e1ebbfecfc56b1d4eecf483c07c4c646cb85e0b 100755
--- "a/zh-cn/device-dev/subsystems/\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md"
+++ "b/zh-cn/device-dev/subsystems/\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md"
@@ -385,6 +385,7 @@
Surface *surface = Surface::CreateSurface();
if (surface == nullptr) {
delete fc;
+ return;
}
surface->SetWidthAndHeight(1920, 1080); /* 1920:width,1080:height */
fc->AddSurface(*surface);
diff --git "a/zh-cn/device-dev/subsystems/\346\220\255\345\273\272\347\216\257\345\242\203-2.md" "b/zh-cn/device-dev/subsystems/\346\220\255\345\273\272\347\216\257\345\242\203-0.md"
old mode 100755
new mode 100644
similarity index 100%
rename from "zh-cn/device-dev/subsystems/\346\220\255\345\273\272\347\216\257\345\242\203-2.md"
rename to "zh-cn/device-dev/subsystems/\346\220\255\345\273\272\347\216\257\345\242\203-0.md"
diff --git "a/zh-cn/device-dev/subsystems/\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" "b/zh-cn/device-dev/subsystems/\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md"
deleted file mode 100644
index 6c6cf033328d93b995af036b0607bb9c31bb37ef..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md"
+++ /dev/null
@@ -1,7 +0,0 @@
-# 标准系统编译构建指导
-
-- **[编译构建概述](编译构建概述-0.md)**
-
-- **[编译构建使用指导](编译构建使用指导-1.md)**
-
-
diff --git "a/zh-cn/device-dev/subsystems/\346\246\202\350\277\260-7.md" "b/zh-cn/device-dev/subsystems/\346\246\202\350\277\260-2.md"
similarity index 100%
rename from "zh-cn/device-dev/subsystems/\346\246\202\350\277\260-7.md"
rename to "zh-cn/device-dev/subsystems/\346\246\202\350\277\260-2.md"
diff --git "a/zh-cn/device-dev/subsystems/\346\246\202\350\277\260.md" "b/zh-cn/device-dev/subsystems/\346\246\202\350\277\260.md"
index 63ee16f94ce7de540c47dae8ab52a5aef504889b..3edb13ccbc396b35961edfd5548283fa096cd6bd 100755
--- "a/zh-cn/device-dev/subsystems/\346\246\202\350\277\260.md"
+++ "b/zh-cn/device-dev/subsystems/\346\246\202\350\277\260.md"
@@ -73,7 +73,7 @@ Ability子系统是管理OpenHarmony应用运行状态的开发框架。
- **AbilityKit**:Ability框架提供给开发者的开发包,开发者基于该开发包可以开发出基于Ability组件的应用。基于Ability组件开发的应用有两种类型:基于Javascript语言开发的Ability(JS Ability)和基于C/C++语言开发的Ability(Native Ability)。JS应用开发框架是开发者开发JS Ability所用到框架,是在AbilityKit基础封装的包含js UI组件的一套方便开发者能够迅速开发Ability应用的框架。
- **AbilityLoader**:负责注册和加载开发者Ability的模块。开发者开发的Ability先要调用AbilityLoader的注册接口注册到框架中,接着Ability启动时会被实例化。
-- **AbilityManager**:负责AbilityKit和Ability管理服务进行IPC的通信。
+- **AbilityManager:**负责AbilityKit和Ability管理服务进行IPC的通信。
- **EventHandler**:AbilityKit提供给开发者的用于在Ability中实现线程间通信的一个模块。
diff --git "a/zh-cn/device-dev/subsystems/\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266.md" "b/zh-cn/device-dev/subsystems/\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266.md"
index 14552d89af7b37c90cd9edbbc22f1d2d6c2b0bcb..840c204266911e6cb5771d178004db2f27017f48 100755
--- "a/zh-cn/device-dev/subsystems/\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266.md"
+++ "b/zh-cn/device-dev/subsystems/\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266.md"
@@ -2,9 +2,9 @@
- **[概述](概述.md)**
-- **[搭建环境](搭建环境-2.md)**
+- **[搭建环境](搭建环境-0.md)**
-- **[开发指导](开发指导-3.md)**
+- **[开发指导](开发指导-1.md)**
- **[开发实例](开发实例.md)**
diff --git "a/zh-cn/device-dev/subsystems/\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276.md" "b/zh-cn/device-dev/subsystems/\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276.md"
index 5c490a8cfbdc0458b160ce6b284ecd2582f2faad..71503a41dac0d9b78f5b156bf8c4b6cb5b44f161 100644
--- "a/zh-cn/device-dev/subsystems/\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276.md"
+++ "b/zh-cn/device-dev/subsystems/\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276.md"
@@ -4,6 +4,4 @@
- **[hdc\_std 使用指导](hdc_std-使用指导.md)**
-- **[hdc\_std常见问题](hdc_std常见问题.md)**
-
diff --git "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272.md" "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272.md"
index b59e4b2a18f9ef3c093e85b47b97126043b59744..fa8f3606d6e71269e60fb925c4ab438fe1524c8f 100755
--- "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272.md"
+++ "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272.md"
@@ -1,7 +1,7 @@
# 编译构建
-- **[轻量和小型系统编译构建指导](轻量和小型系统编译构建指导.md)**
+- **[编译构建子系统—轻量和小型系统](编译构建子系统-轻量和小型系统.md)**
-- **[标准系统编译构建指导](标准系统编译构建指导.md)**
+- **[编译构建子系统—标准系统](编译构建子系统-标准系统.md)**
diff --git "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\344\275\277\347\224\250\346\214\207\345\257\274.md" "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\344\275\277\347\224\250\346\214\207\345\257\274.md"
deleted file mode 100755
index 8d5f276817760d9b28e9bee264507fc2e6c6b533..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\344\275\277\347\224\250\346\214\207\345\257\274.md"
+++ /dev/null
@@ -1,431 +0,0 @@
-# 编译构建使用指导
-
-- [前提条件](#section13333171022312)
-- [hb命令行工具使用](#section477242204612)
-- [新增组件](#section4207112818418)
-- [新增芯片解决方案](#section2737141421917)
-- [新增产品解决方案](#section720881917199)
-
-## 前提条件
-
-开发环境需安装gn、ninja构建工具、python 3.7.4及以上和hb。安装方法请见[搭建系统基础环境](../quick-start/搭建系统环境.md)。
-
-## hb命令行工具使用
-
-hb是OpenHarmony的命令行工具,用来执行编译命令。以下对hb的常用命令进行说明。
-
-1. **hb set**
-
- ```
- hb set -h
- usage: hb set [-h] [-root [ROOT_PATH]] [-p]
-
- optional arguments:
- -h, --help show this help message and exit
- -root [ROOT_PATH], --root_path [ROOT_PATH]
- Set OHOS root path
- -p, --product Set OHOS board and kernel
- ```
-
- - hb set 后无参数,进入默认设置流程
- - hb set -root dir可直接设置代码根目录
- - hb set -p设置要编译的产品
-
-2. **hb env**
-
- 查看当前设置信息
-
- ```
- hb env
- [OHOS INFO] root path: xxx
- [OHOS INFO] board: hispark_taurus
- [OHOS INFO] kernel: liteos
- [OHOS INFO] product: ipcamera
- [OHOS INFO] product path: xxx/vendor/hisilicon/ipcamera
- [OHOS INFO] device path: xxx/device/hisilicon/hispark_taurus/sdk_linux_4.19
- ```
-
-3. **hb build**
-
- ```
- hb build -h
- usage: hb build [-h] [-b BUILD_TYPE] [-c COMPILER] [-t [TEST [TEST ...]]]
- [--dmverity] [-p PRODUCT] [-f] [-n]
- [component [component ...]]
-
- positional arguments:
- component name of the component
-
- optional arguments:
- -h, --help show this help message and exit
- -b BUILD_TYPE, --build_type BUILD_TYPE
- release or debug version
- -t [TEST [TEST ...]], --test [TEST [TEST ...]]
- compile test suit
- --dmverity Enable dmverity
- -p PRODUCT, --product PRODUCT
- build a specified product with
- {product_name}@{company}, eg: ipcamera@hisilcon
- -f, --full full code compilation
- -T [TARGET [TARGET ...]], --target [TARGET [TARGET ...]]
- Compile single target
- ```
-
- - hb build后无参数,会按照设置好的代码路径、产品进行编译,编译选项使用与之前保持一致。-f 选项将删除当前产品所有编译产品,等同于hb clean + hb build.
- - hb build \{component\_name\}:基于设置好的产品对应的单板、内核,单独编译组件(e.g.:hb build kv\_store\)。
- - hb build -p ipcamera@hisilicon:免set编译产品,该命令可以跳过set步骤,直接编译产品。
- - 在device/device\_company/board下单独执行hb build会进入内核选择界面,选择完成后会根据当前路径的单板、选择的内核编译出仅包含内核、驱动的镜像。
-
-4. **hb clean**
-
- 清除out目录对应产品的编译产物,仅保留args.gn、build.log。清除指定路径可输入路径参数:hb clean out/board/product,默认将清除当前hb set的产品对应out路径。
-
- ```
- hb clean
- usage: hb clean [-h] [out_path]
-
- positional arguments:
- out_path clean a specified path.
-
- optional arguments:
- -h, --help show this help message and exit
- ```
-
-
-## 新增组件
-
-本小节介绍如何新增一个组件,首先确定组件归属的子系统和组件名称,然后按如下步骤新增:
-
-1. 源码开发完成后,添加组件编译脚本。
-
- 以编译组件hello\_world可执行文件为例,applications/sample/hello\_world/BUILD.gn可以写为:
-
- ```
- executable("hello_world") {
- include_dirs = [
- "include",
- ]
- sources = [
- "src/hello_world.c"
- ]
- }
- ```
-
- 如上编译脚本,可编译出一个可在OpenHarmony上运行的名为hello\_world的可执行文件。
-
- 单独编译该组件,hb set任意选择一款产品,然后使用-T选项单独编译组件:
-
- ```
- hb build -f -T //applications/sample/hello_world
- ```
-
- 组件在开发板上功能验证完成后,可按步骤2\~5将组件配置到产品中。
-
-2. 添加组件描述。
-
- 组件描述位于build/lite/components下,新增的组件需加入对应子系统的json文件中。一个组件描述必选的字段有:
-
- - component:组件名称。
- - description:组件的一句话功能描述。
- - optional:组件是否为系统可选。
- - dirs:组件源码路径。
- - targets:组件编译入口。
-
- 以将hello\_world组件加入应用子系统为例,在applications.json中添加hello\_world对象:
-
- ```
- {
- "components": [
- {
- "component": "hello_world",
- "description": "Hello world.",
- "optional": "true",
- "dirs": [
- "applications/sample/hello_world"
- ],
- "targets": [
- "//applications/sample/hello_world"
- ]
- },
- ...
- ]
- }
- ```
-
-3. 将组件配置到产品。
-
- 产品的配置文件config.json位于位于vendor/company/product/下,产品配置文件需包含产品名称、OpenHarmony版本号、device厂商、开发板、内核类型、内核版本号,以及配置的子系统和组件。以将hello\_world组件加入产品配置文件my\_product.json中为例,加入hello\_wolrd对象:
-
- ```
- {
- "product_name": "hello_world_test",
- "ohos_version": "OpenHarmony 1.0",
- "device_company": "hisilicon",
- "board": "hispark_taurus",
- "kernel_type": "liteos_a",
- "kernel_version": "1.0.0",
- "subsystems": [
- {
- "subsystem": "applications",
- "components": [
- { "component": "hello_world", "features":[] }
- ]
- },
- ...
- ]
- }
- ```
-
-4. 编译产品。
-
- 1. 代码根目录输入hb set选择对应产品。
-
- 2. 执行hb build。
-
-
-## 新增芯片解决方案
-
-编译构建支持添加新的芯片解决方案厂商,具体步骤如下:
-
-1. 创建芯片解决方案目录。
-
- 按照[芯片解决方案配置规则](编译构建概述.md#section1625463413327)创建目录,以芯片厂商realtek的“rtl8720“开发板为例, 在代码根目录执行:
-
- ```
- mkdir -p device/realtek/rtl8720
- ```
-
-2. 创建内核适配目录,并编写开发板编译配置config.gni文件。
-
- 以realtek的“rtl8720“开发板的liteos\_m适配为例,device/realtek/rtl8720/liteos\_a/config.gni的内容如下:
-
- ```
- # Kernel type, e.g. "linux", "liteos_a", "liteos_m".
- kernel_type = "liteos_a"
-
- # Kernel version.
- kernel_version = "3.0.0"
-
- # Board CPU type, e.g. "cortex-a7", "riscv32".
- board_cpu = "real-m300"
-
- # Board arch, e.g. "armv7-a", "rv32imac".
- board_arch = ""
-
- # Toolchain name used for system compiling.
- # E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf.
- # Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toochain.
- board_toolchain = "gcc-arm-none-eabi"
-
- # The toolchain path instatlled, it's not mandatory if you have added toolchian path to your ~/.bashrc.
- board_toolchain_path =
- rebase_path("//prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi/bin",
- root_build_dir)
-
- # Compiler prefix.
- board_toolchain_prefix = "gcc-arm-none-eabi-"
-
- # Compiler type, "gcc" or "clang".
- board_toolchain_type = "gcc"
-
- # Board related common compile flags.
- board_cflags = []
- board_cxx_flags = []
- board_ld_flags = []
- ```
-
-3. 编写编译脚本。
-
- 在开发板目录下创建BUILD.gn,target名称应与开发板名称一致。以realtek的rtl8720开发板为例,device/realtek/rtl8720/BUILD.gn内容可以是:
-
- ```
- group("rtl8720") { # target类型也可以shared_library, static_library, executable
- # 具体内容
- ......
- }
- ```
-
-4. 编译芯片解决方案。
-
- 在开发板目录下执行hb build,即可启动芯片解决方案的编译。
-
-
-## 新增产品解决方案
-
-编译构建支持芯片解决方案和组件的灵活拼装,形成定制化的产品解决方案。具体步骤如下:
-
-1. 创建产品目录
-
- 按照[产品解决方案配置规则](编译构建概述.md#section1625463413327)创建产品目录,以基于“rtl8720“开发板的wifiiot模组为例,在代码根目录执行:
-
- ```
- mkdir -p vendor/my_company/wifiiot
- ```
-
-2. 拼装产品
-
- 在新建的产品目录下新建config.json文件,以步骤1中的wifiiot为例,vendor/my\_company/wifiiot/config.json可以是:
-
- ```
- {
- "product_name": "wifiiot", # 产品名称
- "ohos_version": "OpenHarmony 1.0", # 使用的OS版本
- "device_company": "realtek", # 芯片解决方案厂商名称
- "board": "rtl8720", # 开发板名称
- "kernel_type": "liteos_m", # 选择的内核类型
- "kernel_version": "3.0.0", # 选择的内核版本
- "subsystems": [
- {
- "subsystem": "kernel", # 选择的子系统
- "components": [
- { "component": "liteos_m", "features":[] } # 选择的组件和组件特性
- ]
- },
- ...
- {
- 更多子系统和组件
- }
- ]
- }
- ```
-
- 注意:编译构建系统编译前会对device\_company,board,kernel\_type,kernel\_version、subsystem、component字段进行有效性检查,其中device\_company,board,kernel\_type,kernel\_version应与已知的芯片解决方案匹配,subsystem、component应与build/lite/components下的组件描述匹配。
-
-3. 适配OS接口
-
- 在产品目录下创建hals目录,并将产品解决方案对OS适配的源码和编译脚本放入该目录下。
-
-4. 配置系统服务
-
- 在产品目录下创建init\_configs目录,并在init\_configs目录下创建init.cfg文件,按需配置要启动的系统服务。
-
-5. 配置init进程(仅linux内核需要)
-
- 在init\_configs目录下创建etc目录,然后在etc下创建init.d文件夹和fstab文件。最后按产品需求在init.d文件下创建并编辑rcS文件和Sxxx文件。
-
-6. 配置文件系统镜像(可选,仅支持文件系统的开发板需要)
-
- 在产品目录下创建fs.yml文件。fs.yml需按产品实际情况配置,一个典型的fs.yml文件如下:
-
- ```
- -
- fs_dir_name: rootfs # 镜像的名称
- fs_dirs:
- -
- # 将编译生成的out/my_board/my_product/bin目录下的文件拷贝到rootfs/bin中,并忽略测试bin
- source_dir: bin
- target_dir: bin
- ignore_files:
- - Test.bin
- - TestSuite.bin
- -
- # 将编译生成的out/my_board/my_product/libs目录下的文件拷贝到rootfs/lib中,忽略所有.a文件,并设置文件和文件夹的权限为644和755
- source_dir: libs
- target_dir: lib
- ignore_files:
- - .a
- dir_mode: 755
- file_mode: 644
- -
- source_dir: usr/lib
- target_dir: usr/lib
- ignore_files:
- - .a
- dir_mode: 755
- file_mode: 644
- -
- source_dir: config
- target_dir: etc
- -
- source_dir: system
- target_dir: system
- -
- source_dir: sbin
- target_dir: sbin
- -
- source_dir: usr/bin
- target_dir: usr/bin
- -
- source_dir: usr/sbin
- target_dir: usr/sbin
- -
- # 创建一个proc空目录
- target_dir: proc
- -
- target_dir: mnt
- -
- target_dir: opt
- -
- target_dir: tmp
- -
- target_dir: var
- -
- target_dir: sys
- -
- source_dir: etc
- target_dir: etc
- -
- source_dir: vendor
- target_dir: vendor
- -
- target_dir: storage
-
- fs_filemode:
- -
- file_dir: lib/ld-uClibc-0.9.33.2.so
- file_mode: 555
- -
- file_dir: lib/ld-2.24.so
- file_mode: 555
- -
- file_dir: etc/init.cfg
- file_mode: 400
- fs_symlink:
- -
- # 在rootfs/lib下创建软连接ld-musl-arm.so.1 -> libc.so
- source: libc.so
- link_name: ${fs_dir}/lib/ld-musl-arm.so.1
- -
- source: mksh
- link_name: ${fs_dir}/bin/sh
- -
- source: mksh
- link_name: ${fs_dir}/bin/shell
- fs_make_cmd:
- # 使用脚本将rootfs制作为ext4格式的image
- - ${root_path}/build/lite/make_rootfs/rootfsimg_linux.sh ${fs_dir} ext4
- -
- fs_dir_name: userfs
- fs_dirs:
- -
- source_dir: storage/etc
- target_dir: etc
- -
- source_dir: data
- target_dir: data
- fs_make_cmd:
- - ${root_path}/build/lite/make_rootfs/rootfsimg_linux.sh ${fs_dir} ext4
-
- ```
-
-7. 编写编译脚本
-
- 在产品目录下创建BUILD.gn文件,按产品实际情况编写脚本。以步骤1中的wifiiot为例,BUILD.gn示例如下:
-
- ```
- group("wifiiot") { # target名称与产品名一致
- deps = []
- # 拷贝init配置
- deps += [ "init_configs" ]
- # 将hals加入编译
- deps += [ "hals" ]
- # 其他
- ......
- }
- ```
-
-8. 编译产品。
-
- 在代码根目录执行hb set按提示选择新增的产品,然后执行hb build即可启动编译。
-
-
diff --git "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\344\275\277\347\224\250\346\214\207\345\257\274-1.md" "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237-\346\240\207\345\207\206\347\263\273\347\273\237.md"
old mode 100755
new mode 100644
similarity index 66%
rename from "zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\344\275\277\347\224\250\346\214\207\345\257\274-1.md"
rename to "zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237-\346\240\207\345\207\206\347\263\273\347\273\237.md"
index 661ff10cf6bdcb8d16510560214c53e124813a6d..ec1cb9420870543a825e4ab6b34125dca243b0c9
--- "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\344\275\277\347\224\250\346\214\207\345\257\274-1.md"
+++ "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237-\346\240\207\345\207\206\347\263\273\347\273\237.md"
@@ -1,12 +1,73 @@
-# 编译构建使用指导
+# 编译构建子系统—标准系统
-- [目录结构](#section56731811102915)
-- [编译](#section1069873833818)
- - [编译命令](#section2740182614395)
+- [概述](#section17466112012244)
+ - [基本概念](#section445513507246)
+ - [运作机制](#section12541217142510)
+ - [约束与限制](#section886933762513)
-- [开发步骤](#section4207112818418)
+- [编译构建使用指导](#section16901215262)
+ - [目录结构](#section109065332264)
+ - [编译命令](#section123265539266)
+ - [开发步骤](#section591084422719)
-## 目录结构
+
+## 概述
+
+编译构建子系统提供了一个基于gn和ninja的编译构建框架。主要提供以下功能:
+
+- 构建不同芯片平台的产品。如:Hi3516DV300平台。
+
+- 根据产品配置可以按照组件组装打包产品需要的能力。
+
+### 基本概念
+
+在了解编译构建子系统的能力前,应了解如下基本概念:
+
+- 平台
+
+ 开发板和内核的组合,不同平台支持的子系统和组件不同。
+
+- 子系统
+
+ OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 \> 子系统 \> 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或组件。子系统是一个逻辑概念,它具体由对应的组件构成。
+
+- 组件
+
+ 对子系统的进一步拆分,可复用的软件单元,它包含源码、配置文件、资源文件和编译脚本;能独立构建,以二进制方式集成,具备独立验证能力的二进制单元。
+
+- gn
+
+ Generate ninja的缩写,用于产生ninja文件。
+
+- ninja
+
+ ninja是一个专注于速度的小型构建系统。
+
+
+### 运作机制
+
+OpenHarmony侧的编译构建流程主要包括编译命令行解析,调用gn,执行ninja:
+
+- 命令行解析:解析待编译的产品名称,加载相关配置。
+- 调用gn: 根据命令行解析的产品名称和编译类型,配置编译工具链和全局的编译选项。
+- 执行ninja:启动编译并生成对应的产品版本。
+
+### 约束与限制
+
+- 需按照[源码获取](../get-code/源码获取.md)指导下载全量源码(采用方式三获取)。
+- 编译环境需要Ubuntu18.04及以上版本。
+- 安装编译所需的程序包。
+
+ 安装命令:
+
+ ```
+ sudo apt-get install binutils git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4
+ ```
+
+
+## 编译构建使用指导
+
+### 目录结构
```
/build # 编译构建主目录
@@ -27,9 +88,7 @@
└── toolchain # 编译工具链配置
```
-## 编译
-
-### 编译命令
+### 编译命令
- 代码根目录下执行全量版本的编译命令:
@@ -51,7 +110,7 @@
```
-## 开发步骤
+### 开发步骤
1. 添加组件。
diff --git "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\346\246\202\350\277\260.md" "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237-\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237.md"
old mode 100755
new mode 100644
similarity index 39%
rename from "zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\346\246\202\350\277\260.md"
rename to "zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237-\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237.md"
index 83423cbe1c9b0d7f4bfd6bae3124b490c43cd6c8..5933ac0bab5e87df9f63b0f74f266bb7c8e080eb
--- "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\346\246\202\350\277\260.md"
+++ "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237-\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237.md"
@@ -1,9 +1,32 @@
-# 编译构建概述
+# 编译构建子系统—轻量和小型系统
-- [基本概念](#section175012297491)
-- [目录结构](#section3267040205617)
-- [构建流程](#section193961322175011)
-- [组件、芯片解决方案和产品解决方案配置规则](#section1625463413327)
+- [概述](#section10958256161119)
+ - [基本概念](#section1732301411128)
+ - [目录结构](#section1588744014121)
+ - [构建流程](#section15761735134)
+
+- [配置规则](#section2345183962710)
+ - [组件](#section142532518308)
+ - [芯片解决方案](#section121501451143710)
+ - [产品解决方案](#section134549283435)
+
+- [使用指导](#section13754457192211)
+ - [前提条件](#section31651120233)
+ - [hb工具使用说明](#section1133304172313)
+ - [新增组件](#section167110415315)
+ - [新增芯片解决方案](#section1474718565412)
+ - [新增产品解决方案](#section1097623294220)
+
+- [常见问题](#section19909721104319)
+ - [ninja版本问题导致编译失败](#section138233464318)
+ - [ncurses库缺失导致编译失败](#section151033911442)
+ - [未安装mcopy导致编译失败](#section19811838104418)
+ - [权限问题导致编译失败](#section03111118451)
+ - [未安装Crypto导致编译失败](#section69981127125013)
+ - [编译环境为shell导致编译失败](#section967617530505)
+
+
+## 概述
一个基于gn和ninja的构建系统,以支持OpenHarmony组件化开发为目标,提供以下基本功能:
@@ -12,7 +35,7 @@
- 独立构建芯片解决方案厂商源码。
- 独立构建单个组件。
-## 基本概念
+### 基本概念
在使用编译构建子系统前,应了解如下基本概念:
@@ -38,7 +61,7 @@
OpenHarmony的命令行工具,用来执行编译命令。
-## 目录结构
+### 目录结构
```
build/lite
@@ -55,7 +78,7 @@ build/lite
└── toolchain # 编译工具链配置,包括:编译器路径、编译选项、链接选项等
```
-## 构建流程
+### 构建流程
编译构建流程如[图1 ](#fig9744112715161)所示,主要分设置和编译两步:
@@ -70,13 +93,16 @@ build/lite
- 系统镜像打包:将组件编译产物打包,设置文件属性和权限,制作文件系统镜像。
-## 组件、芯片解决方案和产品解决方案配置规则
+## 配置规则
为了实现芯片解决方案、产品解决方案与OpenHarmony是解耦的、可插拔的,组件、芯片解决方案和产品解决方案的路径、目录树和配置需遵循一定的规则,具体如下:
-- **组件**
+### **组件**
+
+组件源码路径命名规则为:**\{领域\}/\{子系统\}/\{组件\}**,组件目录树规则如下:
-组件源码路径命名规则为:_\{领域\}/\{子系统\}/\{组件\}_,组件目录树规则如下:
+> **注意:**
+>组件的名称、源码路径、功能简介、是否必选、编译目标、RAM、ROM、编译输出、已适配的内核、可配置的特性和依赖等属性定义在build/lite/components目录下对应子系统的json文件中,新增组件时需要在对应子系统json文件中添加相应的组件定义。产品所配置的组件必须在某个子系统中被定义过,否则会校验失败。
```
component
@@ -88,8 +114,6 @@ component
└── BUILD.gn # 组件编译脚本
```
-组件的名称、源码路径、功能简介、是否必选、编译目标、RAM、ROM、编译输出、已适配的内核、可配置的特性和依赖等属性定义在build/lite/components目录下对应子系统的json文件中,新增组件时需要在对应子系统json文件中添加相应的组件定义。产品所配置的组件必须在某个子系统中被定义过,否则会校验失败。
-
以泛sensor子系统的sensor服务组件为例,组件属性定义描述文件字段说明如下:
```
@@ -125,13 +149,15 @@ component
}
```
-组件的编译脚本语言为gn,gn的基本用法请见[gn快速入门](https://gn.googlesource.com/gn/+/master/docs/quick_start.md)。组件即为gn定义的编译目标,可以为静态库、动态库、可执行文件或group。组件BUILD.gn的编写建议如下:
+组件BUILD.gn的编写建议如下:
-1)编译目标名称与组件一致。
+- 编译目标名称与组件一致。
+- 组件对外可配置的特性变量需声明在该组件BUILD.gn中,特性变量命名规则:ohos\_\{subsystem\}\_\{component\}\_\{feature\}。特性在组件描述中也需要同步定义,在产品配置文件config.json中按需配置。
+- 宏定义规则:OHOS\_\{SUBSYSTEM\}\_\{COMPONENT\}\_\{FEATURE\}
-2)组件对外可配置的特性变量需声明在该组件BUILD.gn中,特性变量命名规则:ohos\_\{subsystem\}\_\{component\}\_\{feature\}。特性在组件描述中也需要同步定义,在产品配置文件config.json中按需配置。
+ > **说明:**
+ >组件的编译脚本语言为gn,gn的基本用法请见[gn快速入门](https://gn.googlesource.com/gn/+/master/docs/quick_start.md)。组件即为gn定义的编译目标,可以为静态库、动态库、可执行文件或group。
-3)宏定义规则:OHOS\_\{SUBSYSTEM\}\_\{COMPONENT\}\_\{FEATURE\}
以图形的UI组件为例,foundation/graphic/ui/BUILD.gn文件如下:
@@ -180,9 +206,13 @@ component
}
```
-- **芯片解决方案**
+### **芯片解决方案**
+
+- 芯片解决方案是指基于某款开发板的完整解决方案,包含驱动、设备侧接口适配、开发板sdk等。
+- 芯片解决方案是一个特殊的组件,源码路径规则为:**device/\{芯片解决方案厂商\}/\{开发板\}**。
+- 芯片解决方案组件会随产品选择的开发板默认编译。
-芯片解决方案是指基于某款开发板的完整解决方案,包含驱动、设备侧接口适配、开发板sdk等。芯片解决方案是一个特殊的组件,源码路径规则为:_device/\{芯片解决方案厂商\}/\{开发板\}_。芯片解决方案组件会随产品选择的开发板默认编译。芯片解决方案目录树规则如下:
+芯片解决方案目录树规则如下:
```
device
@@ -196,7 +226,10 @@ device
└── config.gni # liteos_a版本编译配置
```
-config.gni为开发板编译相关的配置。编译时会采用该配置文件中的参数选择编译相应的OS组件,编译阶段系统全局可见。关键字段介绍如下:
+> **说明:**
+>config.gni为开发板编译相关的配置,编译时会采用该配置文件中的参数编译所有OS组件,编译阶段系统全局可见。
+
+config.gni的关键字段介绍如下:
```
kernel_type: 开发板使用的内核类型,例如:“liteos_a”, “liteos_m”, “linux”。
@@ -211,9 +244,11 @@ board_cxx_flags: 开发板配置的cpp文件编译选项。
board_ld_flags: 开发板配置的链接选项。
```
-- **产品解决方案**
+### **产品解决方案**
+
+产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、组件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为:**vendor/\{产品解决方案厂商\}/\{产品名称\}**_。_产品解决方案也是一个特殊的组件。
-产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、组件拼装配置、启动配置和文件系统配置等。源码路径规则为:_vendor/\{产品解决方案厂商\}/\{产品名称\}。_产品解决方案也是一个特殊的组件,目录树规则如下:
+产品解决方案的目录树规则如下:
```
vendor
@@ -229,25 +264,24 @@ vendor
└── ......
```
-新增产品须按如上的规则创建目录和文件,编译构建系统将按该规则扫描已配置的产品。关键的目录和文件详细介绍如下:
+> **注意:**
+>**新增产品须按如上的规则创建目录和文件,编译构建系统将按该规则扫描已配置的产品。**
-1. vendor/company/product/init\_configs/etc
+关键的目录和文件详细介绍如下:
- 该文件夹中包含rcS脚本,Sxxx脚本和fstab脚本,init进程在启动系统服务之前执行这些脚本。执行的流程为“rcS-\>fstab-\>S00-xxx“,Sxxx脚本中的内容与开发板和产品需要有关,主要包括设备节点的创建、创建目录、扫描设备节点、修改文件权限等等。这些文件在产品编译的BUILD.gn中按需拷贝到产品out目录中,最终打包到rootfs镜像中。
-
-2. vendor/company/product/init\_configs/init.cfg
-
- init进程启动服务的配置文件,当前支持解析的命令有:
+1. **vendor/company/product/init\_configs/etc**
- 1\) start: 启动某个服务
+ 该文件夹中包含rcS脚本,Sxxx脚本和fstab脚本。init进程在启动系统服务之前执行这些脚本。执行的流程为“rcS-\>fstab-\>S00-xxx“。Sxxx脚本中的内容与开发板和产品需要有关,主要包括设备节点的创建、创建目录、扫描设备节点、修改文件权限等等。这些文件在产品编译的BUILD.gn中按需拷贝到产品out目录中,最终打包到rootfs镜像中。
- 2\) mkdir: 创建文件夹
+2. **vendor/company/product/init\_configs/init.cfg**
- 3)chmod: 修改指定路径/文件的权限
-
- 4\) chown: 修改指定路径/文件的属组
+ init进程启动服务的配置文件,当前支持解析的命令有:
- 5\) mount: 挂载命令
+ - start: 启动某个服务
+ - mkdir: 创建文件夹
+ - chmod: 修改指定路径/文件的权限
+ - chown: 修改指定路径/文件的属组
+ - mount: 挂载命令
该文件中的各个字段的解释如下:
@@ -273,7 +307,7 @@ vendor
"start service1"
]
}, {
- "name" : "post-init", # 最后别执行的job, init进程启动完成后的处理(如驱动初始化后再mount设备)
+ "name" : "post-init", # 最后执行的job, init进程启动完成后的处理(如驱动初始化后再mount设备)
"cmds" : []
}
],
@@ -291,13 +325,15 @@ vendor
}
```
-3. vendor/company/product/init\_configs/hals
+3. **vendor/company/product/init\_configs/hals**
解决方案厂商对OS的适配,需要实现的接口请见各个组件的readme说明文档。
-4. vendor/company/product/config.json
+4. **vendor/company/product/config.json**
- config.json为编译构建的主入口,包含了开发板、OS组件和内核等配置信息。以基于hispark\_taurus开发板的ipcamera产品为例,配置文件如下:
+ config.json为编译构建的主入口,包含了开发板、OS组件和内核等配置信息。
+
+ 以基于hispark\_taurus开发板的ipcamera产品为例,配置文件如下:
```
{
@@ -323,7 +359,7 @@ vendor
}
```
-5. vendor/company/product/fs.yml
+5. **vendor/company/product/fs.yml**
该文件用于配置文件系统镜像制作过程,将编译产物打包成文件系统镜像,比如用户态根文件系统rootfs.img和可读写的userfs.img。它由多个列表组成,每个列表对应一个文件系统。字段说明如下:
@@ -364,7 +400,7 @@ vendor
> **说明:**
>fs.yml是可选的,对于没有文件系统的设备可不配置。
-6. vendor/company/product/BUILD.gn
+6. **vendor/company/product/BUILD.gn**
产品编译的入口,主要用于编译解决方案厂商源码和拷贝启动配置文件。如果某个产品被选择为要编译的产品,那么对应产品目录下的BUILD.gn会默认编译。一个典型的产品编译BUILD.gn应该如下:
@@ -379,3 +415,582 @@ vendor
```
+## 使用指导
+
+### 前提条件
+
+开发环境需安装gn、ninja构建工具、python 3.7.4及以上和hb。安装方法请见[搭建系统基础环境](../quick-start/搭建系统环境.md)。
+
+### hb工具使用说明
+
+hb是OpenHarmony的命令行工具,用来执行编译命令。以下对hb的常用命令进行说明。
+
+**hb set**
+
+```
+hb set -h
+usage: hb set [-h] [-root [ROOT_PATH]] [-p]
+
+optional arguments:
+ -h, --help show this help message and exit
+ -root [ROOT_PATH], --root_path [ROOT_PATH]
+ Set OHOS root path
+ -p, --product Set OHOS board and kernel
+```
+
+- hb set 后无参数,进入默认设置流程
+- hb set -root dir可直接设置代码根目录
+- hb set -p设置要编译的产品
+
+**hb env**
+
+查看当前设置信息
+
+```
+hb env
+[OHOS INFO] root path: xxx
+[OHOS INFO] board: hispark_taurus
+[OHOS INFO] kernel: liteos
+[OHOS INFO] product: ipcamera
+[OHOS INFO] product path: xxx/vendor/hisilicon/ipcamera
+[OHOS INFO] device path: xxx/device/hisilicon/hispark_taurus/sdk_linux_4.19
+```
+
+**hb build**
+
+```
+hb build -h
+usage: hb build [-h] [-b BUILD_TYPE] [-c COMPILER] [-t [TEST [TEST ...]]]
+ [--dmverity] [--tee] [-p PRODUCT] [-f] [-n]
+ [-T [TARGET [TARGET ...]]] [-v] [-shs] [--patch]
+ [component [component ...]]
+
+positional arguments:
+ component name of the component
+
+optional arguments:
+ -h, --help show this help message and exit
+ -b BUILD_TYPE, --build_type BUILD_TYPE
+ release or debug version
+ -c COMPILER, --compiler COMPILER
+ specify compiler
+ -t [TEST [TEST ...]], --test [TEST [TEST ...]]
+ compile test suit
+ --dmverity Enable dmverity
+ --tee Enable tee
+ -p PRODUCT, --product PRODUCT
+ build a specified product with
+ {product_name}@{company}, eg: camera@huawei
+ -f, --full full code compilation
+ -n, --ndk compile ndk
+ -T [TARGET [TARGET ...]], --target [TARGET [TARGET ...]]
+ Compile single target
+ -v, --verbose show all command lines while building
+ -shs, --sign_haps_by_server
+ sign haps by server
+ --patch apply product patch before compiling
+
+ --dmverity Enable dmverity
+ -p PRODUCT, --product PRODUCT
+ build a specified product with
+ {product_name}@{company}, eg: ipcamera@hisilcon
+ -f, --full full code compilation
+ -T [TARGET [TARGET ...]], --target [TARGET [TARGET ...]]
+ Compile single target
+```
+
+- hb build后无参数,会按照设置好的代码路径、产品进行编译,编译选项使用与之前保持一致。-f 选项将删除当前产品所有编译产品,等同于hb clean + hb build.
+- hb build \{component\_name\}:基于设置好的产品对应的单板、内核,单独编译组件(e.g.:hb build kv\_store\)。
+- hb build -p ipcamera@hisilicon:免set编译产品,该命令可以跳过set步骤,直接编译产品。
+- 在device/device\_company/board下单独执行hb build会进入内核选择界面,选择完成后会根据当前路径的单板、选择的内核编译出仅包含内核、驱动的镜像。
+
+**hb clean**
+
+清除out目录对应产品的编译产物,仅保留args.gn、build.log。清除指定路径可输入路径参数:hb clean out/board/product,默认将清除当前hb set的产品对应out路径。
+
+```
+hb clean
+usage: hb clean [-h] [out_path]
+
+positional arguments:
+ out_path clean a specified path.
+
+optional arguments:
+ -h, --help show this help message and exit
+```
+
+### 新增组件
+
+本小节介绍如何新增一个组件,首先确定组件归属的子系统和组件名称,然后按如下步骤新增:
+
+1. 源码开发完成后,添加组件编译脚本。
+
+ 以编译组件hello\_world可执行文件为例,applications/sample/hello\_world/BUILD.gn可以写为:
+
+ ```
+ executable("hello_world") {
+ include_dirs = [
+ "include",
+ ]
+ sources = [
+ "src/hello_world.c"
+ ]
+ }
+ ```
+
+ 如上编译脚本,可编译出一个可在OpenHarmony上运行的名为hello\_world的可执行文件。
+
+ 单独编译该组件,hb set任意选择一款产品,然后使用-T选项单独编译组件:
+
+ ```
+ hb build -f -T //applications/sample/hello_world
+ ```
+
+ 组件在开发板上功能验证完成后,可按[步骤2\~4](#li11471037297)将组件配置到产品中。
+
+2. 添加组件描述。
+
+ 组件描述位于build/lite/components下,新增的组件需加入对应子系统的json文件中。一个组件描述必选的字段有:
+
+ - component:组件名称。
+ - description:组件的一句话功能描述。
+ - optional:组件是否为系统可选。
+ - dirs:组件源码路径。
+ - targets:组件编译入口。
+
+ 以将hello\_world组件加入应用子系统为例,在applications.json中添加hello\_world对象:
+
+ ```
+ {
+ "components": [
+ {
+ "component": "hello_world",
+ "description": "Hello world.",
+ "optional": "true",
+ "dirs": [
+ "applications/sample/hello_world"
+ ],
+ "targets": [
+ "//applications/sample/hello_world"
+ ]
+ },
+ ...
+ ]
+ }
+ ```
+
+3. 将组件配置到产品。
+
+ 产品的配置文件config.json位于位于vendor/company/product/下,产品配置文件需包含产品名称、OpenHarmony版本号、device厂商、开发板、内核类型、内核版本号,以及配置的子系统和组件。以将hello\_world组件加入产品配置文件my\_product.json中为例,加入hello\_wolrd对象:
+
+ ```
+ {
+ "product_name": "hello_world_test",
+ "ohos_version": "OpenHarmony 1.0",
+ "device_company": "hisilicon",
+ "board": "hispark_taurus",
+ "kernel_type": "liteos_a",
+ "kernel_version": "1.0.0",
+ "subsystems": [
+ {
+ "subsystem": "applications",
+ "components": [
+ { "component": "hello_world", "features":[] }
+ ]
+ },
+ ...
+ ]
+ }
+ ```
+
+4. 编译产品。
+
+ 1. 代码根目录输入hb set选择对应产品。
+
+ 2. 执行hb build。
+
+
+### 新增芯片解决方案
+
+编译构建支持添加新的芯片解决方案厂商,具体步骤如下:
+
+1. 创建芯片解决方案目录。
+
+ 按照[芯片解决方案配置规则](#section1625463413327)创建目录,以芯片厂商realtek的“rtl8720“开发板为例, 在代码根目录执行:
+
+ ```
+ mkdir -p device/realtek/rtl8720
+ ```
+
+2. 创建内核适配目录,并编写开发板编译配置config.gni文件。
+
+ 以realtek的“rtl8720“开发板的liteos\_m适配为例,device/realtek/rtl8720/liteos\_a/config.gni的内容如下:
+
+ ```
+ # Kernel type, e.g. "linux", "liteos_a", "liteos_m".
+ kernel_type = "liteos_a"
+
+ # Kernel version.
+ kernel_version = "3.0.0"
+
+ # Board CPU type, e.g. "cortex-a7", "riscv32".
+ board_cpu = "real-m300"
+
+ # Board arch, e.g. "armv7-a", "rv32imac".
+ board_arch = ""
+
+ # Toolchain name used for system compiling.
+ # E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf.
+ # Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toochain.
+ board_toolchain = "gcc-arm-none-eabi"
+
+ # The toolchain path instatlled, it's not mandatory if you have added toolchian path to your ~/.bashrc.
+ board_toolchain_path =
+ rebase_path("//prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi/bin",
+ root_build_dir)
+
+ # Compiler prefix.
+ board_toolchain_prefix = "gcc-arm-none-eabi-"
+
+ # Compiler type, "gcc" or "clang".
+ board_toolchain_type = "gcc"
+
+ # Board related common compile flags.
+ board_cflags = []
+ board_cxx_flags = []
+ board_ld_flags = []
+ ```
+
+3. 编写编译脚本。
+
+ 在开发板目录下创建BUILD.gn,target名称应与开发板名称一致。以realtek的rtl8720开发板为例,device/realtek/rtl8720/BUILD.gn内容可以是:
+
+ ```
+ group("rtl8720") { # target类型也可以shared_library, static_library, executable
+ # 具体内容
+ ......
+ }
+ ```
+
+4. 编译芯片解决方案。
+
+ 在开发板目录下执行hb build,即可启动芯片解决方案的编译。
+
+
+### 新增产品解决方案
+
+编译构建支持芯片解决方案和组件的灵活拼装,形成定制化的产品解决方案。具体步骤如下:
+
+1. 创建产品目录
+
+ 按照[产品解决方案配置规则](#section1625463413327)创建产品目录,以基于“rtl8720“开发板的wifiiot模组为例,在代码根目录执行:
+
+ ```
+ mkdir -p vendor/my_company/wifiiot
+ ```
+
+2. 拼装产品
+
+ 在新建的产品目录下新建config.json文件,以步骤1中的wifiiot为例,vendor/my\_company/wifiiot/config.json可以是:
+
+ ```
+ {
+ "product_name": "wifiiot", # 产品名称
+ "ohos_version": "OpenHarmony 1.0", # 使用的OS版本
+ "device_company": "realtek", # 芯片解决方案厂商名称
+ "board": "rtl8720", # 开发板名称
+ "kernel_type": "liteos_m", # 选择的内核类型
+ "kernel_version": "3.0.0", # 选择的内核版本
+ "subsystems": [
+ {
+ "subsystem": "kernel", # 选择的子系统
+ "components": [
+ { "component": "liteos_m", "features":[] } # 选择的组件和组件特性
+ ]
+ },
+ ...
+ {
+ 更多子系统和组件
+ }
+ ]
+ }
+ ```
+
+ 注意:编译构建系统编译前会对device\_company,board,kernel\_type,kernel\_version、subsystem、component字段进行有效性检查,其中device\_company,board,kernel\_type,kernel\_version应与已知的芯片解决方案匹配,subsystem、component应与build/lite/components下的组件描述匹配。
+
+3. 适配OS接口
+
+ 在产品目录下创建hals目录,并将产品解决方案对OS适配的源码和编译脚本放入该目录下。
+
+4. 配置系统服务
+
+ 在产品目录下创建init\_configs目录,并在init\_configs目录下创建init.cfg文件,按需配置要启动的系统服务。
+
+5. 配置init进程(仅linux内核需要)
+
+ 在init\_configs目录下创建etc目录,然后在etc下创建init.d文件夹和fstab文件。最后按产品需求在init.d文件下创建并编辑rcS文件和Sxxx文件。
+
+6. 配置文件系统镜像(可选,仅支持文件系统的开发板需要)
+
+ 在产品目录下创建fs.yml文件。fs.yml需按产品实际情况配置,一个典型的fs.yml文件如下:
+
+ ```
+ -
+ fs_dir_name: rootfs # 镜像的名称
+ fs_dirs:
+ -
+ # 将编译生成的out/my_board/my_product/bin目录下的文件拷贝到rootfs/bin中,并忽略测试bin
+ source_dir: bin
+ target_dir: bin
+ ignore_files:
+ - Test.bin
+ - TestSuite.bin
+ -
+ # 将编译生成的out/my_board/my_product/libs目录下的文件拷贝到rootfs/lib中,忽略所有.a文件,并设置文件和文件夹的权限为644和755
+ source_dir: libs
+ target_dir: lib
+ ignore_files:
+ - .a
+ dir_mode: 755
+ file_mode: 644
+ -
+ source_dir: usr/lib
+ target_dir: usr/lib
+ ignore_files:
+ - .a
+ dir_mode: 755
+ file_mode: 644
+ -
+ source_dir: config
+ target_dir: etc
+ -
+ source_dir: system
+ target_dir: system
+ -
+ source_dir: sbin
+ target_dir: sbin
+ -
+ source_dir: usr/bin
+ target_dir: usr/bin
+ -
+ source_dir: usr/sbin
+ target_dir: usr/sbin
+ -
+ # 创建一个proc空目录
+ target_dir: proc
+ -
+ target_dir: mnt
+ -
+ target_dir: opt
+ -
+ target_dir: tmp
+ -
+ target_dir: var
+ -
+ target_dir: sys
+ -
+ source_dir: etc
+ target_dir: etc
+ -
+ source_dir: vendor
+ target_dir: vendor
+ -
+ target_dir: storage
+
+ fs_filemode:
+ -
+ file_dir: lib/ld-uClibc-0.9.33.2.so
+ file_mode: 555
+ -
+ file_dir: lib/ld-2.24.so
+ file_mode: 555
+ -
+ file_dir: etc/init.cfg
+ file_mode: 400
+ fs_symlink:
+ -
+ # 在rootfs/lib下创建软连接ld-musl-arm.so.1 -> libc.so
+ source: libc.so
+ link_name: ${fs_dir}/lib/ld-musl-arm.so.1
+ -
+ source: mksh
+ link_name: ${fs_dir}/bin/sh
+ -
+ source: mksh
+ link_name: ${fs_dir}/bin/shell
+ fs_make_cmd:
+ # 使用脚本将rootfs制作为ext4格式的image
+ - ${root_path}/build/lite/make_rootfs/rootfsimg_linux.sh ${fs_dir} ext4
+ -
+ fs_dir_name: userfs
+ fs_dirs:
+ -
+ source_dir: storage/etc
+ target_dir: etc
+ -
+ source_dir: data
+ target_dir: data
+ fs_make_cmd:
+ - ${root_path}/build/lite/make_rootfs/rootfsimg_linux.sh ${fs_dir} ext4
+
+ ```
+
+7. 配置产品Patch(可选,视产品涉及组件是否需要打补丁而定)
+
+ 在产品目录下创建patch.yml文件。patch.yml需按产品实际情况配置,一个典型的patch.yml文件如下:
+
+ ```
+ # 需要打patch的路径
+ foundation/communication/dsoftbus:
+ # 该路径下需要打的patch存放路径
+ - foundation/communication/dsoftbus/1.patch
+ - foundation/communication/dsoftbus/2.patch
+ third_party/wpa_supplicant:
+ - third_party/wpa_supplicant/1.patch
+ - third_party/wpa_supplicant/2.patch
+ - third_party/wpa_supplicant/3.patch
+ ...
+ ```
+
+ 配置完成后,编译时增加--patch参数,即可在产品编译前将配置的Patch文件打到对应目录中,再进行编译:
+
+ ```
+ hb build -f --patch
+ ```
+
+8. 编写编译脚本
+
+ 在产品目录下创建BUILD.gn文件,按产品实际情况编写脚本。以步骤1中的wifiiot为例,BUILD.gn示例如下:
+
+ ```
+ group("wifiiot") { # target名称与产品名一致
+ deps = []
+ # 拷贝init配置
+ deps += [ "init_configs" ]
+ # 将hals加入编译
+ deps += [ "hals" ]
+ # 其他
+ ......
+ }
+ ```
+
+9. 编译产品。
+
+ 在代码根目录执行hb set按提示选择新增的产品,然后执行hb build即可启动编译。
+
+
+## 常见问题
+
+### ninja版本问题导致编译失败
+
+- **现象描述:**
+
+ 编译失败,提示“usr/sbin/ninja: invalid option -- w”。
+
+- **可能原因:**
+
+ 编译环境中ninja版本太低,不支持--w选项。
+
+- **解决办法:**
+
+ 卸载环境中ninja和gn,按照HarmonyOS官网[获取工具](../get-code/IDE.md)。
+
+
+### ncurses库缺失导致编译失败
+
+- **现象描述:**
+
+ 编译失败,提示“/usr/bin/ld: cannot find -lncurses”。
+
+- **可能原因:**
+
+ 编译环境ncurses库缺失。
+
+- **解决办法:**
+
+ ```
+ sudo apt-get install lib32ncurses5-dev
+ ```
+
+
+### 未安装mcopy导致编译失败
+
+- **现象描述:**
+
+ 编译失败,提示“line 77: mcopy: command not found”。
+
+- **可能原因:**
+
+ 编译环境未安装mcopy。
+
+- **解决办法:**
+
+ ```
+ sudo apt-get install dosfstools mtools
+ ```
+
+
+### 权限问题导致编译失败
+
+- **现象描述:**
+
+ 编译失败,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”。
+
+- **可能原因:**
+
+ 当前用户对riscv编译器路径下的文件访问权限不够。
+
+- **解决办法:**
+
+ 查询gcc\_riscv32所在目录。
+
+ ```
+ which riscv32-unknown-elf-gcc
+ ```
+
+ 使用chmod命令修改目录权限为755。
+
+
+### 未安装Crypto导致编译失败
+
+- **现象描述:**
+
+ 编译失败,提示“No module named 'Crypto'”。
+
+- **可能原因:**
+
+ python3未安装Crypto。
+
+- **解决办法:**
+ 1. 查询Python版本号。
+
+ ```
+ python3 --version
+ ```
+
+ 2. 需使用python3.7以上版本,然后安装pycryptodome。
+
+ ```
+ sudo pip3 install pycryptodome
+ ```
+
+
+
+### 编译环境为shell导致编译失败
+
+- **现象描述:**
+
+ 编译失败:“xx.sh \[: xx unexpected operator”。
+
+- **可能原因:**
+
+ 编译环境shell不是bash。
+
+- **解决办法:**
+
+ ```
+ sudo rm -rf /bin/sh
+ sudo ln -s /bin/bash /bin/sh
+ ```
+
+
diff --git "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\270\270\350\247\201\351\227\256\351\242\230.md"
deleted file mode 100755
index ca00b2428542c6024ff6fa79649c5814646cfd28..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\345\270\270\350\247\201\351\227\256\351\242\230.md"
+++ /dev/null
@@ -1,121 +0,0 @@
-# 编译构建常见问题
-
-- [由于ninja版本问题导致编译失败](#section1019152312222)
-- [由于ncurses库缺失导致编译失败](#section21449422618)
-- [由于未安装mcopy导致编译失败](#section12477184992615)
-- [由于权限问题导致编译失败](#section178451337202716)
-- [由于未安装Crypto导致编译失败](#section1241481172819)
-- [由于编译环境为shell导致编译失败](#section3691222152919)
-
-## 由于ninja版本问题导致编译失败
-
-- **现象描述:**
-
- 编译失败,提示“usr/sbin/ninja: invalid option -- w”。
-
-- **可能原因:**
-
- 编译环境中ninja版本太低,不支持--w选项。
-
-- **解决办法:**
-
- 卸载环境中ninja和gn,按照HarmonyOS官网[获取工具](../get-code/获取工具.md)。
-
-
-## 由于ncurses库缺失导致编译失败
-
-- **现象描述:**
-
- 编译失败,提示“/usr/bin/ld: cannot find -lncurses”。
-
-- **可能原因:**
-
- 编译环境ncurses库缺失。
-
-- **解决办法:**
-
- ```
- sudo apt-get install lib32ncurses5-dev
- ```
-
-
-## 由于未安装mcopy导致编译失败
-
-- **现象描述:**
-
- 编译失败,提示“line 77: mcopy: command not found”。
-
-- **可能原因:**
-
- 编译环境未安装mcopy。
-
-- **解决办法:**
-
- ```
- sudo apt-get install dosfstools mtools
- ```
-
-
-## 由于权限问题导致编译失败
-
-- **现象描述:**
-
- 编译失败,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”。
-
-- **可能原因:**
-
- 当前用户对riscv编译器路径下的文件访问权限不够。
-
-- **解决办法:**
- 1. 查询gcc\_riscv32所在目录。
-
- ```
- which riscv32-unknown-elf-gcc
- ```
-
- 2. 使用chmod命令修改目录权限为755。
-
-
-## 由于未安装Crypto导致编译失败
-
-- **现象描述:**
-
- 编译失败,提示“No module named 'Crypto'”。
-
-- **可能原因:**
-
- python3未安装Crypto。
-
-- **解决办法:**
- 1. 查询Python版本号。
-
- ```
- python3 --version
- ```
-
- 2. 需使用python3.7以上版本,然后安装pycryptodome。
-
- ```
- sudo pip3 install pycryptodome
- ```
-
-
-
-## 由于编译环境为shell导致编译失败
-
-- **现象描述:**
-
- 编译失败:“xx.sh \[: xx unexpected operator”。
-
-- **可能原因:**
-
- 编译环境shell不是bash。
-
-- **解决办法:**
-
- ```
- sudo rm -rf /bin/sh
- sudo ln -s /bin/bash /bin/sh
- ```
-
-
diff --git "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\346\246\202\350\277\260-0.md" "b/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\346\246\202\350\277\260-0.md"
deleted file mode 100755
index 1bd7dd28d93785765d46a6c7585280e1fe6d390a..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/\347\274\226\350\257\221\346\236\204\345\273\272\346\246\202\350\277\260-0.md"
+++ /dev/null
@@ -1,58 +0,0 @@
-# 编译构建概述
-
-- [基本概念](#section175012297491)
-- [运作机制](#section193961322175011)
-- [约束与限制](#section2029921310472)
-
-编译构建子系统提供了一个基于gn和ninja的编译构建框架。主要提供以下功能:
-
-- 构建不同芯片平台的产品。如:Hi3516DV300平台。
-
-- 根据产品配置可以按照组件组装打包产品需要的能力。
-
-## 基本概念
-
-在了解编译构建子系统的能力前,应了解如下基本概念:
-
-- 平台
-
- 开发板和内核的组合,不同平台支持的子系统和组件不同。
-
-- 子系统
-
- OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 \> 子系统 \> 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或组件。子系统是一个逻辑概念,它具体由对应的组件构成。
-
-- 组件
-
- 对子系统的进一步拆分,可复用的软件单元,它包含源码、配置文件、资源文件和编译脚本;能独立构建,以二进制方式集成,具备独立验证能力的二进制单元。
-
-- gn
-
- Generate ninja的缩写,用于产生ninja文件。
-
-- ninja
-
- ninja是一个专注于速度的小型构建系统。
-
-
-## 运作机制
-
-OpenHarmony侧的编译构建流程主要包括编译命令行解析,调用gn,执行ninja:
-
-- 命令行解析:解析待编译的产品名称,加载相关配置。
-- 调用gn: 根据命令行解析的产品名称和编译类型,配置编译工具链和全局的编译选项。
-- 执行ninja:启动编译并生成对应的产品版本。
-
-## 约束与限制
-
-- 需按照[源码获取](../get-code/源码获取.md)指导下载全量源码(采用方式三获取)。
-- 编译环境需要Ubuntu18.04及以上版本。
-- 安装编译所需的程序包。
-
- 安装命令:
-
- ```
- sudo apt-get install binutils git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4
- ```
-
-
diff --git "a/zh-cn/device-dev/subsystems/\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" "b/zh-cn/device-dev/subsystems/\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md"
deleted file mode 100755
index e85c33895c2a4348209433745b10487457589a5d..0000000000000000000000000000000000000000
--- "a/zh-cn/device-dev/subsystems/\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md"
+++ /dev/null
@@ -1,9 +0,0 @@
-# 轻量和小型系统编译构建指导
-
-- **[编译构建概述](编译构建概述.md)**
-
-- **[编译构建使用指导](编译构建使用指导.md)**
-
-- **[编译构建常见问题](编译构建常见问题.md)**
-
-
diff --git "a/zh-cn/device-dev/quick-start/\345\257\274\350\257\273.md" "b/zh-cn/device-dev/\345\257\274\350\257\273.md"
old mode 100755
new mode 100644
similarity index 83%
rename from "zh-cn/device-dev/quick-start/\345\257\274\350\257\273.md"
rename to "zh-cn/device-dev/\345\257\274\350\257\273.md"
index 95d9b60b723551ddcf8f06602353ecd82d62159a..5927fe29580d014356e247e03a15a17f6a24eafb
--- "a/zh-cn/device-dev/quick-start/\345\257\274\350\257\273.md"
+++ "b/zh-cn/device-dev/\345\257\274\350\257\273.md"
@@ -30,6 +30,9 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按
## 文档导读
+- [轻量和小型系统开发指导](#table3762949121211)
+- [标准系统开发指导](#table17667535516)
+
**表 1** 轻量和小型系统开发指导(参考内存<128MB)
@@ -45,49 +48,49 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按
整体认知OpenHarmony
|
-
+ |
|
获取开发资源
|
准备开发前相关资源
|
-
+ |
|
快速入门
|
快速熟悉OpenHarmony环境搭建、编译、烧录、调测、运行。
|
-轻量和小型系统快速入门
+ | 轻量和小型系统入门
|
基础能力使用
|
使用OpenHarmony提供的基础能力
|
-
+ |
|
进阶开发
|
结合系统能力开发智能设备
|
-
+ |
|
移植适配
|
|
-
+ |
|
贡献组件
|
为OpenHarmony贡献功能组件
|
-
+ |
|
参考
@@ -115,49 +118,49 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按
|
整体认知OpenHarmony
|
-
+ |
|
获取开发资源
|
准备开发前相关资源
|
-
+ |
|
快速入门
|
快速熟悉OpenHarmony环境搭建、编译、烧录、调测、运行。
|
-标准系统快速入门
+ | 标准系统入门
|
基础能力使用
|
使用OpenHarmony提供的基础能力
|
-
+ |
|
进阶开发
|
结合系统能力开发智能设备
|
-
+ |
|
移植适配
|
对三方库进行移植适配
|
-三方库移植指导
+ | 三方库移植指导
|
贡献组件
|
为OpenHarmony贡献功能组件
|
-
+ |
|
参考
diff --git a/zh-cn/readme.md b/zh-cn/readme.md
index 78b1dc6acf653695b9ff9f1ec9f38f6a38d19ca2..b2c4e67dca56025dee5fa6caa3a0874b0109b258 100644
--- a/zh-cn/readme.md
+++ b/zh-cn/readme.md
@@ -7,7 +7,7 @@
- [Openharmony概述](OpenHarmony-Overview_zh.md)
- 轻量和小型系统开发指导(参考内存<128MB)
- 设备开发
- - overview:[设备开发导读](device-dev/quick-start/导读.md)
+ - overview:[设备开发导读](device-dev/导读.md)
- quick-start:[快速入门](device-dev/quick-start/Readme-CN.md)(搭建环境、获取源码、编译、烧录等)
- 开发基础能力
- Kernel:[轻量和小型系统内核](device-dev/kernel/轻量和小型系统内核.md)
@@ -31,7 +31,7 @@
- 标准系统开发指导(参考内存≥128MB)
- 设备开发
- - overview:[设备开发导读](device-dev/quick-start/导读.md)
+ - overview:[设备开发导读](device-dev/导读.md)
- quick-start:[快速入门](device-dev/quick-start/Readme-CN.md)(搭建环境、获取源码、编译、烧录等)
- 开发基础能力
- Kernel:[标准系统内核](device-dev/kernel/标准系统内核.md)
@@ -40,7 +40,7 @@
- Security:[隐私与安全](device-dev/security/Readme-CN.md)
- guide:[开发示例](device-dev/guide/Readme-CN.md)
- - [时钟应用](device-dev/guide/时钟应用开发示例.md)
+ - [时钟应用](device-dev/guide/时钟应用开发指导.md)
- [平台驱动](device-dev/guide/平台驱动开发示例.md)
- [外设驱动](device-dev/guide/外设驱动开发示例.md)
|
|