第一篇我们从产品角度看了“双镜记忆相机”。这一篇进入工程角度:怎样把项目导入 DevEco Studio,怎样确认 SDK 和产品配置,哪些内容必须本地配置,哪些内容绝对不能上传到公开仓库。

这篇不是“安装教程”,而是一次真实项目开箱检查。项目能不能跑起来,往往取决于三件事:

项目运行后的拍照页

  1. 工程结构是否完整。
  2. SDK 和产品配置是否匹配。
  3. 签名、AGC、API Key 等敏感信息是否处理干净。

工程目录先看哪里

项目根目录的关键文件是这些:

superimage
├─ AppScope/
├─ entry/
├─ hvigor/
├─ build-profile.json5
├─ code-linter.json5
├─ hvigorfile.ts
├─ oh-package.json5
└─ README.md

真正的业务代码在 entry/src/main/ets

工程截图:工程结构总览

entry/src/main/ets
├─ entryability/
├─ entrybackupability/
├─ insightintents/
├─ pages/
└─ services/

第一天不要急着打开 Index.ets 的全部内容。它很大,直接读会很累。先从配置文件判断项目边界,再回头看主页面和服务层。

代码来自哪里:产品配置

开源仓库中的 build-profile.json5 已经做了安全脱敏。你会看到签名位置是空的:

{
  "app": {
    "signingConfigs": [
      {
        "name": "default",
        "type": "HarmonyOS",
        "material": {
          "storeFile": "",
          "storePassword": "",
          "keyAlias": "",
          "keyPassword": "",
          "signAlg": "SHA256withECDSA",
          "profile": "",
          "certpath": ""
        }
      }
    ]
  }
}

这不是缺文件,而是公开项目应该这样处理。证书、口令、本地 .p12 路径、发布 .p7b、AGC 配置,都不应该进入公开仓库。

产品版本配置在同一个文件里:

{
  "name": "default",
  "signingConfig": "default",
  "targetSdkVersion": "6.1.0(23)",
  "compatibleSdkVersion": "6.1.0(23)",
  "runtimeOS": "HarmonyOS",
  "buildOption": {
    "strictMode": {
      "caseSensitiveCheck": true,
      "useNormalizedOHMUrl": true
    }
  }
}

这里有两个训练营里会反复用到的点:

  • targetSdkVersion6.1.0(23),所以课程会围绕 HarmonyOS 6.1 能力展开。
  • strictMode 开着,路径大小写和 OHM URL 会更严格,这对多人学习很重要。

代码来自哪里:应用入口和设备类型

entry/src/main/module.json5 决定应用入口、设备类型、权限、扩展能力。

{
  "module": {
    "name": "entry",
    "type": "entry",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet",
      "2in1"
    ],
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "supportWindowMode": [
          "fullscreen",
          "split",
          "floating"
        ]
      }
    ]
  }
}

效果上,这意味着项目不是只为手机竖屏写死。后面讲多设备布局时,我们会看到 Index.ets 根据窗口宽度切换底部导航和侧边导航。

页面路由在 entry/src/main/resources/base/profile/main_pages.json

{
  "src": [
    "pages/Index"
  ]
}

也就是说,启动后主页面就是 pages/Index。如果你在 DevEco 里想快速定位业务入口,不要在目录里乱翻,先看 main_pages.json

权限不是越多越好,而是要和场景对应

这个项目需要相机、定位、生物认证、网络、手势、防窥等权限。它们都集中在 module.json5 里。

"requestPermissions": [
  {
    "name": "ohos.permission.CAMERA",
    "reason": "$string:camera_permission_reason",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when": "inuse"
    }
  },
  {
    "name": "ohos.permission.ACCESS_BIOMETRIC",
    "reason": "$string:biometric_permission_reason",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when": "inuse"
    }
  },
  {
    "name": "ohos.permission.LOCATION",
    "reason": "$string:location_permission_reason",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when": "inuse"
    }
  },
  {
    "name": "ohos.permission.DETECT_GESTURE",
    "reason": "$string:gesture_permission_reason",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when": "inuse"
    }
  }
]

这些权限分别对应:

权限 项目场景
CAMERA 单拍、双镜拍摄、相机预览
LOCATION / APPROXIMATELY_LOCATION 地图记忆点、附近景点、故地重游
ACCESS_BIOMETRIC 保险箱人脸/指纹解锁
DETECT_GESTURE 隔空投递、手势相关能力
DLP_GET_HIDE_STATUS 相册/保险箱隐私防窥
INTERNET 在线 AI 图解、视频任务、同步能力

效果上,第一次启动或第一次使用对应能力时,系统会弹出授权。好的项目不是“权限被拒就崩”,而是要给出可行动提示。后面讲每个能力时,我们都会拆它的失败态。

小艺智能体配置也在工程里

训练营第 4 天会细讲小艺智能体,这里先看项目配置。entry/src/main/resources/base/profile/insight_intent.json 注册了两个意图。

{
  "insightIntents": [
    {
      "intentName": "GetLocation",
      "domain": "NearbyRecommendation",
      "intentVersion": "1.0.0",
      "srcEntry": "./ets/insightintents/NearbyAgentLocationIntent.ets",
      "uiAbility": {
        "ability": "EntryAbility",
        "executeMode": [
          "background"
        ]
      }
    },
    {
      "intentName": "GetNearbyAgentLocation",
      "domain": "NearbyRecommendation",
      "intentVersion": "1.0.0",
      "srcEntry": "./ets/insightintents/NearbyAgentLocationIntent.ets",
      "uiAbility": {
        "ability": "EntryAbility",
        "executeMode": [
          "background"
        ]
      }
    }
  ]
}

效果上,智能体不是单独做一个聊天页,而是服务首页“附近景点”和“当前位置”这类动作。项目启动时会准备智能体入口,设备支持时显示,不支持时降级成普通地图/定位体验。

在线能力的 Key 怎么办

开源仓库不带默认 API Key。VolcengineArkService.ets 中默认 Key 已清空:

export class VolcengineArkService {
  private static readonly STORE_NAME: string = 'super_image_volcengine';
  private static readonly STORE_KEY: string = 'ark_config';
  private static readonly BASE_URL: string = 'https://ark.cn-beijing.volces.com/api/v3';
  private static readonly DEFAULT_API_KEY: string = '';
  private static readonly DEFAULT_RESPONSE_MODEL: string = 'doubao-seed-2-0-lite-260215';
  private static readonly DEFAULT_VIDEO_MODEL: string = 'doubao-seedance-1-0-pro-fast-251015';
}

应用里仍然保留了用户输入、保存、清除 Key 的路径。这样既能教学,也不把私密凭据带进仓库。

跑起来看到什么效果

完成导入、配置本地签名后,启动应用应该看到:

  1. 默认进入地图首页。
  2. 底部有“地图、拍照、相册、保险箱”四个入口。
  3. 未授权定位时,地图仍有默认位置和状态提示。
  4. 进入拍照页时,应用会检测相机权限和设备能力。
  5. 进入相册页时,空相册会提示去拍摄或导入。
  6. 进入保险箱时,未解锁状态会显示认证入口。

如果配置了在线 AI Key,相册详情页还能继续触发智能描述、美文、视频生成等能力。没有配置 Key 时,本地拍照、相册、地图和保险箱仍然可以继续讲解和验证。

开源前必须检查什么

公开仓库建议使用干净发布目录,只保留源码和必要资源,排除这些内容:

  • HAP / APP / HSP 等打包产物
  • contest_materials/ 比赛提交材料
  • 测试截图、布局 JSON、临时设备输出
  • scripts/ 调试和发布脚本
  • doc/key.txtdebug.log
  • agconnect-services.jsonschema.json
  • 本地证书路径、签名口令、默认 API Key

对应的 .gitignore 片段如下:

/oh_modules
/local.properties
/.idea
/.hvigor
**/build

*.hap
*.app
*.hsp
*.p12
*.cer
*.p7b
*.zip
*.mp4

/contest_materials/
/video/
/scripts/

doc/key.txt
doc/debug.log
entry/src/main/resources/rawfile/agconnect-services.json
entry/src/main/resources/rawfile/schema.json

这一步看起来和功能无关,但它是一个训练营必须讲的工程习惯:公开项目可以展示能力,不能泄露凭据;可以保留入口,不能带真实口令。

工程质量点

  • SDK 版本、产品配置、设备类型要先确认,再看业务代码。
  • 签名和 AGC 文件只放本地,不放公开仓库。
  • 在线模型 Key 不硬编码,应用内输入并保存到本地配置。
  • 权限要有理由、使用场景和失败提示。
  • 项目能在没有在线 Key 的情况下保留本地闭环,降低学习门槛。

质量分自评

代码真实度:29/30
效果完整度:21/25
场景价值:18/20
工程质量:15/15
表达质量:9/10
总分:92/100

今日作业

  1. 用 DevEco Studio 打开项目,先不要改代码。
  2. 找到 build-profile.json5,确认签名信息为空,并配置你自己的本地调试签名。
  3. 找到 module.json5,把每个权限和一个真实页面效果对应起来。
  4. 启动应用后,分别进入地图、拍照、相册、保险箱四个入口,记录每个入口的第一句状态文案。
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐