以编程方式安装新版本的Android应用程序

以编程方式安装新版本的Android应用程序,android,performance,apk,android-install-apk,android-update-app,Android,Performance,Apk,Android Install Apk,Android Update App,故事 现在我正在做一个项目,一个Android应用程序正在一个定制设备上运行,这个应用程序不是通过Play Store安装的,但是APK文件是手动上传、安装并在设备上启动的 问题在于,当新版本发布时,我们必须在所有设备上手动更新应用程序 我们希望将此过程自动化,并构建如下过程: 安装应用程序 启动应用程序 启动后台进程,以便在服务器中检查新版本 下载新的APK文件 卸载当前应用程序/更新应用程序 安装新应用程序/更新应用程序 问题: 我们能否以编程方式卸载和安装APK文件 Shell我们使用

故事 现在我正在做一个项目,一个Android应用程序正在一个定制设备上运行,这个应用程序不是通过Play Store安装的,但是APK文件是手动上传、安装并在设备上启动的

问题在于,当新版本发布时,我们必须在所有设备上手动更新应用程序

我们希望将此过程自动化,并构建如下过程:

  • 安装应用程序
  • 启动应用程序
  • 启动后台进程,以便在服务器中检查新版本
  • 下载新的APK文件
  • 卸载当前应用程序/更新应用程序
  • 安装新应用程序/更新应用程序
问题:

我们能否以编程方式卸载和安装APK文件


Shell我们使用现有的应用程序来完成这项工作,或者创建一个新的android应用程序来处理新版本检查并在后台更新应用程序?

一个自动化的ADB脚本可以工作,也许可以与Python脚本配对?您需要触发APK的侧向加载,然后在完成后卸载,而不是卸载APK,将更新的APK文件放在服务器上,并将其下载到应用程序中

使用以下功能安装应用程序

fun install(context: Context, packageName: String, apkPath: String) {

// PackageManager provides an instance of PackageInstaller
val packageInstaller = context.packageManager.packageInstaller

// Prepare params for installing one APK file with MODE_FULL_INSTALL
// We could use MODE_INHERIT_EXISTING to install multiple split APKs
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(packageName)

// Get a PackageInstaller.Session for performing the actual update
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)

// Copy APK file bytes into OutputStream provided by install Session
val out = session.openWrite(packageName, 0, -1)
val fis = File(apkPath).inputStream()
fis.copyTo(out)
session.fsync(out)
out.close()

// The app gets killed after installation session commit
session.commit(PendingIntent.getBroadcast(context, sessionId,
        Intent("android.intent.action.MAIN"), 0).intentSender)
}
更新后重新启动应用程序

class UpdateReceiver : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

    // Restart your app here
    val i = Intent(context, MainActivity::class.java)
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    context.startActivity(i)        
}
}
下面的链接描述了在后台静默更新应用程序的完整过程


您无法通过编程从设备本身自动安装APK

  • 如果设备使用shell脚本和
    pm
    命令根目录,则可以自动执行该过程
  • 您可以在所有设备上启用
    USB调试
    ,并编写adb脚本以使用计算机安装apk
  • 您可以使用另一个应用程序,只需检查新的APK,下载并启动安装APK的意图(Oreo及以上版本需要明确的权限),然后让用户点击
    安装
    按钮
但是,您走错了路,因为上面提到的所有方法都非常麻烦。
因为PlayStore完全满足您指定的要求。我强烈建议您在Playstore上发布。

您是否对Android 10进行过测试?