5

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

(我还必须从https://github.com/facebook/react-native/blob/master/local-cli/generator-android/templates/src/app/proguard-rules 为 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
...

我尝试了以下配置,但没有一个工作。它们要么在 proguard 阶段抛出警告,assembleRelease要么一旦构建,在首次启动 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 配置吗?

4

2 回答 2

4

这是使 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.**
于 2016-07-20T15:26:21.597 回答
0

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

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