跳转至

Android 性能优化技术月报 | 2025 年 3 月

每个月都会有一些 Android 性能优化相关的优质内容发布,然而,碎片化阅读使得这些知识难以形成完整体系,且容易被遗忘。为解决这些问题,我决定尝试使用技术月报的形式,总结我在最近一个月内查阅的 Android 性能优化相关的优质内容。

月报的主要内容包括:整理展示我在最近一个月所查阅的 Android 性能优化领域的最新技术动态、精选博客,精选视频等内容。

精选博客

得物 Android Crash 治理实践

通过修复历史遗留的Crash漏报问题(包括端侧SDK采集的兼容性优化及Crash平台的数据消费机制完善),得物Android端的Crash监控体系得到显著增强,使得历史Crash数据的完整捕获能力得到系统性改善,相应Crash指标也有所上升,经过架构以及各团队的共同努力下,崩溃率已从最高的万2降至目前的万1.1到万1.5,其中疑难问题占比约90%、因系统bug导致的Crash占比约40%,在本文中将简要介绍一些较典型的系统Crash的治理过程。

at libcore.io.Linux.android_getaddrinfo(Linux.java)
at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:172)
at java.net.InetAddress.parseNumericAddressNoThrow(InetAddress.java:1631)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:96)
at java.net.InetAddress.getAllByName(InetAddress.java:1154)

#00 pc 000000000003b938  /system/lib64/libc.so (android_detectaddrtype+1164)
#01 pc 000000000003b454  /system/lib64/libc.so (android_getaddrinfofornet+72)
#02 pc 000000000002b5f4  /system/lib64/libjavacore.so (_ZL25Linux_android_getaddrinfoP7_JNIEnvP8_jobjectP8_jstringS2_i+336)

如何让不同Activity之间共享同一个ViewModel

该文本主要讨论了在 Android 开发中,两个 Activity 之间共享数据时遇到的问题及解决思路。问题是不同的 Activity 根据不同的 LifecycleOwner 创建出的 ViewModel 是不同实例,无法共享。通过分析 ViewModel 的构造过程,提出了解决思路,即重写一个 ViewModelProvider,将其中的 ViewModelStore 定义成单例供所有 LifecycleOwner 共享,并定义 ViewModel 的销毁时机为所有 LifecycleOwner 走到 onDestroy 时。最后给出了具体实现和使用方法。

// 需要放到lifecycle这个包,否则访问不到ViewModelStore
package androidx.lifecycle

class GlobalViewModelProvider(factory: Factory = NewInstanceFactory()) :  
ViewModelProvider(globalStore, factory) {  
    companion object {  
        private val globalStore = ViewModelStore()  
        private val globalLifecycleMap = HashMap<String, MutableSet<Lifecycle>>()  
        private const val DEFAULT_KEY = "androidx.lifecycle.ViewModelProvider.DefaultKey"  
    }  

    @MainThread  
    fun <T: ViewModel> get(lifecycle: Lifecycle, modelClass: Class<T>): T {  
        val canonicalName = modelClass.canonicalName ?: throw IllegalArgumentException("Local and anonymous classes can not be ViewModels")  
        return get(lifecycle, "$DEFAULT_KEY:$canonicalName", modelClass)  
    }  

    @MainThread  
    fun <T: ViewModel> get(lifecycle: Lifecycle, key: String, modelClass: Class<T>): T {  
        if (lifecycle.currentState == Lifecycle.State.DESTROYED) {  
            throw IllegalStateException("Could not get viewmodel when lifecycle was destroyed")  
        }  
        val viewModel = super.get(key, modelClass)  
        val lifecycleList = globalLifecycleMap.getOrElse(key) { mutableSetOf() }  
        globalLifecycleMap[key] = lifecycleList  
        if (!lifecycleList.contains(lifecycle)) {  
            lifecycleList.add(lifecycle)  
            lifecycle.addObserver(ClearNegativeVMObserver(lifecycle, key, globalStore, globalLifecycleMap))  
        }  
        return viewModel  
    }  

    private class ClearNegativeVMObserver(  
        private val lifecycle: Lifecycle,  
        private val key: String,  
        private val store: ViewModelStore,  
        private val map: HashMap<String, MutableSet<Lifecycle>>,  
    ): LifecycleEventObserver { 
        override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { 
            if (event == Lifecycle.Event.ON_DESTROY) {  
                val lifecycleList = map.getOrElse(key) { mutableSetOf() }  
                lifecycleList.remove(lifecycle)  
                if (lifecycleList.isEmpty()) {  
                    store.put(key, null)  
                    map.remove(key)  
                }  
            }  
        }  
    }  
}

精选视频

打造优质 Android 相机体验

了解 Android 相机新增功能以及为用户提供的高级功能,包括夜间和 HDR 拍摄、优化的变焦、零快门延迟、CameraX、扩展程序 API 更新、可折叠设备兼容性等。了解顶级 Android 应用如何充分利用 Android 相机的优势。


最后更新: March 23, 2025