启用proguard后的致命信号11(SIGSEGV)

时间:2014-09-25 05:49:12

标签: android opencv java-native-interface proguard

在我的项目中,本机库使用反射来回调Java代码。所以我跟着this线程并将以下内容添加到proguard-project.txt

-keep class com.example.abc.MainActivity { *; }
-keep class com.example.abc.NativeClass { *; }

保留NativeClass中的所有方法和字段(声明所有本机方法)和Mainactivity,其中调用本机方法。在这些本机方法中,再次调用NativeClass.java方法(纯java方法),后者又调用Mainactivity.java中定义的java方法。该应用程序运行良好,没有proguard。但是在通过启用proguard导出项目之后,应用程序在本机方法调用(进而调用NativeClass中的java方法)的位置崩溃。我已经尝试了所有可能的命令进入proguard-project.txt无济于事。 OpenCV方法在本机代码中调用。启用proguard时,我应该如何处理OpenCV本机代码。请帮忙。

以下是来自逻辑删除文件的日志

/data/data/com.example.imageanalyse/lib/libfilters.so
be98d7a0  0000f2b8  [heap]
be98d7a4  be98d7b4  [stack]
be98d7a8  56d47798  /dev/ashmem/dalvik-LinearAlloc (deleted)
be98d7ac  5bdb9d6b  /data/data/com.example.imageanalyse/lib/libfilters.so
be98d7b0  00000000  
be98d7b4  00000000  
--------- tail end of log /dev/log/main
09-25 15:20:56.930  3356  3357 D dalvikvm: GC_CONCURRENT freed 18K, 48% free 20256K/38855K,    
paused 2ms+8ms
09-25 15:20:56.980  3356  3356 D dalvikvm: GC_FOR_ALLOC freed 5120K, 58% free 16405K/38855K, 
paused 22ms
09-25 15:20:57.030  3356  3356 D dalvikvm: GC_FOR_ALLOC freed 1278K, 58% free 16449K/38855K, 
paused 22ms
09-25 15:20:57.070  3356  3356 D dalvikvm: GC_FOR_ALLOC freed 1269K, 58% free 16449K/38855K, 
paused 22ms
09-25 15:20:57.090  3356  3356 F libc    : Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

1 个答案:

答案 0 :(得分:3)

您的配置已正确考虑了尝试访问com.example.abc.MainActivity或com.example.abc.NativeActivity中的字段或方法的任何本机代码。

有可能libfilters.so仍然尝试访问Java代码中的其他类,字段或方法。您应该尝试保留相关的类,字段和方法。

我没有立即在OpenCV源代码中看到它,但如果本机代码试图访问Java代码中的某些类,字段或方法,则应该再次保留它们:

-keep class org.opencv.** { *; }

如果这有帮助,您可以将其细化为严格要求的类,字段和方法。