Android应用程序的任何工作Proguard配置与React Native有混淆?

时间:2016-07-15 16:05:43

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

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

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

设置反馈原生配置

但是,我想混淆现有应用并忽略反应原生混淆(因为根据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阶段发出警告,要么一旦建成,就会在首次启动反应原生屏幕时抛出异常。

  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.** { *; }
    
  5. 例外情况:

      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)
    

    任何有反应原生的工作版本apk(现有的Android应用程序),你能分享你的proguard配置吗?

2 个答案:

答案 0 :(得分: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.**

答案 1 :(得分:0)

你应该试试Bg+ Anti Decompiler/Obfuscator 它可以模糊你的项目:有效和&amp;简单(UI设置,而不是命令行配置)。 它支持:

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