在我的项目中,本机库使用反射来回调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)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
答案 0 :(得分:3)
您的配置已正确考虑了尝试访问com.example.abc.MainActivity或com.example.abc.NativeActivity中的字段或方法的任何本机代码。
有可能libfilters.so仍然尝试访问Java代码中的其他类,字段或方法。您应该尝试保留相关的类,字段和方法。
我没有立即在OpenCV源代码中看到它,但如果本机代码试图访问Java代码中的某些类,字段或方法,则应该再次保留它们:
-keep class org.opencv.** { *; }
如果这有帮助,您可以将其细化为严格要求的类,字段和方法。