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

如何无需Google Play Store通过Web服务器远程更新安卓应用?

无需Google Play Store实现Android应用自更新方案

核心流程

应用启动/主动检查 → 请求后端版本接口对比版本 → 下载最新APK → 触发系统安装

具体实现步骤

1. 版本检查机制

  • 在自有后端维护版本接口,返回字段至少包含:最新版本号(versionCode)、APK下载地址、更新日志。
  • 应用内通过BuildConfig.VERSION_CODE获取当前本地版本号,与接口返回的最新版本号对比:
    • 若本地版本更低,弹出更新提示框,提供「立即更新」「稍后更新」选项。

2. APK下载实现

推荐使用系统DownloadManager,自带断点续传、通知栏进度展示,无需额外处理复杂逻辑:

val downloadManager = getSystemService(DOWNLOAD_SERVICE) as DownloadManager
val request = DownloadManager.Request(Uri.parse("你的APK下载地址"))
    .setTitle("应用更新")
    .setDescription("正在下载最新版本")
    .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
    .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "app_update.apk")
val downloadId = downloadManager.enqueue(request)

如果需要自定义进度监听、下载逻辑,也可以用OkHttp手动实现下载流程。

3. 触发APK安装

注意不同Android版本的权限与Uri适配:

  • Android 7.0+:必须用FileProvider获取APK Uri,避免FileUriExposedException
    1. 在AndroidManifest.xml配置FileProvider:
      <provider
          android:name="androidx.core.content.FileProvider"
          android:authorities="${applicationId}.fileprovider"
          android:exported="false"
          android:grantUriPermissions="true">
          <meta-data
              android:name="android.support.FILE_PROVIDER_PATHS"
              android:resource="@xml/file_paths" />
      </provider>
      
    2. 在res/xml下创建file_paths.xml:
      <paths xmlns:android="http://schemas.android.com/apk/res/android">
          <external-path name="downloads" path="Download/" />
      </paths>
      
  • 通用安装Intent代码:
val apkFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "app_update.apk")
val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    FileProvider.getUriForFile(this, "${packageName}.fileprovider", apkFile)
} else {
    Uri.fromFile(apkFile)
}
val installIntent = Intent(Intent.ACTION_VIEW).apply {
    setDataAndType(uri, "application/vnd.android.package-archive")
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
startActivity(installIntent)

4. 权限配置

在AndroidManifest.xml中添加必要权限:

<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Android 6.0-9.0 存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
<!-- Android 8.0+ 安装未知应用权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

其中WRITE_EXTERNAL_STORAGE(6.0-9.0)和REQUEST_INSTALL_PACKAGES(8.0+)需要在代码中动态申请。

关键注意事项

  • 签名一致性:更新APK必须与原应用使用相同的签名密钥,否则系统会拒绝安装。
  • 安全校验:用HTTPS传输APK,同时在版本接口返回APK的SHA256哈希值,下载完成后校验哈希,防止恶意篡改。
  • 版本兼容:针对不同Android版本的API差异做适配,比如Android 11+无需存储权限,直接用DownloadManager即可。
  • 用户体验:避免强制静默更新,尽量让用户主动确认;下载失败时提供重试选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:42:51