Easy Coroutines in Android: viewModelScope
原文medium.com/androiddevelopers/easy-coroutines-in-android-viewmodelscope-25bffb605471
取消一个已经不再使用的协程,通常需要写一堆繁琐的代码。而 viewModelScope 通过为 ViewModel 类添加扩展属性来实现结构化并发,从而在 ViewModel 被销毁时,自动取消它内部的子协程.
libgit2 最近升级到了 v1.3,然后自己也想利用这个库在安卓上开发个小工具,所以需要 NDK 交叉编译一下。
1、代码
首先下载 libgit2 源码,然后切换到 git checkout v1.3.0(这里的目的是锁住代码版本,否则在 master 分支,每次重新编译的代码可能会有所差异)
2、准备 ndk 工具链
打开 AndroidStudio 下载 NDK. 这里使用的版本是最新的 24.0.7956693
3、依赖库准备
libgit2 有几个依赖库,在 deps 目录下。实际中 libgit2 有使用到 openssl 库,因为是交叉编译,所以也需要我们自己用 ndk 编译 openssl, 而不是直接使用本机上的 openssl
下载 openssl 源码到 deps 目录下
根据 openssl 目录下的 NOTES-ANDROID.md 提示编译即可
4、cmake android cross-compile 准备
在 libgit2 项目根目录下新建 CMakeLists.android.txt 文件.
123456789101112131415161 ...
libgit2 是一个跨平台、可在自己应用中链接的 git 实现库.
libgit2是一个便携、纯C实现 git 核心功能的依赖库.当前已经实现了多种语言绑定,如 Rugged(Ruby)、LibGit2Sharp(.NET)、pygit2(Python)、NodeGit(Node)等.
git GUI 客户端如 GitKraken 和 gmaster,git 托管平台如 GitHub,GitLab和Azure DevOps都是基于此实现的.每一次merge pull request 都是通过 libgit2 来实现的.
最近 libgit2 刚刚放出 1.0 版本,那么先来个 android 交叉编译吧.
环境macos
NDKr21
步骤1、下载源码
`git clone git@github.com:libgit2/libgit2.git`
2、配置 openSSL(可跳过)
因为 libgit2 支持 openSSL,所以先编译 openSSL.
下载源码,configure/make 即可
3、配置工具链
在 NDKr21 中,已经将各个架构、各个API的工具预编 ...
详细介绍请移步: 官网,中文镜像,清华源
源码探究12345678static int create_subprocess(JNIEnv* env, char const* cmd, char const* cwd, char* const argv[], char** envp, int* pProcessId, jint rows, jint columns)
此方法即为 termux 的核心,通过该方法将用户输入的命令和当前工作的文件夹传入打开的终端去执行.
1、打开伪终端
12345int ptm = open("/dev/ptmx", O_RDWR | O_CLOEXEC);if (ptm < 0) return throw_runtime_exception(env, "Cannot open /dev/ptmx");// UNIX98 的伪终端模式.// pts(pseudo-terminal slave)/ptmx(pseud ...
当前 Flutter 对桌面开发环境的支持正在开发中.
macOSmacOS 是当前最成熟的桌面开发平台(仅 flutter 而言),已经进入 alpha 阶段.
WindowsWindows shell 处于 technical preview.当前是基于 Win32 的,但计划后续探索 UWP 支持.注意:最终定型版本的 API 可能和当前有明显差异.
Linux当前 Linux shell 仅仅是 GLFW 的替代品,来探索 Linux 桌面实现,未来可能会被替换成其他实现.将来你的应用无论是使用 GTK+,Qt,WxWidgets,Motif 或其他任意开发工具套件都可以通过 Flutter 来创建 library,但是当前还没想好如何规划.当前计划先无条件支持 GTK+,然后慢慢支持其他.
命令create当前,只有 macOS 支持flutter create.对于 Windows 和 Linux,推荐参考 flutter-desktop-embedding project.
覆盖目标平台大部分应用需要覆盖支持的应用平台对应的值,否则会出现Unknown platform ...
从 Kotlin M5.1 之后不再支持函数参数可变(var).
123fun foo(var x: Int) { x = 5}
主要是这回导致歧义:可能认为传递的是引用参数(此特性不支持,需要在 runtime 修改).另一个原因是主构造函数:主构造函数使用 val 或 var声明不同性质的属性,而普通函数却不需要这样的功能.同时可变参数可不是一个好习惯,所以在函数支持可变参数或for-loop块都不再支持.
origin
Flutter engineFlutter Engine 不创建或管理线程,相应的由 embedder 创建管理、message loops.
embedder 提供了 task runner 来执行任务.
Dart VM 会有自己的线程池.而 Flutter engine 和 embedder 都无法访问到线程池的线程.
Task Runner ConfigurationFlutter engine 会向 embedder 申请4个 task runner 引用. engine 不在乎引用是不是同一个 task runner,或者多个 task runner 运行在同一个线程中.为了优化性能, embedder 应该为每个 task runner 分配一个单独的线程.虽然 engine 不关心 task runner 运行的线程情况,但是在 engine 的整个生命周期中线程配置应该保持一致.也就是如果 embedder 为task runner 分配了一个单独的线程,那么直到 engine 销毁,这个 task runner 都只能在这个线程运行.常用的 task runner ...
build-tool
使用 build_runner 作为开发服务1、在 pubspec.yaml中添加build_runner和build_web_compilers
12345environment: sdk: '>=2.0.0 <3.0.0'dev_dependencies: build_runner: ^1.0.0 build_web_compilers: ^0.4.0
2、下载依赖
1pub get
3、启动服务
1pub run build_runner serve
服务启动后,每次保存操作都会触发重新构建.
创建输出文件夹使用--output <directory name>选项构建,将内部引用 URL 匹配的文件路径和directory name合并作为输出目录,将文件写入.此选项可以在build,watch,serve命令中使用.如果没有使用 serve命令时,此目录同时被另一个不同的 server 使用.如果只想输出包的一部分,比如web目录,可以使用--output web:<directory name ...
Dart 是单线程模型,相对于 JavaScript,其也有 microTaskQueue 和 eventTaskQueue.
Zone 代表某个环境的稳定跨异步环境调用.
代码通常都执行在一个 zone中,如Zone.current.而main函数通常运行在默认的Zone.root上下文中.通过 runZoned 创建一个新zone 或 Zone.run 将代码运行到一个由 Zone.fork创建的上下文中.
开发者可以通过覆盖一个存在zone的一些方法来创建一个新zone.如自定义zone可以替换或修改print、timers、micortasks、uncaught erros 的默认行为.
Zone类不可以被继承.可以使用 fork 存在的 zone,通常是Zone.current和ZoneSpecification来自定义zone.这和继承Zone类来创建新的zone类似.
异步回调总是运行在其被规定的zone上下文中.使用一下步骤实现:
首先使用registerCallback、registerUnaryCallback、registerBinaryCallback中的一 ...