【问题标题】:Any working Proguard Configuration for Android App with React Native with obfuscation?任何适用于带有 React Native 混淆的 Android 应用程序的 Proguard 配置?
【发布时间】:2016-07-15 16:05:43
【问题描述】:

当我在现有的带有单个 React Native 屏幕的 Android 应用程序中使用 -dontobfuscate 选项时,发布构建工作正常。

(我还必须从 https://github.com/facebook/react-native/blob/master/local-cli/generator-android/templates/src/app/proguard-rules.pro 为 pro-guard 设置 react native 配置)

但是,我想混淆我现有的应用程序并仅忽略 react-native 混淆(因为它不受支持:https://github.com/facebook/react-native/issues/7530

注释掉-dontobfuscate后,我得到了这些错误:

Warning: com.facebook.react.views.recyclerview.NotAnimatedItemAnimator: can't find referenced method 'void dispatchRemoveStarting(android.support.v7.widget.RecyclerView$ViewHolder)' in program class com.facebook.react.views.recyclerview.NotAnimatedItemAnimator
Warning: com.facebook.react.views.recyclerview.NotAnimatedItemAnimator: can't find referenced method 'void dispatchRemoveFinished(android.support.v7.widget.RecyclerView$ViewHolder)' in program class com.facebook.react.views.recyclerview.NotAnimatedItemAnimator
...

我尝试了以下配置,但没有一个可以工作。他们要么在assembleRelease 的 proguard 阶段抛出警告,要么一旦构建,在首次启动 react native 屏幕时抛出异常。

  1. 第一次配置尝试:

    -keep class com.facebook.react.** { public protected private *; }
    
  2. 第二次配置尝试:

    -dontwarn android.support.v7.**
    
    -keep class android.support.v7.** { *; }
    
    -keep interface android.support.v7.** { *; }
    
  3. 第三次配置尝试:

    -keep class android.support.v7.internal.** { *; }
    
    -keep interface android.support.v7.internal.** { *; }
    
  4. 第四次配置尝试:

    support-v7
    
    -dontwarn android.support.v7.**
    
    -keep class android.support.v7.internal.** { *; }
    
    -keep interface android.support.v7.internal.** { *; }
    
    -keep class android.support.v7.** { *; }
    

例外情况:

  Caused by: java.lang.IllegalAccessError: Method 'void android.support.v4.net.ConnectivityManagerCompat.<init>()' is inaccessible to class 'com.facebook.react.modules.netinfo.NetInfoModule' (declaration of 'com.facebook.react.modules.netinfo.NetInfoModule' appears in /data/app/com.sampleapp-1/base.apk)
                                                     at com.facebook.react.modules.netinfo.NetInfoModule.<init>(NetInfoModule.java:55)

任何使用 react-native 的工作版本 apk(现有的 android 应用程序)的人,你能分享你的 proguard 配置吗?

【问题讨论】:

  • android.support 库已经在 aar 文件中包含了 proguard 规则。添加库时,它们会自动添加到您的项目中。 tools.android.com/tech-docs/new-build-system/aar-format
  • 谢谢@ajack。万一,我不包括 Android V7/V4 支持库的 proguard 条目,我得到不同的错误。我已经用我得到的错误更新了问题。

标签: react-native react-native-android android-proguard


【解决方案1】:

这是使 ReactNative 0.27.2 版本工作的有效配置。 (负责原生模块)。

大多数示例和 react-native init 项目都具有如下所列的 react-native 设置。 2 变化是 - 1.删​​除dontobfuscate和 2. -keep class com.facebook.** { *; }

#-dontobfuscate

# React Native

# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip

# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.proguard.annotations.DoNotStrip class *
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
 @com.facebook.proguard.annotations.DoNotStrip *;
 @com.facebook.common.internal.DoNotStrip *;
}

-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
 void set*(***);
 *** get*();
}

-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
-keep class * extends com.facebook.react.bridge.NativeModule { *; }
-keepclassmembers,includedescriptorclasses class * { native <methods>; }
-keepclassmembers class *  { @com.facebook.react.uimanager.UIProp <fields>; }
-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }

-keep class com.facebook.** { *; }
-dontwarn com.facebook.react.**

# okhttp

-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**

# okio

-keep class sun.misc.Unsafe { *; }
-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn okio.**

【讨论】:

    【解决方案2】:

    你应该试试Bg+ Anti Decompiler/Obfuscator 它可以混淆您的项目:有效且简单(UI 设置,而不是命令行配置)。 它支持:

    • 隐藏字符串值(当您在 java 源代码中保留一些敏感信息时很有帮助,例如:“Hello world”->ߤª)
    • 使用 unicode 字符(文件名、主活动类、类、函数、变量...)进行混淆
    • 隐藏包名
    • 添加假代码以捕获反编译工具
    • 检查资源字符串(当有人试图编辑您的 APK 资源时很有帮助)

    【讨论】:

    • Neoco,在你编写 Javascript 代码的地方,它如何与 React Native 一起工作?
    • bschandramohan。此应用程序仅适用于 Java 源代码。 Javascript代码还有另一个版本的应用程序。
    • @Neoco ..那是什么?
    • 链接已损坏。
    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多