【问题标题】:Native runtime error with React Native app obfuscating code in release buildsReact Native 应用程序在发布版本中混淆代码的本机运行时错误
【发布时间】:2016-06-17 16:01:29
【问题描述】:

我正在尝试创建我的 React Native 应用程序的发布版本。我能够编译它并将其与 JS 捆绑包一起打包。它在调试模式下工作正常。但是,当我在发布模式下组装时,一旦显示第一个 RN 视图,我就会得到 JNI 在运行时抛出的这些 errors

我正在使用与these 非常相似的 proguard 规则。它们是已应用于我的应用程序的 proguard 规则的补充。此外,multiDexEnabled 和 minifyEnabled 都设置为 true。当我在 proguard 中包含 -dontobfuscate 时,该应用程序运行良好,即使在发布模式下也是如此。当它被注释掉时,我得到了上面的错误。代码混淆是发布的要求。我做错了什么?

编辑:Github issue 中有一些讨论,但自 2 月以来一直没有讨论,有关评论 -dontobfuscate 的问题没有得到答复。 @kristjanmik 在 2 月 3 日发布的长堆栈跟踪与我遇到的错误完全相同。

【问题讨论】:

    标签: android react-native proguard


    【解决方案1】:

    问题似乎与另一个 3rd 方库有关:SoLoader。

    本机库尝试访问已被混淆的 Java 类中的静态字段。为了留住他们,试试这个配置:

    -keepclassmembers class com.facebook.soloader.SoLoader {
       static <fields>;
    }
    

    可能需要更多的规则,所以如果以上不能解决所有问题,我也会尝试:

    -keep class com.facebook.soloader.** { *; }
    

    【讨论】:

    • 这让我走上了正轨。即使添加了第二条规则,它仍然崩溃。但是,无论出于何种原因,我再也看不到登录 logcat 了。最后,我通过概括规则使其工作:-keep class com.facebook.** { *; }。我确信最好的做法是不要让规则如此笼统,但我无法调试还有什么崩溃的,也不完全理解推广规则的含义。你能点亮其中一个或两个吗?
    • 我不知道-keep class com.facebook.** { *; },但它解决了我的问题。谢谢@MikeOrtiz
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多