当我制作签名的 APK 时,我的 Android 本地数据库不起作用

Posted

技术标签:

【中文标题】当我制作签名的 APK 时,我的 Android 本地数据库不起作用【英文标题】:My Android local database doesn't work when I make a signed APK 【发布时间】:2020-12-10 07:02:12 【问题描述】:

问题: 当我制作签名的 APK 时,android 本地数据库不起作用。

更多信息:我尝试使用房间数据库,但失败了。然后我尝试了 Sugar ORM,但还是失败了。

在我制作签名 APK 之前,一切都在调试模式下完美运行。它无法从本地数据库写入或读取。我已经更新了 Android Studio,但仍然失败。

【问题讨论】:

检查您的混淆规则。很可能您的模型类被混淆了并且干扰了 Sugar 的反射逻辑。也必须与 Room 类似。您可以防止混淆模型.. 【参考方案1】:

这是因为 proguard 混淆。将您的数据库模型添加到 proguard-rules.pro 文件中,以防止它们在构建过程中被混淆。例如,您的联系人表有一个名为 ContactModel.java 的类,如下所示:

@Entity(tableName = "contacts")
public class ContactModel 
    @PrimaryKey(autoGenerate = true)
    public int id;

    @ColumnInfo(name = "name")
    public String name;

    @ColumnInfo(name = "number")
    public String number;


班级地址是com.example.myapp.model.ContactModel.java。您应该像这样向proguard-rules.pro 添加一条规则:

-keep public class com.example.myapp.model.ContactModel

如果你有很多类并且你不想一个一个地添加它们,你只需要将它们全部添加到一个包中;例如model,然后在地址末尾加上*而不是类名,如下所示:

-keep public class com.example.myapp.model.*

【讨论】:

【参考方案2】:

问题是,我没有删除测试生成的文件夹。因此,在已签名的 apk 中,生成的测试文件夹中的文件会引发错误,这甚至可能不会导致应用程序崩溃,而是会阻止您的应用程序执行任务搜索,例如保存在本地数据库中,甚至从 Internet 获取数据。

解决方法是:在制作签名apkenter image description here之前删除生成的测试文件夹。

【讨论】:

以上是关于当我制作签名的 APK 时,我的 Android 本地数据库不起作用的主要内容,如果未能解决你的问题,请参考以下文章

制作签名的apk时谷歌地图不显示

您如何从 Eclipse 内部制作签名和混淆的 android 版本?

如何在Android Studio 1中创建签名apk时禁用Eclipse之类的错误

为 android studio 项目生成签名 APK 时,通用包装器中没有匹配的架构

Android - 签名的 APK - Gradle 执行失败

ClassNotFoundException android 仅在签名的 apk 上