【问题标题】:Keep .so files from being trimmed when use Proguard in Android在 Android 中使用 Proguard 时防止 .so 文件被修剪
【发布时间】:2014-11-21 13:08:30
【问题描述】:

我在我的 android 应用程序中使用 Proguard 来减少方法的数量 (see this)。为此,我在 proguard-project.txt 文件中编写了一些代码行。在必要的命令之后,所有的罐子都能正常工作。但是当我尝试集成 Quickblox 的视频聊天部分时,他们为我们提供了一个我必须集成的 .so。所以我只是按照他们的指导将它保存在 libs\armeabi\libilbc-codec.so 路径中。现在,当我在没有 Proguard 的情况下运行该项目时,它运行良好,但是当我使用 Proguard 编译它时,它给了我以下错误:

11-21 18:18:19.171: E/AndroidRuntime(19825): FATAL EXCEPTION: Thread-34829
11-21 18:18:19.171: E/AndroidRuntime(19825): java.lang.ExceptionInInitializerError
11-21 18:18:19.171: E/AndroidRuntime(19825):    at com.quickblox.videochat.core.objects.AudioRecorder$AudioRecorderRunnable.run(AudioRecorder.java:196)
11-21 18:18:19.171: E/AndroidRuntime(19825):    at java.lang.Thread.run(Thread.java:864)
11-21 18:18:19.171: E/AndroidRuntime(19825): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load ilbc-codec: findLibrary returned null
11-21 18:18:19.171: E/AndroidRuntime(19825):    at java.lang.Runtime.loadLibrary(Runtime.java:365)
11-21 18:18:19.171: E/AndroidRuntime(19825):    at java.lang.System.loadLibrary(System.java:535)
11-21 18:18:19.171: E/AndroidRuntime(19825):    at com.googlecode.androidilbc.Codec.<init>(Codec.java:16)
11-21 18:18:19.171: E/AndroidRuntime(19825):    at com.googlecode.androidilbc.Codec.<clinit>(Codec.java:5)
11-21 18:18:19.171: E/AndroidRuntime(19825):    ... 2 more
11-21 18:18:19.281: E/copybit(19825): Error opening frame buffer errno=13 (Permission denied)

我非常不喜欢使用 Proguard 和 NDK,所以任何人都可以指导我如何克服这个问题?我已经通过右键单击项目-> Android 工具-> 添加本机支持来添加本机支持.. 并选择我一直在使用的 .so 文件。那么任何人都可以提出任何解决方案或我必须写入此 .so 文件才能工作的行吗?

提前致谢。

编辑: 在关注@ph0b 的评论后,我尝试了以下步骤:

我已经从 this tutorial 之后的应用程序中删除了 BDK 支持,并按照他的步骤解压缩了 apk,我在“/lib/armeabi”下获得了我的“libilbc-codec.so”库。但仍然收到以下错误。那么现在可能出了什么问题??

11-24 12:12:29.045: E/AndroidRuntime(6049): FATAL EXCEPTION: Thread-455
11-24 12:12:29.045: E/AndroidRuntime(6049): Process: com.hypersquare, PID: 6049
11-24 12:12:29.045: E/AndroidRuntime(6049): java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/com.google.android.maps.jar", zip file "/data/app/com.hypersquare-1/base.apk"],nativeLibraryDirectories=[/data/app/com.hypersquare-1/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libilbc-codec.so"
11-24 12:12:29.045: E/AndroidRuntime(6049):     at java.lang.Runtime.loadLibrary(Runtime.java:366)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at java.lang.System.loadLibrary(System.java:989)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at com.googlecode.androidilbc.Codec.<init>(Codec.java:16)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at com.googlecode.androidilbc.Codec.<clinit>(Codec.java:5)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at com.quickblox.videochat.core.objects.AudioRecorder$AudioRecorderRunnable.run(AudioRecorder.java:196)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at java.lang.Thread.run(Thread.java:818)

【问题讨论】:

标签: android android-ndk quickblox unsatisfiedlinkerror


【解决方案1】:

Proguard 不应该删除 .so 文件,我猜你的问题来自其他方面。

当您使用 eclipse 中的“添加本机支持”时,eclipse 会创建一个空的 ndk 库项目(一个带有空源和示例 Makefile 的 jni 文件夹)。

因此,当您构建应用程序时,eclipse 会清空 libs/*/ 文件夹,然后在此处构建并安装新创建的库。

如果你自己不使用NDK(不使用它编译任何源),你应该从你的项目中删除jni文件夹及其内容,并将你需要打包的.so文件放入你的apk ,直接在libs/(armeabi|x86|...) 文件夹内(顺便说一句,使用 Android Studio 时它是 jniLibs 而不是 libs)。

要检查哪些 .so 文件被打包到您的应用中,您可以将 APK 作为 zip 文件打开并查看 lib/(armeabi|x86|...) 文件夹。

【讨论】:

  • @ph0b- 非常感谢您的回复,但仍然无法正常工作。请检查我有问题的编辑。我的方向是否正确?
  • 是的!但这很奇怪,它仍然无法正常工作...您能检查一下您的库是否已安装在设备上吗?您可以运行adb shell ls /data/app/com.hypersquare-1/lib/arm/ 或使用此应用程序:play.google.com/store/apps/…。另外,请尝试再次卸载并安装您的应用,以防万一。
  • 嗨 ph0b,这里的 cmets 越来越多,所以我带你私聊了。你能在那里看看我的问题吗?非常感谢您的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多