3

Ubuntu22搭建支持OpenHarmony的Flutter应用开发环境详细教程-开源基础软件社区-51CTO....

 11 months ago
source link: https://ost.51cto.com/posts/27008
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Ubuntu22搭建支持OpenHarmony的Flutter应用开发环境详细教程 原创 精华

实践过程中的部分视频演示

  • 由于支持OpenHarmony的Flutter发布不久,还存在若干问题和文档遗漏,随着时间的推移都在不断完善,本文是我在搭建开发环境和探索研究过程下来的一个详细笔记,希望对大家有所帮助!
  • 文中涉及到的一些源码存放目录和环境变量配置,请根据你实际存放的位置进行相应的调整。
  • 文章附件提供Flutter打包的OpenHarmony应用hap样本,可供参考研究

Flutter Engine 环境和编译

  • sudo apt install git curl unzip pkgconf python3-pip
  • depot_tools
mkdir ~/work
cd ~/work
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
vim ~/.bashrc
# --- 写入下面这行配置
export PATH="$PATH:/home/ubuntu/work/depot_tools"
# ---
source ~/.bashrc
ssh-keygen
cat ~/.ssh/id_rsa.pub
# Gitee - 设置 - SSH公钥 - 添加

cd ~/work
mkdir engine
cd engine
touch .gclient
vim .gclient
# ---
solutions = [
  {
    "managed": False,
    "name": "src/flutter",
    "url": "[email protected]:openharmony-sig/flutter_engine.git",
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
  },
]
# ---
gclient sync

# 从 http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist 每日构建中,下载ohos-sdk-full,在engine根目录下,新建文件夹 ndk/linux/4.0 ,解压ohos-sdk-full sdk中的native文件夹到 ndk/linux/4.0 文件夹中;
mkdir -p ndk/linux/4.0
cd ndk/linux/4.0
# 把 native-linux-x64-4.0.9.6-Beta2.zip 放到此目录,并解压
unzip native-linux-x64-4.0.9.6-Beta2.zip
cd ~/work/engine
make

出现如下错误

../../third_party/dart/runtime/bin/socket_base_posix.cc -o obj/third_party/dart/runtime/bin/dart_io_api.socket_base_posix.o
../../third_party/dart/runtime/bin/socket_base_posix.cc:154:12: error: comparison of integers of different signs: 'unsigned long' and 'long' [-Werror,-Wsign-compare]
    cmsg = CMSG_NXTHDR(&msg, cmsg);
           ^~~~~~~~~~~~~~~~~~~~~~~
/home/ubuntu/work/engine/ndk/linux/4.0/native/sysroot/usr/include/sys/socket.h:360:44: note: expanded from macro 'CMSG_NXTHDR'
        __CMSG_LEN(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) - (unsigned char *)(cmsg) \
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../third_party/dart/runtime/bin/socket_base_posix.cc:160:15: error: comparison of integers of different signs: 'unsigned long' and 'long' [-Werror,-Wsign-compare]
       cmsg = CMSG_NXTHDR(&msg, cmsg), control_message++) {
              ^~~~~~~~~~~~~~~~~~~~~~~
/home/ubuntu/work/engine/ndk/linux/4.0/native/sysroot/usr/include/sys/socket.h:360:44: note: expanded from macro 'CMSG_NXTHDR'
        __CMSG_LEN(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) - (unsigned char *)(cmsg) \
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../third_party/dart/runtime/bin/socket_base_posix.cc:263:33: error: comparison of integers of different signs: 'unsigned long' and 'long' [-Werror,-Wsign-compare]
         i++, message++, cmsg = CMSG_NXTHDR(&msg, cmsg)) {
                                ^~~~~~~~~~~~~~~~~~~~~~~
/home/ubuntu/work/engine/ndk/linux/4.0/native/sysroot/usr/include/sys/socket.h:360:44: note: expanded from macro 'CMSG_NXTHDR'
        __CMSG_LEN(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) - (unsigned char *)(cmsg) \
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 errors generated.
[122/8624] CXX obj/flutter/third_party/tonic/file_loader/tonic.file_loader_posix.o
ninja: build stopped: subcommand failed.

解决方案,忽略编译警告,重新编译通过

修改 /home/ubuntu/work/engine/src/build/config/compiler/BUILD.gn

# 搜索 default_warning_flags = 修改为下面的代码
# line 602 603
default_warning_flags = ["-Wno-sign-compare"]
default_warning_flags_cc = ["-Wno-sign-compare"]

编译成功输出目录

/home/ubuntu/work/engine/src/out/ohos_debug_unopt_arm64
/home/ubuntu/work/engine/src/out/ohos_release_arm64

Flutter SDK 环境和配置

Clone SDK

git clone https://gitee.com/openharmony-sig/flutter_flutter

~/.bashrc 完整环境

可以参考下,根据你实际的存放位置修改路径

# depot-tools
export PATH="$PATH:/home/ubuntu/work/depot_tools"

# java
export JAVA_HOME=/home/ubuntu/env/jdk-17.0.8
export PATH="$PATH:$JAVA_HOME/bin"

# node.js
export NODE_HOME=/home/ubuntu/env/node-v14.19.1-linux-x64
export PATH="$PATH:$NODE_HOME/bin"

# ohos
export PATH="$PATH:/home/ubuntu/env/oh-command-line-tools/bin"
export OHOS_SDK_HOME=/home/ubuntu/env/ohos-sdk
export OHPM_HOME=/home/ubuntu/env/oh-command-line-tools/ohpm
export SIGN_TOOL_HOME=/home/ubuntu/env/developtools_hapsigner/autosign

# gradle
export GRADLE_HOME=/home/ubuntu/env/gradle-7.1
export PATH="$PATH:$GRADLE_HOME/bin"

# flutter
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH="$PATH:/home/ubuntu/env/flutter_flutter/bin"

# hdc
export HDC_HOME=/home/ubuntu/env/ohos-sdk/10/toolchains
export PATH="$PATH:$HDC_HOME"
  • Command Line Tools for OpenHarmony
    • ohcommandline-tools-linux-2.0.0.2.zip
    • use ohos-full-sdk api10
    • ohpm/in/init 安装 ohpm 如果失败多尝试几次
  • developtools_hapsigner
    • 参照developtools_hapsigner的readme,编译得到 hap-sign-tool.jar ,确保其在目录下:./hapsigntool/hap_sign_tool/build/libs/hap-sign-tool.jar(编译需要 jdk11 + gradle7.1
    • 进入autosign文件夹,执行命令 chmod 777 *.sh,并且新增 profile_tmp_template.json 文件,编辑如下:
    {
      "version-name": "2.0.0",
      "version-code": 2,
      "app-distribution-type": "os_integration",
      "uuid": "5027b99e-5f9e-465d-9508-a9e0134ffe18",
      "validity": {
          "not-before": 1594865258,
          "not-after": 1689473258
      },
      "type": "release",
      "bundle-info": {
          "developer-id": "OpenHarmony",
          "distribution-certificate": "-----BEGIN CERTIFICATE-----\nMIICSTCCAc+gAwIBAgIFAJV7uNUwCgYIKoZIzj0EAwIwYzELMAkGA1UEBhMCQ04x\nFDASBgNVBAoMC09wZW5IYXJtb255MRkwFwYDVQQLDBBPcGVuSGFybW9ueSBUZWFt\nMSMwIQYDVQQDDBpPcGVuSGFybW9ueSBBcHBsaWNhdGlvbiBDQTAeFw0yMjAxMjkw\nNTU0MTRaFw0yMzAxMjkwNTU0MTRaMGgxCzAJBgNVBAYTAkNOMRQwEgYDVQQKDAtP\ncGVuSGFybW9ueTEZMBcGA1UECwwQT3Blbkhhcm1vbnkgVGVhbTEoMCYGA1UEAwwf\nT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gUmVsZWFzZTBZMBMGByqGSM49AgEGCCqG\nSM49AwEHA0IABAW8pFu7tHGUuWtddD5wvazc1qN8ts9UPZH4pecbb/bSFWKh7X7R\n/eTVaRrCTSSdovI1dhoV5GjuFsKW+jT2TwSjazBpMB0GA1UdDgQWBBScyywAaAMj\nI7HcuIS42lvZx0Lj+zAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUE\nDDAKBggrBgEFBQcDAzAYBgwrBgEEAY9bAoJ4AQMECDAGAgEBCgEAMAoGCCqGSM49\nBAMCA2gAMGUCMFfNidGo6uK6KGT9zT1T5bY1NCHTH3P3muy5X1xudOgxWoOqIbnk\ntmQYB78dxWEHLQIxANfApAlXAD/0hnyNC8RDzfLOPEeay6jU9FXJj3AoR90rwZpR\noN9sYD6Oks4VGRw6yQ==\n-----END CERTIFICATE-----\n",
          "bundle-name": "{{ohosId}}",
          "apl": "normal",
          "app-feature": "hos_normal_app"
      },
      "acls": {
          "allowed-acls": [
              ""
          ]
      },
      "permissions": {
          "restricted-permissions": []
      },
      "issuer": "pki_internal"
    }
    
    • 编辑 autosign.configcreateAppCertAndProfile.config,修改值:sign.profile.inFile=profile_tmp.json
    • 配置 <当前项目flutter_flutter目录>/bin 到环境变量PATH,确保 which flutter 能找到 <flutter sdk>/bin/flutter 位置
    • 运行 flutter docker,检查环境变量配置是否都正确
    • 打开vscode,安装flutter插件,如果flutter sdk配置正确,可发现OpenHarmony连接设备,可在vscode上运行和调试应用
  • ohos-sdk & hdc,通过 ohsdkmgr 手动下载SDK,添加api10的full-sdk,并配置到环境变量
  • npm 需要正确配置 .npmrc,否则后续 hvigor 编译ohos项目会出错
touch ~/.npmrc
vim ~/.npmrc
# 写入如下内容
registry=https://registry.npmjs.org
@ohos:registry=https://repo.harmonyos.com/npm/
# 或者这样
registry=https://registry.npm.taobao.org
@ohos:registry=https://repo.harmonyos.com/npm/

项目创建编译等命令

# 环境检测	
flutter doctor

# 环境配置
flutter config --<key> <value>

# 创建新项目
flutter create --platforms ohos,android --org <org> <appName>

# 已连接设备查找
flutter devices

# 应用安装
flutter install

# 资源打包
flutter assemble

# 应用构建
flutter build hap --target-platform ohos-arm --debug true --local-engine=<兼容ohos的engine产物路径>

# 应用运行
flutter run --local-engine=<兼容ohos的engine产物路径>

# 调试模式
flutter attach

实践命令(创建项目并打包hap)

# create
flutter create --platforms ohos,android myapp
cd myapp
# build debug hap
flutter build hap --target-platform ohos-arm64 --debug true --local-engine=/home/ubuntu/work/engine/src/out/ohos_debug_unopt_arm64
# build release hap
flutter build hap --target-platform ohos-arm64 --local-engine=/home/ubuntu/work/engine/src/out/ohos_release_arm64

flutter build hap -h

Build an Ohos Hap file from your app.

Global options:
-h, --help                  Print this usage information.
-v, --verbose               Noisy logging, including all shell commands executed.
                            If used with "--help", shows hidden options. If used with "flutter doctor", shows additional diagnostic information. (Use "-vv" to force verbose logging in those cases.)
-d, --device-id             Target device id or name (prefixes allowed).
    --version               Reports the version of this tool.
    --suppress-analytics    Suppress analytics reporting when this command runs.

Usage: flutter build hap [arguments]
-h, --help               Print this usage information.
    --target-platform    The target platform for which the app is compiled.
                         [ohos-arm64 (default), ohos-arm, ohos-x86]
    --debug              Build a debug version of your app.
    --profile            Build a version of your app specialized for performance profiling.
    --release            Build a release version of your app (default mode).

hdc找不到已连接设备的解决方案

在Linux下在非root权限下使用hdc会出现无法找到设备的情况,此问题原因为用户USB操作权限问题,解决方法如下:

sudo chmod -R 777 /dev/bus/usb/

或者su切换到root用户下运行

这样操作之后 hdc list targets 可查看到已连接的OH设备

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
Flutter打包的OpenHarmony应用hap样本.zip 45.44M 3次下载
已于2023-10-12 18:38:47修改

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK