在我的项目中, native 库使用反射来回调 Java 代码。所以我关注了this线程并将以下内容添加到 proguard-project.txt
-keep class com.example.abc.MainActivity { *; }
-keep class com.example.abc.NativeClass { *; }
保留 NativeClass(声明所有 native 方法的地方)和调用 native 方法的 Mainactivity 中的所有方法和字段。在这些 native 方法中,再次调用 NativeClass.java 方法(纯 java 方法),该方法又调用 Mainactivity.java 中定义的 java 方法。该应用程序在没有 proguard 的情况下运行良好。但是,在通过启用 proguard 导出项目后,应用程序会在进行 native 方法调用(进而调用 NativeClass 中的 java 方法)时崩溃。我已尝试在 proguard-project.txt 中输入所有可能的命令,但无济于事。 OpenCV 方法在 native 代码中调用。启用 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)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
最佳答案
您的配置已正确考虑了尝试访问 com.example.abc.MainActivity 或 com.example.abc.NativeActivity 中的字段或方法的任何 native 代码。
libfilters.so 可能仍然尝试访问 Java 代码中的其他一些类、字段或方法。您应该尝试保留相关的类、字段和方法。
我没有立即在 OpenCV 源代码中看到它,但如果 native 代码尝试访问 Java 代码中的某些类、字段或方法,您应该再次保留它们:
-keep class org.opencv.** { *; }
如果这有帮助,您可以将其细化为严格要求的类、字段和方法。
关于android - 启用混淆器后出现致命信号 11 (SIGSEGV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26031482/