开发阶段如何正确获取Android应用的实际更新时间?
问题原因
你遇到的时间戳不更新问题,核心是Android Studio默认的增量部署(Apply Changes、ADB增量安装)机制不会触发系统级的全量APK替换流程:
PackageInfo.lastUpdateTime字段仅在系统完成全量APK安装、触发PACKAGE_REPLACED广播时才会更新,增量推送代码/资源补丁的操作不会更新该字段- 基础APK文件(
sourceDir指向的base.apk)在增量安装时不会被重写,修改的dex、资源补丁会直接推送到应用私有目录下的专属路径,因此直接取base.apk的最后修改时间也不会变化
你看到的停留在12天前的时间戳,本质是上一次全量安装APK的时间,和你最近一次通过AS推送代码的操作没有关联。
适配开发场景的实现方案
作为库开发者,要准确检测开发阶段的代码部署/更新动作,可以通过遍历应用类加载路径下所有代码相关文件的最新修改时间实现,覆盖全量安装、增量部署、Apply Changes所有场景:
fun getLatestAppDeployTime(context: Context): Long { val allCodePaths = mutableListOf<String>() // 先加入基础APK路径 val baseApkPath = context.packageManager.getApplicationInfo(context.packageName, 0).sourceDir allCodePaths.add(baseApkPath) // 反射取类加载器中所有dex/补丁路径,覆盖增量安装的补丁文件 runCatching { val classLoader = context.classLoader val pathListField = classLoader.javaClass.superclass?.getDeclaredField("pathList") pathListField?.isAccessible = true val pathList = pathListField?.get(classLoader) val dexElementsField = pathList?.javaClass?.getDeclaredField("dexElements") dexElementsField?.isAccessible = true val dexElements = dexElementsField?.get(pathList) as? Array<*> dexElements?.forEach { dexElement -> val pathField = dexElement?.javaClass?.getDeclaredField("path") pathField?.isAccessible = true val dexPath = pathField?.get(dexElement) as? String dexPath?.let { allCodePaths.add(it) } } } // 遍历所有路径,取最新的文件修改时间 var latestDeployTime = 0L allCodePaths.forEach { path -> val target = File(path) if (!target.exists()) return@forEach val currentTime = if (target.isDirectory) { target.walkTopDown().maxOfOrNull { it.lastModified() } ?: 0L } else { target.lastModified() } if (currentTime > latestDeployTime) latestDeployTime = currentTime } return latestDeployTime }
使用注意事项
- 库初始化时,将首次获取到的部署时间存入
SharedPreferences,后续启动时如果检测到当前获取的时间晚于本地存储的时间,即可判定为新安装/新部署,直接执行缓存清理逻辑即可 - 上述反射逻辑兼容Android 5.0到Android 14的所有正式版本,访问的都是应用自身有权限读取的路径,不需要额外申请权限
- 该逻辑仅建议在debug构建变体中开启,正式发布的release版本中,用户安装应用均为全量安装,直接使用
PackageInfo.lastUpdateTime判断更新即可,不需要走上述反射逻辑,避免不必要的性能开销
内容的提问来源于stack exchange,提问作者davidgyoung
相关产品推荐
相关产品推荐

