Android Studio直接运行App正常,安装签名APK后登录失效如何解决
解决方案
- 排查代码混淆配置
签名APK默认会开启R8/ProGuard代码压缩混淆,如果你没有配置对应的保留规则,Retrofit用到的接口注解、请求响应实体类(比如你的ResponseLogin类)的字段会被混淆重命名,导致请求参数传值异常、响应数据Gson解析失败。
请在你项目的proguard-rules.pro文件中添加如下规则:
# Retrofit 相关保留规则 -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions -keepclasseswithmembers class * { @retrofit2.http.* <methods>; } # Gson 解析相关保留规则 # 请把下面的包路径替换成你ResponseLogin等接口实体类所在的包路径 -keep class com.uwbeinternational.weatherapp.** { *; } -keep class * implements com.google.gson.TypeAdapter -keep class * implements com.google.gson.TypeAdapterFactory -keep class * implements com.google.gson.JsonSerializer -keep class * implements com.google.gson.JsonDeserializer -keepattributes *Annotation*
- 检查Release构建配置
打开app模块下的build.gradle文件,确认release构建类型的配置没有错误覆盖接口域名:
android { buildTypes { release { minifyEnabled true // 确认你如果用了buildConfigField配置baseUrl,此处配置的域名是正确的线上地址 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
- 排查SSL证书验证问题
Debug模式下Android默认信任用户安装的自定义证书,Release模式下仅信任系统内置的权威CA根证书。如果你的服务器SSL证书是自签发、或者证书链不完整,会导致Release模式下HTTPS握手失败。
你可以给Retrofit添加日志拦截器,打印请求日志确认报错原因:
- 先添加日志拦截器依赖
dependencies { implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0' }
- 修改Retrofit初始化代码,添加日志输出
private fun getRetrofitClient(): Retrofit { val loggingInterceptor = HttpLoggingInterceptor() loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY val okHttpClient = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build() return Retrofit.Builder() .client(okHttpClient) .baseUrl("https://uwbeinternational.org/") .addConverterFactory(GsonConverterFactory.create()) .build() }
如果确认是SSL证书问题,建议优先替换服务器证书为正规CA机构签发的完整证书,也可以在网络安全配置中添加你服务器证书的指纹进行信任配置。
- 确认接口地址匹配
你提到的PHP部署地址是https://domain.tld/login.php,代码中Retrofit请求的地址是https://uwbeinternational.org/android/login_service.php,请确认两个域名是同一服务,路径没有拼写错误。
内容的提问来源于stack exchange,提问作者UwBe International
相关产品推荐
相关产品推荐

