oh-pdd-code-generator
npx skills add https://github.com/openharmonyinsight/openharmony-skills --skill oh-pdd-code-generator
Agent 安装分布
Skill 文档
代ç çæå¨
åºäºè®¾è®¡ææ¡£èªå¨çæ OpenHarmony ç³»ç»ä»£ç æ¡æ¶ï¼å æ¬ç®å½ç»æãIDL æ¥å£ã头æä»¶ãæºæä»¶ãæå»ºé ç½®çã
å¿«éå¼å§
æä¾è®¾è®¡ææ¡£è·¯å¾ï¼
åºäº {åè½è®¾è®¡ææ¡£} çæä»£ç æ¡æ¶
æå®æ¨¡ååç§°ï¼
为 {模åå} çæå®æ´ä»£ç ï¼åºäº {åè½è®¾è®¡ææ¡£}
OpenHarmony 代ç åæ
å¨çæä»£ç åï¼éè¦åæ OpenHarmony åé代ç ï¼ç¡®ä¿çæç代ç 符åç°æä»£ç 飿 ¼åæ¶æè§èã
åææ¥éª¤
1. åç°ç®å½ç»æ
ä½¿ç¨ Glob å·¥å ·åç°ç°ææ¨¡åçç»ç»ç»æï¼
# æ¥æ¾ç¸ä¼¼æ¨¡åçç®å½ç»æ
foundation/{subsystem}/*/services/
foundation/{subsystem}/*/interfaces/
foundation/{subsystem}/*/tests/
2. æç´¢ä»£ç 模å¼
ä½¿ç¨ Grep å·¥å ·æç´¢ä»£ç 模å¼ï¼
| æç´¢ç®æ | æç´¢å ³é®å | æåä¿¡æ¯ |
|---|---|---|
| ç±»å½å | class.*Service |
æå¡ç±»å½å |
| å½åç©ºé´ | namespace.* |
å½å空é´ç»ç» |
| æ¥å¿æ ç¾ | HiLogLabel |
æ¥å¿ä½¿ç¨æ¹å¼ |
| é误ç | ERROR_.*=.*[0-9] |
é误ç åé |
| å®å®ä¹ | #define.*_ENABLE |
æ¡ä»¶ç¼è¯å¼å ³ |
| åå§å彿° | bool Init\(\) |
åå§åæ¨¡å¼ |
| æ¸ ç彿° | void.*Release\(\) |
èµæºæ¸ çæ¨¡å¼ |
3. 读ååèå®ç°
ä½¿ç¨ Read å·¥å ·è¯»åç¸ä¼¼æ¨¡åçå®ç°ï¼
- æå¡å®ç°:
*_service.cpp - Provider å®ç°:
*_provider.cpp - IDL å®ä¹:
I*.idl - æå»ºé
ç½®:
BUILD.gn
4. æºè½æ¢ç´¢
ä½¿ç¨ Task å·¥å ·å¯å¨ Explore 代çï¼
- æ¥æ¾åèå®ç°çæä½³å®è·µ
- æåéç¨ä»£ç 模æ¿
- åç°ä¾èµçå ¬å ±åºåå·¥å ·ç±»
åèç®å½æ¨¡å¼
OpenHarmony æ åç®å½ç»æï¼
foundation/{subsystem}/{part}/
âââ bundle.json # é¨ä»¶é
ç½®
âââ BUILD.gn # 主æå»ºæä»¶
âââ {part}.gni # 模åé
ç½®
âââ services/
â âââ native/
â âââ {sa_id}.json # SA é
ç½®
â âââ include/ # 对å¤å¤´æä»¶
â âââ src/ # å®ç°æä»¶
âââ interfaces/
â âââ idl/ # IDL æ¥å£
â âââ innerkits/ # å
é¨ Kit
â âââ kits/ # å¯¹å¤ Kit
âââ tests/ # æµè¯ä»£ç
代ç 飿 ¼åè
| 代ç å ç´ | 飿 ¼è§å | ç¤ºä¾ |
|---|---|---|
| ç±»å | 大驼峰 + åç¼ | DiskInfoService |
| æ¹æ³å | 大驼峰 | GetDiskList() |
| æååé | å°é©¼å³° + ä¸å线åç¼ | mutex_, inited_ |
| å½åç©ºé´ | å°åååå·åé | OHOS::DiskManagement |
| æä»¶å | å°åä¸å线 | disk_info_service.cpp |
| å®å®ä¹ | 大åä¸å线 | DISK_MANAGEMENT_FORMAT_ENABLE |
常ç¨ä¾èµåº
| ä¾èµ | external_deps æ ¼å¼ | ç¨é |
|---|---|---|
| HiLog | hilog:libhilog |
æ¥å¿è¾åº |
| c_utils | c_utils:utils |
C å·¥å ·å½æ° |
| ipc_core | ipc_core:ipc_core |
IPC éä¿¡ |
| AccessToken | access_token:libaccesstoken |
æé管ç |
| HiSysEvent | hisysevent:libhisysevent |
äºä»¶ä¸æ¥ |
| HiTrace | hitrace_native:hitrace_meter |
é¾è·¯è¿½è¸ª |
çæå 容
1. ç®å½ç»æ
èªå¨å建符å OpenHarmony è§èçç®å½ç»æï¼
disk_management/
âââ bundle.json # é¨ä»¶é
ç½®
âââ BUILD.gn # 主æå»ºé
ç½®
âââ disk_management.gni # 模åé
ç½®
âââ services/
â âââ native/
â â âââ 5001.json # SA é
ç½®æä»¶
â â âââ disk_management.cfg # Init é
ç½®æä»¶
â â âââ include/ # 头æä»¶ç®å½
â â âââ src/ # æºæä»¶ç®å½
â âââ disk_info_service/ # åæå¡ç®å½
â âââ include/
â âââ src/
âââ interfaces/
â âââ idl/OHOS/DiskManagement/ # IDL æ¥å£å®ä¹
â âââ innerkits/native/ # Native Kit
â âââ kits/js/ # JS Kit
âââ tests/ # æµè¯ç®å½
2. IDL æ¥å£æä»¶
çæ IDL æ¥å£å®ä¹æä»¶ï¼æ ¼å¼ï¼
/* Copyright (c) 2026 Huawei Device Co., Ltd. */
package OHOS.DiskManagement;
import "DiskInfoTypes.idl";
interface IDiskInfoService {
/// è·åç³»ç»ææç£çå表
GetDiskList(): DiskInfo[];
/// è·åæå®ç£çç详ç»ä¿¡æ¯
GetDiskInfo([in] string diskId): DiskInfo;
/// 注åç£çååçå¬å¨
RegisterChangeListener([in] IDiskChangeListener listener): void;
};
3. 头æä»¶æ¨¡æ¿
çæç¬¦å OpenHarmony ç¼ç è§èç头æä»¶ï¼
/* Copyright (c) 2026 Huawei Device Co., Ltd. */
#ifndef DISK_INFO_SERVICE_H
#define DISK_INFO_SERVICE_H
#include <string>
#include <vector>
#include <mutex>
namespace OHOS {
namespace DiskManagement {
class DiskInfoService {
public:
DiskInfoService();
~DiskInfoService();
bool Init();
void Release();
std::vector<DiskInfo> GetDiskList();
DiskInfo GetDiskInfo(const std::string& diskId);
private:
std::mutex mutex_;
bool inited_;
};
} // namespace DiskManagement
} // namespace OHOS
#endif // DISK_INFO_SERVICE_H
4. æºæä»¶æ¨¡æ¿
çæåºç¡å®ç°æ¡æ¶ï¼
/* Copyright (c) 2026 Huawei Device Co., Ltd. */
#include "disk_info_service.h"
#include "hilog/log.h"
namespace OHOS {
namespace DiskManagement {
static constexpr HiLogLabel LABEL = { LOG_CORE, 0xD00430D, "DiskInfoService" };
DiskInfoService::DiskInfoService() : inited_(false)
{
HiLog::Info(LABEL, "DiskInfoService constructed");
}
DiskInfoService::~DiskInfoService()
{
Release();
}
bool DiskInfoService::Init()
{
std::lock_guard<std::mutex> lock(mutex_);
if (inited_) {
HiLog::Warn(LABEL, "Already initialized");
return true;
}
// TODO: åå§åé»è¾
inited_ = true;
return true;
}
void DiskInfoService::Release()
{
std::lock_guard<std::mutex> lock(mutex_);
if (!inited_) {
return;
}
// TODO: æ¸
çèµæº
inited_ = false;
}
} // namespace DiskManagement
} // namespace OHOS
5. BUILD.gn é ç½®
çææå»ºé ç½®æä»¶ï¼
import("//build/ohos.gni")
import("//build/test.gni")
import("//foundation/filemanagement/disk_management/disk_management.gni")
ohos_shared_library("disk_management_sa") {
subsystem_name = "filemanagement"
part_name = "disk_management"
sources = [
"src/disk_management_service.cpp",
"src/main.cpp",
]
include_dirs = [
"include",
"${disk_management_path}/include",
"//utils/native/base/include",
]
deps = [
":disk_management_idl",
"//foundation/hiviewdfx/hilog/native/framework:libhilog",
]
external_deps = [
"c_utils:c_utils",
]
branch_protector_ret = "pac_ret"
sanitize = {
integer_overflow = true
cfi = true
debug = false
}
}
ohos_unittest("disk_management_unittest") {
subsystem_name = "filemanagement"
part_name = "disk_management"
test_type = "unittest"
test_time_out = 300
sources = [
"test/disk_management_test.cpp",
]
deps = [
":disk_management_sa",
]
external_deps = [
"googletest:gmock_main",
"googletest:gtest_main",
]
cflags_cc = [ "--coverage" ]
ldflags = [ "--coverage" ]
}
6. SA é ç½®æä»¶ (5001.json)
{
"sa-id": 5001,
"sa-name": "disk_management",
"run-on-create": true,
"auto-start": true,
"start-mode": "boot",
"process": "disk_management_service",
"dump-level": "control",
"critical": [1, 4, 240],
"libpath": "libdisk_management_sa.z.so"
}
7. bundle.json
{
"name": "disk_management",
"description": "HM Desktop Disk Management Service",
"version": "1.0.0",
"component": {
"name": "disk_management",
"subsystem": "filemanagement",
"syscap": [
"SystemCapability.DiskManagement.DiskInfo",
"SystemCapability.DiskManagement.Format"
]
}
}
åèææ¡£
- IDL ç¼åæå: references/idl_guide.md
- BUILD.gn è§è: references/build_gn_guide.md
- SA é ç½®è§è: references/sa_profile_guide.md
- ç¼ç è§è: references/coding_style.md
å½åè§èæ å°
| è®¾è®¡ææ¡£æ¯è¯ | ä»£ç æ¯è¯ | è§å |
|---|---|---|
| æå¡åç§° | ç±»å | 大驼峰 + Service åç¼ |
| 模ååç§° | å½åç©ºé´ | å°åä¸å线åé |
| æ¥å£åç§° | IDL æ¥å£ | I + 大驼峰 |
| æ°æ®ç»æ | struct | 大驼峰 |
| æ¹æ³å | 彿°å | 大驼峰 |
| æååé | æååé | å°é©¼å³° + ä¸å线åç¼ |
模åç±»åä¸çæçç¥
ä¿¡æ¯æå¡ (InfoService)
çæå 容ï¼
- GetList() æ¹æ³
- Get() æ¹æ³
- RegisterListener() æ¹æ³
示ä¾ï¼DiskInfoService
管çæå¡ (ManagerService)
çæå 容ï¼
- Execute() æ¹æ³
- Cancel() æ¹æ³
- RegisterProgressListener() æ¹æ³
示ä¾ï¼FormatManagerService, RepairManagerService
çå¬å¨ (Listener)
çæå 容ï¼
- OnChanged() åè°æ¹æ³
- OnCompleted() åè°æ¹æ³
示ä¾ï¼DiskChangeListener, FormatProgressListener
使ç¨ç¤ºä¾
çæå®æ´ä»£ç æ¡æ¶ï¼
åºäº {åè½è®¾è®¡ææ¡£} 为 {模åå} 模åçæå®æ´ä»£ç
ä» çæ IDL æ¥å£ï¼
åªçæ IDL æ¥å£æä»¶ï¼åºäº {åè½è®¾è®¡ææ¡£}
æå® SA IDï¼
çæä»£ç ï¼SA ID ä½¿ç¨ {SA_ID}ï¼åºäº {åè½è®¾è®¡ææ¡£}
é¢è§æ¨¡å¼ï¼
é¢è§å°è¦çæçæä»¶ï¼ä¸å®é
å建ï¼åºäº {åè½è®¾è®¡ææ¡£}
æå®è¾åºç®å½ï¼
çæä»£ç å° ./code_output ç®å½ï¼åºäº {åè½è®¾è®¡ææ¡£}
æ¡ä»¶ç¼è¯æ¯æ
çæçä»£ç æ¯æåè½æ¡ä»¶ç¼è¯ï¼
# å¨ .gni æä»¶ä¸å®ä¹
declare_args() {
disk_management_enable_format = true
disk_management_enable_repair = true
}
# å¨ BUILD.gn ä¸ä½¿ç¨
if (disk_management_enable_format) {
sources += [ "src/format_service.cpp" ]
defines += [ "DISK_MANAGEMENT_FORMAT_ENABLE" ]
}
æµè¯ä»£ç çæ
åæ¶çæåå æµè¯æ¡æ¶ï¼
/* Copyright (c) 2026 Huawei Device Co., Ltd. */
#include <gtest/gtest.h>
#include "disk_info_service.h"
namespace OHOS {
namespace DiskManagement {
class DiskInfoServiceTest : public testing::Test {
protected:
void SetUp() override {
service_ = std::make_unique<DiskInfoService>();
ASSERT_TRUE(service_->Init());
}
void TearDown() override {
service_->Release();
}
std::unique_ptr<DiskInfoService> service_;
};
TEST_F(DiskInfoServiceTest, GetDiskList) {
auto disks = service_->GetDiskList();
EXPECT_GE(disks.size(), 0u);
}
} // namespace DiskManagement
} // namespace OHOS
é误å¤ç
| é误类å | å¤çæ¹å¼ |
|---|---|
| è®¾è®¡ææ¡£æ ¼å¼é误 | æç¤ºå ·ä½ç¼ºå¤±ç« è |
| IDL è¯æ³é误 | æ è®°é误è¡å·ï¼æä¾æ£ç¡®æ ¼å¼ |
| ç®å½å建失败 | æ£æ¥æéï¼æç¤ºç¨æ·æå¨å建 |
| æä»¶å·²åå¨ | ä½¿ç¨ –force è¦çæè·³è¿ |
çæçæä»¶æ¸ å
çæå®æåï¼è¾åºæä»¶å表ï¼
[INFO] ä»£ç æ¡æ¶çæå®æ!
[INFO]
[INFO] çæçæä»¶ï¼
[INFO] ç®å½: disk_management/
[INFO] é
ç½®: bundle.json, BUILD.gn, disk_management.gni
[INFO] SAé
ç½®: services/native/5001.json, disk_management.cfg
[INFO] IDL: interfaces/idl/OHOS/DiskManagement/*.idl
[INFO] 头æä»¶: services/native/include/*.h
[INFO] æºæä»¶: services/native/src/*.cpp
[INFO] æµè¯: test/unittest/*_test.cpp
[INFO]
[INFO] æ»è®¡: 15 个æä»¶, 5 个ç®å½