Glide/Coil真机可正常加载图片 模拟器加载失败如何解决?
问题原因
- SSL证书信任问题:你使用的是AWS S3的HTTPS图片链接,大多数Android模拟器的系统根证书列表预置不全,缺少对应CA证书导致HTTPS握手失败;真机系统证书列表完整,因此可以正常加载。
- 模拟器网络异常:即使模拟器显示网络连接正常,也可能存在DNS无法解析S3域名、本机代理/VPN未同步到模拟器、代理本身无法访问S3节点的问题。
- Glide配置缺少容错和日志逻辑:当前加载代码没有添加错误监听,仅有的简略日志无法定位具体失败原因,也没有适配模拟器的特殊网络环境。
解决步骤
第一步 定位问题根因
先在模拟器自带的系统浏览器直接访问测试图片链接,根据结果判断问题范围:
- 浏览器也无法打开:问题出在模拟器本身的网络/证书配置,和Glide无关
- 浏览器可以正常打开:问题出在Glide的网络请求配置
第二步 对应解决方案
证书问题解决方案
注意:跳过SSL校验的方案仅可用于测试环境,严禁在线上版本使用
- 引入Glide的OkHttp集成依赖,版本和你项目中现有Glide版本保持一致:
implementation "com.github.bumptech.glide:okhttp3-integration:4.12.0" kapt "com.github.bumptech.glide:compiler:4.12.0"
- 自定义Glide模块,配置信任所有证书的OkHttp客户端适配模拟器环境:
@GlideModule class UnsafeOkHttpGlideModule : AppGlideModule() { override fun registerComponents(context: Context, glide: Glide, registry: Registry) { val okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient() registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(okHttpClient)) } } object UnsafeOkHttpClient { fun getUnsafeOkHttpClient(): OkHttpClient { return try { val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager { override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {} override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {} override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf() }) val sslContext = SSLContext.getInstance("SSL") sslContext.init(null, trustAllCerts, SecureRandom()) val sslSocketFactory = sslContext.socketFactory val builder = OkHttpClient.Builder() builder.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager) builder.hostnameVerifier { _, _ -> true } builder.build() } catch (e: Exception) { throw RuntimeException(e) } } }
- 长期方案:升级到Android Studio官方最新版模拟器,新版模拟器的系统根证书列表和真机同步,无需额外配置即可加载正常的HTTPS资源。
网络问题解决方案
- 关闭本机所有VPN、代理软件,冷启动模拟器后重试
- 手动修改模拟器的DNS配置为公共DNS(8.8.8.8 / 114.114.114.114)后重试
- 关闭模拟器的快速启动快照功能,完全重启模拟器后测试
优化Glide加载逻辑
修改现有BindingAdapter,添加错误监听打印完整失败堆栈,方便定位具体问题:
@BindingAdapter("imageUrl") fun ImageView.setImageUrl(url: String?) { if (url == null) { setImageBitmap(null) return } GlideApp.with(this) .load(url) .listener(object : RequestListener<Drawable> { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean { Log.e("GlideLoadError", "图片加载失败", e) return false } override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { return false } }) .into(this) }
内容的提问来源于stack exchange,提问作者Sami Shorman
相关产品推荐
相关产品推荐

