You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio重装App时如何正确获取安装时间?

如何检测Android Studio重装APK后的安装时间?

我原本用这段代码获取App的安装时间:

PackageManager p = this.getPackageManager(); 
ApplicationInfo apinf = null; 
apinf = p.getApplicationInfo(this.getPackageName(), 0); 
String apkFile = apinf.sourceDir; 
installTime = new File(apkFile).lastModified();

但发现通过Android Studio重新安装APK时,installTime并没有更新;只有手动卸载后再重装,这个时间才会正常刷新。想请教怎么修改代码,才能正确检测到这种覆盖安装的时间?


这个问题我之前也碰到过,核心原因是Android Studio的增量安装不会完全替换整个APK文件,它只会更新修改过的资源或代码片段,所以APK文件本身的lastModified()时间不会改变,自然拿不到最新的安装/更新时间。给你两个靠谱的解决方案:

方法1:使用系统提供的PackageInfo API(优先推荐)

Android系统其实已经内置了获取安装和更新时间的接口,完全不需要自己读取APK文件,而且可靠性拉满:

try {
    PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    // 首次安装的时间(卸载重装会重置)
    long firstInstallTime = packageInfo.firstInstallTime;
    // 最后一次更新的时间(包括Android Studio覆盖安装、应用市场更新)
    long lastUpdateTime = packageInfo.lastUpdateTime;
    
    // 你需要的覆盖安装时间,直接用lastUpdateTime就可以了
    Log.d("InstallTime", "最后更新时间:" + new Date(lastUpdateTime));
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

不管是全量覆盖安装还是Android Studio的增量安装,lastUpdateTime都会准确更新,完美解决你的问题。

方法2:读取APK内部签名文件的修改时间(备选方案)

如果因为某些特殊场景不能用PackageInfo的API,可以尝试读取APK包内签名相关文件的修改时间——覆盖安装时这些文件一定会被重新生成,所以时间是最新的:

try {
    ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getPackageName(), 0);
    ZipFile zipFile = new ZipFile(appInfo.sourceDir);
    // 读取MANIFEST.MF文件的修改时间,也可以选其他签名文件比如CERT.RSA
    ZipEntry manifestEntry = zipFile.getEntry("META-INF/MANIFEST.MF");
    long updateTime = manifestEntry.getTime();
    zipFile.close();
    
    Log.d("InstallTime", "覆盖安装时间:" + new Date(updateTime));
} catch (IOException | PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

不过这个方法需要处理IO异常,代码复杂度更高,还是优先选方法1。


内容的提问来源于stack exchange,提问作者xxx374562

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:33:48