【问题标题】:minifyEnabled removing used assetsminifyEnabled 删除使用过的资产
【发布时间】:2018-06-23 13:06:41
【问题描述】:

我的资产文件夹中有一个目录,其中包含用于数据库的 json。

assets/database/database_1/locations.json

当使用minifyEnabled true 时,它会删除这些资产,因为它认为它们没有被使用。

我如何告诉 ProGuard 它们已被使用?

【问题讨论】:

    标签: android android-gradle-plugin proguard


    【解决方案1】:

    原来minifyEnabled true 没有删除任何资产,它只是为了代码优化和混淆剩余的类。

    问题是我在没有@SerializableName 的情况下将 Gson 与我的数据库模型一起使用,并且由于混淆,它无法绑定值。

    dataclass MyModel( val myName : String )
    

    会变成:(或更模糊的东西)

    dataclass XYZ( val 123 : String )
    

    然后 Gson 找不到值“myName”来放置 JSON。

    要解决这个问题,您有两个解决方案。

    • @SerializableName 添加到每个变量。
    • 或者,如果您不关心混淆,例如使用开源应用程序, 您可以通过添加 useProguard false 来禁用该优化。

    【讨论】:

    • 应该是@SerializedName 而不是@SerializableName。但是感谢您为我指明了正确的方向!
    【解决方案2】:

    做这种优化的不是 ProGuard。见https://developer.android.com/studio/build/shrink-code.html#keep-resources。话虽如此,资产不应该受到影响,只是资源。

    【讨论】:

    • 我正在测试这个,使用minifyEnabled true 会使应用程序崩溃,因为值为空。如果我添加标志useProguard false,应用程序将按预期运行。
    • minifyEnabled trueuseProguard false 使用内部实验缩小,而不是 ProGuard。这会禁用优化和混淆。另请参阅此答案stackoverflow.com/questions/37007485/…您确定资产已消失吗?您是否使用过 APK Analyzer 来检查这一点?此外,这是否发生在发布版本、调试版本或两者上?
    • 我意识到了问题所在。它为空不是因为它不存在,而是因为我使用的是 Gson,它无法通过它的名称找到它。
    【解决方案3】:

    minifyEnabled=true 删除我存储在 assets 文件夹中的所有 gpx 文件。 使用 minifyEnabled=false 重建相同的项目会保留所有 gpx 文件 在资产 f

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多