一个Android开发可以走多远-26年1月版

一个人接着走啊走,

2026年1月31日

SharedPreferences会ANR,而DataStore也有着连续几个稳定版有Bug的历史,导致了我现在都要把键值对储存打包好再用依赖注入使用的习惯。

2026年1月30日

Jetpack Compose的Matrix是4x4的,不同于View的3x3,而且API不同,因此要达到需要的效果,需要温习线性代数知识。

2026年1月29日

时隔多年,AndroidX Paging依然很难用。我还是自己手搓一个分页方案吧。

2026年1月28日

26日的ADB wifi的任督二脉更像是时不时的回光返照,总体不太稳定。我错怪我自己了,果然无法过于信任AS。

2026年1月27日

应用开发不用Reflection。能用Reflection解决的问题,也能用其他方法解决。Reflection虽然看起来“优雅”,但会破坏IDE跳转和Proguard,都是给未来挖坑。

2026年1月26日

在个人测试后,AS Otter所有的两个版本都有各种问题而无法使用,但Otter 2的ADB wifi秒连,而且切换回Narwhal后,手机像是打通了任督二脉,依旧秒连。也算Otter 2仅有的一个惊喜了。

2026年1月25日

把Magic number替换为sealed interface可以增加编译时安全和减少人为代码错误。

2026年1月24日

使用依赖注入创建一个使用Repo的ViewModel,Repo则使用数据库、网络或储存等各种组件。这种配置会在第一次使用组件时在主线程中初始化这些组件。为了避免阻塞,使用Lazy<Repo>并且在withContext(Dispatchers.IO)来使用Repo。

2026年1月23日

发现当项目复杂到一定程度以至于没人能够了解每个细节时,各种测试和性能监控能更好地发挥作用。从没人理解这个层面上来说,AI生成的大量代码也类似?

2026年1月22日

AGP 9发布了,但问题肉眼可见地多。考虑到还要升级到Gradle 9,所以要好好等一段时间再上手呀。

2026年1月21日

突然发现了看起来有点用的RememberObserver和类似的但没有文档链接的RetainObserver。

2026年1月20日

rememberSaveable像是使用ViewModelSavedStateHandle保存数据,而retain就像仅在ViewModel中放数据。使用这些API很容易让代码乱七八糟,因此可以的话,还是最好在ViewModel统一管理。

2026年1月19日

昨天的视频中提到将不常用的JSON数据变为Base64,并在之后需要时再解析。这是个聪明的方法,不过具体使用还是要Benckmark一下。

2026年1月18日

Delivering Performance in a Blink - Karan Gourisaria & Gaurav Aggarwal | droidcon india 2025都是干货。

2026年1月17日

今天看到有人讨论说Compose性能不如View,言外之意是想要应用跑得快,还是得用后者。这让我想起了纯Java项目的编译速度是极快的,但是为了开发体验,大家还是慢慢接受了Kotlin。类似牺牲性能换取开发体验的事情有很多,Java到Kotlin、View到Compose、Groovy到Kotlin DSL、enum随心用、甚至Bitmap都可以用了丢等。越来越多的性能不用也是浪费。

2026年1月16日

KMP真的Production Ready了吗?它的确能够产出软件,但坑还不少。由于现在资料不算多,所以像是回到了前AI时代,全靠自己摸索和网络搜索。

2026年1月15日

面对大公司的强力推广,passkey的普及也只是时间问题吧。也不知道让用户习惯没有输密码仪式的登录流程会多么艰难。另外,面对国内手机号验证和第三方登录成为标准的情况,估计更难普及。

2026年1月14日

不要把统计、广告、崩溃等联网内容放到AndroidX Startup中,否则会违反某些国家或地区的市场的隐私政策。也不要放到Application.onCreate中,否则会在多进程应用中重复触发。那么只剩在入口Activity中初始化咯。

2026年1月13日

面对AI时,总有一种既怕兄弟过的苦,又怕兄弟开路虎的感觉。不过这种感觉也算是动物本性了。针对一个复杂问题,看着AI给出的乱七八糟的方案,有时跑得起来,有时都编译不了,自己也哭笑不得。虽然现在AI真正帮得到忙的地方还是我很熟悉的地方,但我也想起了黑客帝国里有一段儿说,没人知道远处的一个好像是蓄水池是如何工作,但它依然一直在工作。

2026年1月12日

绝大部分时间,代码在完成后就再也不会被改动,所以与其想着未来再优化现在的半成品代码,不如多上点心,一开始就以完美为目标。

2026年1月11日

面对Legacy code,个人的原则是不坏不修也不碰。不然,在修改或优化的时候引入了新的问题,对用户来说就是体验降级,那么整件事就成没事找事了。想要优化代码,就等到未来必须通过优化来增加新功能或解决已有问题再开始。想要尝试新技巧,就在新功能里尝试。当然,这都是建立在时间有限的基础上,比如一些明显是太闲的公司,对于用新技术重构代码库热衷得很呐。

2026年1月10日

最近遇到了Room引用另外一个Module使用的Entity的过程中,当这个Entity有一个返回这个Module使用implementation引用的类时,无法编译的问题。由于编译错误让人摸不着头脑,花了不少时间检查。解决方法是要么改为api,让Room可以看到引用的类,或者把方法移出Entity。

2026年1月9日

SharedPreferences是会造成不少ANR的,但由于其难以被重现,所以很难在测试环境中被发觉。也没什么太好的解决方法,要么用网络上一些复杂的反射,要么换个框架,比如最近才算比较稳定的datastore。

2026年1月8日

Media3是个好项目,issue反应和功能迭代都很积极。虽然有不少UnstableApi,但用着都没什么问题。

2026年1月7日

Nav3看起来很好,但出货速度太快,以至于不敢信任。根据历史规律,再等等3.1吧。

2026年1月6日

我依旧不明白国内厂商提供的SDK如何可以这么差劲。这么多年下来,proguard是不会配置的,权限是乱申请的,接口设计都不是拍脑门的,简直是在梦游。

一定要把它们用依赖注入拆成单独的模块,这样至少不会污染开发坏境。

2026年1月5日

现在的media-samples的玩具意味更大,看看乐子得了。

2026年1月4日

现阶段Metro作为依赖注入对多Module的KMP项目的支持还差点意思,所以暂时用Koin咯。只要架构选的好,切换依赖没烦恼。

2026年1月3日

From Parcelable to @Serializable - Kuan-Ying Chou | droidcon London 2025. Serializable是在rememberSaveable基础上可以跨平台的存活过进程死亡的实现。Android底层还是把对象转换为Bundle。

2026年1月2日

Java versions in Android builds逻辑混乱,让人头大。怎样的配置是最佳实践,也是让人摸不着头脑。文档中的推荐也有着潜在的坑。保险起见,还是用传统的sourceCompatibility + jvmTarget吧。

2026年1月1日

与View相比,Jetpack Compose的Text关闭了includeFontPadding,所以英文的默认高度与TextView不同,打开就好了。

Jetpack Compose的TextField的高度则会根据中英文不同而变化,加上其他需求,会很让人很抓狂。我发现TextField的大部分参数都不会变,所以直接用AndroidView包裹一个AppCompatEditText就可以解决问题喽。其中,用DrawableCompat.setTinttextCursorDrawable上色(旧系统的用户应该不会注意到吧)。