我正在尝试向我的 android 应用程序添加一项功能,以通过新版本的 apk 的外部链接进行自我更新。 我正在从外部链接下载 apk(我上传了应用程序的新版本),然后使用 packageInstaller 来更新应用程序,并且应用程序更新成功。但更新后它崩溃并出现错误:
VerityUtils pid-594 E Failed to measure fs-verity, errno 1: /data/app/~~QTV2DULtWFYdJpO7yGn7sg==/com.test.app--JKzM4i9A3BAuvFAm9x9YQ==/base.apk
这可能是什么原因?安装 apk 文件似乎已损坏?但是更新怎么可能成功呢? (我知道这一点是因为我在用户界面中看到了我在新版本应用程序中添加的一些新文本)
附注应用程序拥有设备所有者权限
这是我的代码:
class UpdateAppViewModel(application: Application): AndroidViewModel(application) {
fun download() {
viewModelScope.launch {
withContext(Dispatchers.IO) {
val fileUrl = "https://my-path-to-ne-apk-s3.net/test-app"
val intent = Intent(Intent.ACTION_INSTALL_PACKAGE).apply {
data = Uri.parse(fileUrl)
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK
}
Log.d("UPD", "START DOWNLOAD")
val packageInstaller = getApplication<Application>().packageManager.packageInstaller
val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
val sessionId = packageInstaller.createSession(sessionParams)
val session = packageInstaller.openSession(sessionId)
val inputStream = URL(fileUrl).openStream()
val outputStream = session.openWrite("test-app.apk", 0, -1)
inputStream.copyTo(outputStream)
session.fsync(outputStream)
inputStream.close()
outputStream.close()
Log.d("UPD", "FINISH DOWNLOAD")
val pendingIntent = PendingIntent.getBroadcast(getApplication<Application>().applicationContext, 0, intent, 0)
Log.d("UPD", "BEFORE COMMIT!")
session.commit(pendingIntent.intentSender)
Log.d("UPD", "AFTER COMMIT!")
session.close()
}
}
}
}
基本上,这似乎是正常行为。我所做的一切都是为了改善用户体验 - 添加了广播接收器,旨在在应用程序更新后启动主要活动。因此,对于用户我来说,应用程序似乎已更新并重新启动。这是代码:
class PackageInstallerStatusReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.d("UPD!", "APP HAS BEEN UPDATED!")
if (context == null) {
Log.d("ERR!", "Context should not be null")
return
}
val stIntent = Intent(context, MainActivity::class.java)
startActivity(context, stIntent, null)
return
}
}
此外,我注意到在较早的 Android 版本中,行为并不相同 - 应用程序崩溃,但 VerityUtils 中没有错误。看起来像 Android 13 中的一些安全机制。