为啥签名的发布 APK 不允许用户登录,但构建的调试 apk 允许?
Posted
技术标签:
【中文标题】为啥签名的发布 APK 不允许用户登录,但构建的调试 apk 允许?【英文标题】:Why signed release APK does not allow user to sign in but built debug apk does?为什么签名的发布 APK 不允许用户登录,但构建的调试 apk 允许? 【发布时间】:2022-01-03 22:07:03 【问题描述】:我在 Google Play 上发布了一个应用程序,但当第一个安装该应用程序的客户无法登录该应用程序时,另一位开发人员建议我生成一个签名的 APK(文件名:app-release.apk)和然后将其拖到我的模拟器上进行测试。我这样做了,但在尝试登录时出现错误,所以我在修复此问题之前取消发布了该应用程序。
然后我尝试构建一个 APK,它给了我一个文件:app-debug.apk。我将它拖到我的模拟器上,并且能够毫无问题地登录。
我可能做错了什么?
当我从 android Studio 将应用程序运行到模拟器上时,它运行良好,并将我登录到我的 Firebase 数据库经过身份验证的帐户。
【问题讨论】:
【参考方案1】:您可能为发布版本启用了混淆 (R8),但没有为其编写所需的 -keep
规则。如果没有堆栈跟踪,这是一个理论上的问题,但很可能会显示 ClassNotFoundException
,因为某些类或类成员的名称已被混淆,不应该被混淆。
【讨论】:
我相信我确实为发布版本启用了混淆,这会导致我的用户无法登录吗?在我的应用程序 gradle 文件中,这就是我所拥有的,我应该修复什么? : buildTypes release minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 感谢您的回复马丁。我应该取出 minifyEnabled 的真实值吗?还是我需要向 proguardFiles 添加一些内容? @LizG 发布类似的内容不是最佳选择,最好写proguard-rules.pro
(这些规则因应用程序而异,具体取决于使用的依赖项)。甚至可以在其中添加多个*.pro
条目,以便更好地组织它们。
所以我应该保持 minifyEnabled 为真?我更改为 false 并且在我生成签名的 apk 并将 app-release.apk 拖到我的模拟器并成功登录后它可以工作。但是当我发布时,我会面临混淆错误吗?
minifyEnabled
基本上允许 Proguard 从应用程序中删除“未使用”的代码 - 但有时它无法判断代码何时被实际调用(例如,如果您使用反射,或者库的创建生成的代码)。因此,proguard-rules
文件允许您将事物列入白名单以确保它们被保留。如果禁用 minify
使其正常工作,那可能就是您的问题所在,但我们不可能知道您的应用程序具体发生了什么。如果您进行调查,请检查您正在使用的库(尤其是网络内容)的文档,以查看它们是否提供要添加的 proguard 规则【参考方案2】:
您的项目可能正在为调试和发布版本指定不同的服务器。当您不想使用调试/测试数据破坏发布数据库时,这是一种常见的做法。有关示例,请参阅this SO post。我会检查您的构建 gradle,看看是否可以在那里发现类似的东西。
因此,发布服务器可能已关闭,而调试服务器可能仍在运行。
【讨论】:
我将 minifyenabled 的值更改为 false,然后生成了一个签名的 APK 并安装在我的模拟器上,现在似乎可以工作了。但是当我上传到 Google Play 时,它告诉我需要设置为 true 才能发布,我该怎么办?我需要向 ProguardFiles 添加一些内容吗? 通常情况下,最好将 minifyenabled 保持为 true 并在proguard-rules.pro
中编写适当的规则。但是,如果您只是想尽快在 PlayStore 中获得它,那么从技术上来说,没有什么能阻止您将 minifyenabled 设置为 false。
但将 minifyEnabled 设置为 false - 发布应用时会在 Google Play 控制台中产生混淆错误吗?以上是关于为啥签名的发布 APK 不允许用户登录,但构建的调试 apk 允许?的主要内容,如果未能解决你的问题,请参考以下文章