问题:如果一定要在Linux操作系统下使用DevEco Studio鸿蒙开发工具,有没有实现的方案?
回答: 有,你可以按照以下说明尝试操作: 一、DevEco Studio能在Linux中用playonlinux运行并且能调试hello,亲测在UOS下可行,也可用Wine 6版本尝试安装,如下图所示:
注:如果推出了Linux版,则不能再使用此类方案。参考DevEco Studio没有Linux版本提供,仅支持Windows和Mac系统。 二、请参考以下指南操作,由Deepin网友提供:UOS/深度系统安装鸿蒙OS北向应用开发IDE工具DevEco Studio 2 Beta 3 现在分享下我自己在Linux系统上安装鸿蒙OS北向应用开发IDE工具 DevEco Studio 2 Beta 3的经验: 预先安装好构建WINE的编译环境: sudo apt build-dep wine 下载wine源码,源码下载地址: https://dl.winehq.org/wine/source/ 可使用6.0,wine-6.0.tar.xz。 ////////////////////// 解压后进入到wine6.0的源码根目录创建两个子目录用来存放后面构建出来的程序文件: mkdir -p wine32 wine64 编译安装64位及32位wine cd wine64 ../configure --enable-win64 make -j 4 sudo make install --------------- cd ../wine32 ../configure --with-wine64=../wine64 make -j 4 sudo make install /////////////////// 设置wine的目录和硬件 rm -rf ~/.wine WINEPREFIX=~/.wine wine64 wineboot winecfg 启动wine配置程序设置Windows版本为win10 /////////////////// 安装中文字体 链接: https://pan.baidu.com/s/1SWTe1Dj485FTJSdKqI6QCA 密码: 4abj 下载后解压出所有字体文件,剪切到wine的c盘Windows/fonts目录内 ///////////// 安装wine-mono和wine-gecko http://mirrors.ustc.edu.cn/wine/wine/wine-mono/5.1.1/wine-mono-5.1.1-x86.msi http://mirrors.ustc.edu.cn/wine/wine/wine-gecko/2.47.2/wine-gecko-2.47.2-x86_64.msi http://mirrors.ustc.edu.cn/wine/wine/wine-gecko/2.47.2/wine-gecko-2.47.2-x86.msi wine msiexec /i wine-mono-5.1.1-x86.msi wine msiexec /i wine-gecko-2.47.2-x86_64.msi wine msiexec /i wine-gecko-2.47.2-x86.msi ///////////////////// 到鸿蒙OS官网下载北向IDE https://developer.harmonyos.com/cn/develop/deveco-studio#download devecostudio-windows-tool-2.0.12.201 因为这IDE安装程序是32位,所以以下目的是从win32安装包里拿到win64的ide程序,还有个办法就是直接从装好的Windows机器里复制出ide的目录到深度系统。 安装deepin-wine5,深度的仓库里这个版本是wine32,深度v20.1目前linux-libc-dev:i386 和 linux-libc-dev:amd64无法同时存在,此种情况不知是个别还是都是这样的问题,所以我上面编译的wine32部分有些库没加全进去,如果你能顺利用上面编译的wine32启动DevEcoStudio的安装程序则不再需要再装deepin-wine5。 sudo apt install deepin-wine5 然后打开应用商店安装【迅雷极速版】(wine),这是为了借用deepin-wine5和迅雷极速版的环境启动deveco studio的安装程序,deveco-studio-2.0.12.201.exe这个安装程序是Nullsoft Installer 生成的自解压win32 GUI文档,我在之前编译的wine64不能直接引导安装。 既然北向IDE下载页面已经明确需要win64环境就请直接提供win64的安装包好吧,一个win32安装程序包着win64程序有意思么。 装好deepin-wine5后在解压出鸿蒙ide安装包程序的同级目录创建一个ins.sh: -------------------- #!/bin/bash wine=deepin-wine5 prefix_dir=${HOME}/.deepinwine/Deepin-ThunderSpeed WINEPREFIX=${prefix_dir} ${wine} ./deveco-studio-2.0.12.201.exe exit 0 -------------------- chmod +x ins.sh 双击ins.sh,选运行进入安装鸿蒙OS北向IDE 临时安装路径:deepin-wine5的c盘/Program/Huawei/DevEcoStudio,记得所有涉及路径的地方绝对不能有空格也不要有中文。 安装好北向ide后进入~/.deepin-wine的c盘,直接剪切移动Program目录到wine64的c盘,即是: ~/.wine/drive_c/Program/Huawei/DevEcoStudio/,这是IDE最终安装位置。 ///////////////////// 下载Nodejs Lts https://nodejs.org/dist/v14.15.4/node-v14.15.4-win-x64.zip 解压重命名到wine64的~/.wine/drive_c/Program/Huawei/nodejs 然后在wine64的~/.wine/drive_c/创建reg.sh: --------------------- #!/bin/bash wine regedit exit 0 --------------------- chmod +x reg.sh 双击reg.sh,选运行进入注册表找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 位置, 双击Path键名,修改键值,在最后位置添加 C:\Program\Huawei\nodejs;c:\Program\Huawei\DevEcoStudio\bin;%JAVA_HOME%\bin;%JAVA_HOME%\bin\jre\bin;c:\Program\Huawei\SDK\toolchains 键classpath值: .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar 键JAVA_HOME值: c:\Program\Huawei\DevEcoStudio\jbr ------------- 然后在cmd命令行里设置npm仓库地址 C:\>npm config set registry https://mirrors.huaweicloud.com/repository/npm/ cd ~/.wine/drive_c/Program/Huawei/nodejs mkdir -p node_global node_cache 在wine cmd或等后面ide能正常启动后再在ide的Terminal窗口里设置以下两项: 设置 npm 全局包下载路径 npm config set prefix "c:\Program\Huawei\nodejs\node_global" 在wine cmd设置 npm 缓存路径 npm config set cache "c:\Program\Huawei\nodejs\node_cache" 验证nodejs npm info express ///////////////////////////// 进入wine64的~/.wine/drive_c/Program/Huawei/DevEcoStudio/bin 创建devecostudio.sh --------------------- #!/bin/bash wine=wine prefix_dir=${HOME}/.wine WINEPREFIX=${prefix_dir} ${wine} ${HOME}/.wine/drive_c/Program/Huawei/DevEcoStudio/bin/devecostudio64.exe exit 0 --------------------- chmod +x devecostudio.sh ///////////////////////////// 然后回到桌面右键选【在终端中打开】,在终端里用vim在桌面创建hos-ide.desktop快捷图标配置文件: --------------------- [Desktop Entry] Name=HOS IDE Type=Application Exec=bash /home/${USER}/.wine/drive_c/Program/Huawei/DevEcoStudio/bin/devecostudio.sh Terminal=false StartupNotify=true Icon=/home/${USER}/.wine/drive_c/Program/Huawei/DevEcoStudio/bin/devecostudio.svg X-Deepin-CreatedBy=com.deepin.dde.daemon.Launcher X-Deepin-AppID=DevEcoStudio Categories=System; Comment=DevEco Studio for Harmony OS; ---------------------- 注意其中的两个${USER}位置请务必替换成你在系统的用户名 ////////////////////////////////////////// 在~/.wine/drive_c/Program/Huawei/DevEcoStudio/bin/devecostudio64.exe.vmoptions 文件最后添加三行: -Dsun.jnu.encoding=UTF-8 -Dos.version=10.0 -Dos.name=Windows 10 ---------------------- 保存后回到桌面双击deveco studio快捷图标启动deveco studio 2 beta 3。 //////////////////////////// 创建一个鸿蒙App(Java),然后修改gradle-wrapper.properties: distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://code.aliyun.com/kar/gradle-all-zip/raw/master/gradle-6.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists /////////////////// 如果发现你的[File/invalidate cache/restart]的重启命令没法让ide自我重启的话,请按我的以下方法解决: 第一步,装好Golang编译环境。 下载 https://golang.org/dl/go1.15.7.linux-amd64.tar.gz 解压安装: sudo tar -C /usr/local -xzf go1.15.7.linux-amd64.tar.gz 将 /usr/local/go/bin 目录添加至PATH环境变量,譬如写在~/.bashrc最后: export PATH=$PATH:/usr/local/go/bin 第二步,重命名原来的restarter.exe为restarter32.exe,记得并不是删除,mv restarter.exe restarter32.exe 第三步,在~/.wine/drive_c/Program/Huawei/DevEcoStudio/bin目录下创建 restarter.go: ---------------------- package main import ( "fmt" "log" "os" "os/exec" "path/filepath" ) func main() { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { log.Fatalln(err) } err = os.Chdir(dir) if err != nil { log.Fatalln(err) } CallExc("taskkill", []string{"/f", "/im", "Previewer.exe"}) CallExc("taskkill", []string{"/f", "/im", "Simulator.exe"}) CallExc("taskkill", []string{"/f", "/im", "node.exe"}) CallExc("taskkill", []string{"/f", "/im", "java.exe"}) CallExc("restarter32", os.Args[1:]) } func CallExc(proc string, args []string) { cmd := exec.Command(proc, args...) b, err := cmd.CombinedOutput() if err != nil { fmt.Println("Error:", err) return } fmt.Println(string(b)) return } ---------------------- 执行交叉编译命令: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o restarter.exe restarter.go ---------------------- 则会在同级目录生成64位的Windows程序restarter.exe 这样就修复了ide在Linux上无法重启的bug。 ---------------------- 下面我们更进一步 写一个引导程序【devecostudio.exe】来监控ide主程序【devecostudio64.exe】,但有退出,则自动关闭尚未自行退出的相关进程 在~/.wine/drive_c/Program/Huawei/DevEcoStudio/bin目录下创建 devecostudio.go: package main import ( "fmt" "log" "os" "os/exec" "path/filepath" "strconv" "strings" "time" ) func main() { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { log.Fatalln(err) } err = os.Chdir(dir) if err != nil { log.Fatalln(err) } if isProcessExistNix("systemd") { CallExc("killall", []string{"-9", "wineserver"}) } else { kills() CallExc("devecostudio64", os.Args[1:]) for { time.Sleep(time.Minute) if b, _, _ := isProcessExistWin("devecostudio64.exe"); !b { kills() os.Exit(0) } } } } func kills() { CallExc("taskkill", []string{"/f", "/im", "Previewer.exe"}) CallExc("taskkill", []string{"/f", "/im", "Simulator.exe"}) CallExc("taskkill", []string{"/f", "/im", "node.exe"}) CallExc("taskkill", []string{"/f", "/im", "java.exe"}) if b, _, _ := isProcessExistWin("winedevice.exe"); b { CallExc("taskkill", []string{"/f", "/im", "*.exe"}) } } func isProcessExistNix(appName string) bool { cmd := exec.Command("ps", "-C", appName) output, _ := cmd.CombinedOutput() fields := strings.Fields(string(output)) for _, v := range fields { if v == appName { return true } } return false } func isProcessExistWin(appName string) (bool, string, int) { appary := make(map[string]int) cmd := exec.Command("cmd", "/C", "tasklist") output, err := cmd.CombinedOutput() if err != nil { log.Fatal(err) } fmt.Printf("fields: %v\n", output) n := strings.Index(string(output), "System") if n == -1 { log.Println(fmt.Errorf("%s file not found in proc", appName)) return false, appName, -1 } data := string(output)[n:] fields := strings.Fields(data) for k, v := range fields { if v == appName { appary[appName], _ = strconv.Atoi(fields[k+1]) return true, appName, appary[appName] } } return false, appName, -1 } func CallExc(proc string, args []string) { cmd := exec.Command(proc, args...) b, err := cmd.CombinedOutput() if err != nil { fmt.Println("Error:", err) return } fmt.Println(string(b)) return } ---------------------- 执行交叉编译命令: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o devecostudio.exe devecostudio.go ---------------------- 修改devecostudio.sh --------------------- #!/bin/bash wine=wine prefix_dir=${HOME}/.wine WINEPREFIX=${prefix_dir} ${wine} ${HOME}/.wine/drive_c/Program/Huawei/DevEcoStudio/bin/devecostudio.exe exit 0 ---------------------- 以后如果主程序退出后还有残余进程没退出,devecostudio.exe就会自动关闭并自行退出。 搞定。
注意事项: 要在UOS/Deepin上做鸿蒙OS开发,通过系统附带的deepin-wine成功启动并安装了deveco studio,但是启动时报了一个error 2什么的错误,好似深度自带的不行。 启动配置:
说明: 做到有图有真相,以上的操作及成果表明,在Linux下是可以运行DevEco Studio的,只不过安装和配置起来麻烦些。 |