如何无需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- 在
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> - 在
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è
相关产品推荐
相关产品推荐

