文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

VSCode如何进行安卓开发

2023-06-25 17:08

关注

这篇文章给大家介绍VSCode如何进行安卓开发,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

vs code 大部分是由 ts 编写,上层 UI 可以运行在各个系统的浏览器中,但 vs code 基于 electron 框架,这个框架提供了对 node 的支持,一些浏览器内核中的 js 引擎没有的 api,例如 I/O,系统内核的一些交互等。而 code-server 则是解决了脱离 electron 的问题。目前安卓上有一个叫 aid learing 的软件,自带 VS Code ,看了一下原理差不多,并不是 linux 图形界面打开的 VS Code,也是打开的 webview 连接本地的服务,但这个玩意占磁盘内存太高,整个下载安装完就干掉6个g。

客户端框架

客户端是用 Flutter 进行的开发,而这个框架的选用并不是为了跨端,仅仅是为了快速尝试,还有基础能力的使用。

实现方法分析

code-server 在 github 发布的版本中是有 arm64 架构的,整个下载后,开终端解压执行就挂了,这个虽然是 arm64,并且带有一个 arm64 的 node,但是是为完整 linux 准备的。也就是说,node 中硬编码了 /usr /lib 等这些路径,并且附带的 node_modules 中也有大量的使用到 linux 特有节点的路径,这些安卓上都没有。后来一想,termux 中自带的环境也是有 libllvm gcc nodejs 的,把整个 node_mudules 一删,再手动 install 一下,就行了。所以整个流程大致分为两类。

初始尝试方案:非完整Linux

经过一些测试发现,这种模式有一些问题。

不过按照以上的流程过一遍后,code-server 内的 node_modules 已经是安卓 arm64 可用的模块了,二次打包 code-server,流程就可以简化成如下

但还是会存在编辑器无法搜索代码的 bug,node 虽然只有 20m ,但还是在个人服务器,下行带宽 5mb,大概 700kb/s ,emmm,要集成到 apk 内的话,得集成 deb ,调 dpkg 去安装,放弃。

最后使用方案:完整Linux

最终是选用了完整 Linux 的方式,除了安装需要的体积更小之外,还有完整源的支持,异常 bug 的避免等。由于整个 VS Code 的启动需要的 130mb 的内存都是第一次打开需要的,所以将这些内存的占用放到服务器上,由 app 启动再下载的意义并不大,最后就全都作为资源文件集成到了 apk 内。

具体实现

启动 termux 环境

这个过程之前有现成的轮子了,只需要按照 termux-package 的编译脚本编译一个 bootstrap 集成到 apk,app 启动进行解压,然后根据符号链接格式进行恢复就行。终端是 termare_view。

bootstrap 是一个带有最小依赖的类 linux 环境,有bash,apt 等。

具体实现代码

function initApp(){  cd ${RuntimeEnvir.usrPath}/  echo 准备符号链接...  for line in `cat SYMLINKS.txt`  do    OLD_IFS="\$IFS"    IFS="←"    arr=(\$line)    IFS="\$OLD_IFS"    ln -s \${arr[0]} \${arr[3]}  done  rm -rf SYMLINKS.txt  TMPDIR=/data/data/com.nightmare.termare/files/usr/tmp  filename=bootstrap  rm -rf "\$TMPDIR/\$filename*"  rm -rf "\$TMPDIR/*"  chmod -R 0777 ${RuntimeEnvir.binPath}/*  chmod -R 0777 ${RuntimeEnvir.usrPath}/lib/* 2>/dev/null  chmod -R 0777 ${RuntimeEnvir.usrPath}/libexec/* 2>/dev/null  apt update  rm -rf $lockFile  export LD_PRELOAD=${RuntimeEnvir.usrPath}/lib/libtermux-exec.so  install_vs_code  start_vs_code  bash}

RuntimeEnvir.usrPath 是 /data/data/$package/files/usr/bin

安装完整 Linux 和 code-server

这个我从好几个方案进行了筛选,起初用的 atlio 这个开源,整个开源依赖 python,并且有一个requirement.txt ,需要执行 python -r requirement.txt,依赖就是一大堆,后来换了 proot-distro,纯 shell,所以只需要直接集成到 apk 内就行。

1.安装 ubuntu

install_ubuntu(){  cd ~  colorEcho - 安装Ubuntu Linux  unzip proot-distro.zip >/dev/null  #cd ~/proot-distro  bash ./install.sh  apt-get install -y proot  proot-distro install ubuntu  echo '$source' > $ubuntuPath/etc/apt/sources.list}

2.安装 code-server

install_vs_code(){  if [ ! -d "$ubuntuPath/home/code-server-$version-linux-arm64" ];then    cd $ubuntuPath/home    colorEcho - 解压 Vs Code Arm64    tar zxvf ~/code-server-$version-linux-arm64.tar.gz >/dev/null    cd code-server-$version-linux-arm64  fi}

启动 code-server

直接用 proot-distro 启动就行,非常方便

--termux-home 参数:开启 app 沙盒的 home 挂载到 ubuntu 的 /root 下,这样 ubuntu 就能用 app 里面的文件夹了。

start_vs_code(){  install_vs_code  mkdir -p $ubuntuPath/root/.config/code-server 2>/dev/null  echo '  bind-addr: 0.0.0.0:8080  auth: none  password: none  cert: false  ' > $ubuntuPath/root/.config/code-server/config.yaml  echo -e "\x1b[31m- 启动中..\x1b[0m"  proot-distro login ubuntu -- /home/code-server-$version-linux-arm64/bin/code-server}

其实整个实现其实是没啥难度的,全都是一些 shell 脚本,也是得益于之前的 Termare 系列的支持,有兴趣的可以看下这个组织。然后就是打开 webview 的过程了,如果觉得性能不好,你可以用局域网的电脑来进行连接。看一下非首次的启动过程

WebView 实现方案

首先去 pub 看了一下 webview 的插件,官方目前正在维护的 webview 有这样的提示

  • Hybrid composition mode has a built-in keyboard support while Virtual displays mode has multiple keyboard issues

  • Hybrid composition mode requires Android SKD 19+ while Virtual displays mode requires Android SDK 20+

  • Hybrid composition mode has performence limitations when working on Android versions prior to Android 10 while Virtual displays is performant on all supported Android versions

也就是说开启 hybird 后,安卓10以下有性能限制,而使用虚拟显示器的话,键盘问题会很多。

实际尝试的时候,OTG 连接的键盘基本是没法用的。

再分析了下这个场景,最后还是用的原生 WebView,这里有些小坑。

必须启用项

        WebSettings mWebSettings = mWebView.getSettings();        //允许使用JS        mWebSettings.setJavaScriptEnabled(true);        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);        mWebSettings.setUseWideViewPort(true);        mWebSettings.setAllowFileAccess(true);        // 下面这行不写不得行        mWebSettings.setDomStorageEnabled(true);        mWebSettings.setDatabaseEnabled(true);        mWebSettings.setAppCacheEnabled(true);        mWebSettings.setLoadWithOverviewMode(true);        mWebSettings.setDefaultTextEncodingName("utf-8");        mWebSettings.setLoadsImagesAutomatically(true);        mWebSettings.setSupportMultipleWindows(true);

路由重定向

有些场景 VS Code 会打开一个新的窗口,例如点击 file -> new window 的时候,不做处理,webview 会调起系统的浏览器。

        //系统默认会通过手机浏览器打开网页,为了能够直接通过WebView显示网页,必须设置        mWebView.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                //使用WebView加载显示url                view.loadUrl(url);                //返回true                return true;            }        });

浏览器正常跳转

例如终端输出了 xxx.xxx,ctrl + 鼠标点击,预期是会打开浏览器的。

mWebView.setWebChromeClient(webChromeClient);WebChromeClient webChromeClient = new WebChromeClient() {        @Override        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {            WebView childView = new WebView(context);//Parent WebView cannot host it's own popup window.            childView.setBackgroundColor(Color.GREEN);            childView.setWebViewClient(new WebViewClient() {                @Override                public boolean shouldOverrideUrlLoading(WebView view, String url) {                    context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));                    return true;                }            });            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;            transport.setWebView(childView);//setWebView和getWebView两个方法            resultMsg.sendToTarget();            return true;        }    };

可行性探索

这个能干嘛?安卓屏幕那么小,电脑能本地用 VsCode 干嘛要连安卓的?

正巧,买了一个平板,爱奇艺之余,也能作为程序员的一波生产力了。

VSCode如何进行安卓开发

编译 C 语言

选了一个一直在学习的项目,scrcpy,一堆 c 源码,最后很顺利的编译下来了。

VSCode如何进行安卓开发

Web 开发

移动端的网页调试一直都是问题,作为野路子前端的我也很无奈,一般会加一些 vconsole 的组件来获取调试日志。

之前个人项目速享适配移动端 web 就是这么干的

现在,我们可以本地开发,本地调试,有 node 整个前端大部分项目都能拉下来了,真实的移动端物理环境。试试VSCode如何进行安卓开发

写后台,接口测试

写一点简单的后台,如 python 的 fastapi,flask,并通过 rest client 进行接口测试

关于VSCode如何进行安卓开发就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯