xv6 macOS 运行环境

​

前言

oh,技术真的浮躁,也真的没用~~

来看个有意思的例子:

fastjson2 FASTJSON2是FASTJSON项目的重要升级,目标是为 下一个十年 提供一个高性能的JSON库

DebugInfo 复用

apk 包体积这块,因为网络传输速度不断提升和手机存储空间的不断提升,越来越有点不是那么重要了

主要最近一直有这方面的需求,所以研究了一下包体积相关的东西,对于 android 的编译流程,有了更多的了解

包体积优化的一些总结

​

前言

最近一直在搞包体积的优化,有点点心得

并且在优化的过程中发现了原有工程的各种问题,这里总结一下。

包体积优化的一些手段

Dex 优化

R8 和 ProGuard 配置优化

  1. R8 目前已经是默认的编译优化工具,只需要 minifyEnable = true
    1. 基础功能
      1. code shrink 删减
      2. obfuscation 混淆
      3. optimization 优化
    2. R8 fullMode 模式
      1. 包体积还可以继续缩减
      2. 遇到的问题 [R8 fullMode Constructor 问题]
        1. Gson 解析问题
        2. kotlin data class
      3. 解决办法
        1. -keepclasseswithmembers class * { (…); @com.google.gson.annotations.SerializedName ; }
  2. ProGuard 配置优化
    proGuard 描述了代码混淆和删减的规则,代码删减直接缩减 dex 体积,代码混淆会使类名、方法名、变量名更短从而缩减 dex 体积。
    目前 proGuard 配置存在的一些问题:
    1. 重复
      -keepclassmembers class .entities. { ; }
      -keepclassmembers class com.xingin.xhs.model.entities.
      * { *;}
      // 范围很大
      -keep @Kotlin.Metadata class * { *; }
    2. 删除 kotlin metadata 注解
      1. kotlin metadata keep 规则导致所有 kotlin 代码被 keep
      2. 引发了一些负负反而得正的潜在问题(Gson 解析)
    3. 删除 kotlin Intrinsics
    4. 优化 optimize 并没有开启
      1. -dontoptimize:删除这条 keep 规则,才会开启 R8 的代码优化
      2. optimize 的副作用:插件化打包的内联问题
  3. 隐性存在的反射大家没有在意
    需要 Gson 解析的类的成员变量被混淆了,到底对于解析有没有影响?
    1. Gson 的解析,默认依赖反射,除非有注解
    2. 反射效率和启动耗事问题

R.class 优化

R.class 内的值,可以直接内联

不太优雅的治理 MMKV FD 的方式

​

前言

最近看了很多 fd 的问题,在一些机型上 fd 数量超过 1024 便会抛出 OOM。

mmkv 正常是没什么问题的,但是如果使用了过多实例,也是会占用一部分的 fd。

mmkv 每一个实例会持有两个 fd(如果你没有释放过的话),在一个大工程里,很有可能同时存在 30+ 的 mmkv 实例,也就是 60+ 的 fd,因为每个业务可能都想有自己的 mmkv 实例(文件),甚至同一个业务下的子逻辑也想有自己的 mmkv 实例,加上 java 程序员从不考虑资源释放问题(me too),这也进一步加剧了 fd 不够用……最终 OOM

一次 CPU 问题的排查

前言

最近来了个新环境,做了第一个需求——直播答题。

这边的风格大致就是:先在能使用的库的基础上快速完成需求,整个开发时间大概在2-3周,客户端总共俩人,我主要负责直播间内的业务逻辑。

再看 Kotlin Coroutines

前言

https://www.youtube.com/watch?v=Mj5P47F6nJg

这个演讲太棒了,演讲人是 Roman Elizarov - Project Lead for the Kotlin Programming Language

按照他的 PPT 我自己总结了一下

Kotlin Coroutines Design Story

首先 kotlin 的协程库 = 线程池 + 任务调度,但是这个调度过程比较复杂,而且整个过程也并没有直接接管 JVM 或者 操作系统层面的东西,所以也没有 go routines 的神奇的抢占调度。 然后只有一个关键字 suspend, suspend 函数机制

好玩的 Kotlin

​

前言

又好久好久没更新了,主要是最近研究的东西对我来说都比较难,内功不够的情况下,写不出东西来。

C/C++ 被我暂时搁置了

最近本来是打算捡起来 C++ 的(也 Hello World 了一下 Rust,这个语言对以前写 Java 的人来说,看起来、理解起来都有点别扭……)。