Shell 编程实践

对于习惯了使用高级语言编程的程序员来说,shell 脚本的语法实在是有点原始。但是,shell 脚本开箱即用的特点使得它尤其适合在 Linux 服务器上运行。而例如 Python、NodeJS等语言都需要宿主上安装运行环境才可以使用。

最近出于工作的需要,写了不少 shell 脚本,这里简单记录下编写 shell 过程中的一些实践。

Android strings xml 的转义

先看下面这个例子,如果能回答出这个strings.xml最终显示的结果,本文也不用看了。

<resources>

<string name="test1">test "string"</string>
<string name="test2">test \"string\"</string>
<string name="test3">test &quot;string&quot;</string>

<string name="test4">test 'string'</string>
<string name="test5">test \'string\'</string>
<string name="test6">test &apos;string&apos;</string>


</resources>

上面例子显示结果如下:

test1 : test string
test2 : test "string"
test3 : test string

test4 : test 'string' //IDE lint 报错
test5 : test 'string'
test6 : test 'string' // 新GAP编译报错

测试环境:

  • gradle android plugin version: 3.1.0
  • gradle version 4.4

(注意,最新的GAP>=3.3.2后,用&apos;转义'不会在IDE lint中报错,但是会在mergeResourcestask执行时报错)

TLDR

在android的strings.xml中的value转义规则如下

  1. " 转义只能用\", 不能用&quot;,不转义的话不会报错,最终显示结果"会被吞掉

  2. ' 转义既可以用&apos;, 也能用\', 不转义的话 AS lint 会报错

  3. > 不用转义

  4. < 必须转义为&lt;,不转义的话 AS lint 会报错

  5. & 必须转义为&amp;,不转义的话 AS lint 会报错

  6. @? 可以不用转义

Headless Fragment 设计模式

Headless Fragment 的定义:没有UI的fragment。也就是说 onCreateView()返回值为null。通常配合setRetainInstance(true)使用。后者可以让fragment在activity旋转重建时无需destroy。

为什么有 Headless Fragment这个概念,没有 view 的Fragment有什么功能呢?

关于 `META-INF/library_release.kotlin_module`

More than one file was found with OS independent path 'META-INF/library_release.kotlin_module'

最近在引入两个kotlin写的aar库时编译器报了这样的一个错误。说是打包时存在两个相同的文件,文件路径是META-INF/library_release.kotlin_module

这个文件是干什么用的呢?

Kotlin Coroutines Guide

本文将从以下3个方面介绍 Kotlin Coroutines

  • 概念
  • 使用方法
  • 内部实现原理

本文的实例代码基于Kotlin 1.3.0 和 kotlinx.coroutines 1.0.0。

Android 资源动态加载(一)

无论是插件化开发还是热修复,都有一个绕不过的关键技术难度。那就是——如何动态加载资源?

在插件化方案中,我们可以将资源和代码一起打包在插件中,宿主工程动态加载插件中的dex和资源,宿主工程和插件工程的开发流程实现了解耦。

在热修复中,我们除了常见的代码修复,还可以修改诸如文案,图标等资源文件,甚至可以利用资源热修复的能力在native上不发版玩一些资源运营。

vue router 源码通读

最近通读了一遍 vue-router 的源码,主要是想了解下面两个问题:

  1. 路由信息发生变动时,router-view 如何动态渲染对应的 component
  2. router-link 点击事件触发时,如何引发路由变化