Использование Google Guava с Android 1.6

#java #android #guava

#java #Android #гуава

Вопрос:

Я использую библиотеку Guava r09 в приложении для Android, но я получаю следующую ошибку, когда использую ее с 1.6. Это немного странно, потому что оно отлично работает в версии 1.5. Кроме того, метод, который «не найден», очень четко там указан. Я также попытался включить jsr305.jar файл, но это все еще не работает.

Ценю любую помощь, выполнение ввода-вывода на Java очень болезненно без Guava.

Это код:

 String timestamp = CharStreams.toString(
    CharStreams.newReaderSupplier(timestampFile, Charset.forName("UTF-8")));
  

Это исключение:

 05-08 12:16:41.163: ERROR/dalvikvm(335): Could not find method com.google.common.io.LineReader.<init>, referenced from method com.google.common.io.CharStreams.readFirstLine
05-08 12:16:41.163: WARN/dalvikvm(335): VFY: unable to resolve direct method 6798: Lcom/google/common/io/LineReader;.<init> (Ljava/lang/Readable;)V
05-08 12:16:41.163: WARN/dalvikvm(335): VFY:  rejecting opcode 0x70 at 0x0009
05-08 12:16:41.163: WARN/dalvikvm(335): VFY:  rejected Lcom/google/common/io/CharStreams;.readFirstLine (Lcom/google/common/io/InputSupplier;)Ljava/lang/String;
05-08 12:16:41.163: WARN/dalvikvm(335): Verifier rejected class Lcom/google/common/io/CharStreams;
05-08 12:16:41.163: DEBUG/AndroidRuntime(335): Shutting down VM
05-08 12:16:41.163: WARN/dalvikvm(335): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
05-08 12:16:41.173: ERROR/AndroidRuntime(335): Uncaught handler: thread main exiting due to uncaught exception
05-08 12:16:41.183: ERROR/AndroidRuntime(335): java.lang.VerifyError: com.google.common.io.CharStreams
        at com.triposo.droidguide.rometest.LocationStoreInstaller.install(LocationStoreInstaller.java:33)
        at com.triposo.droidguide.rometest.SplashActivity.onStart(SplashActivity.java:58)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1205)
        at android.app.Activity.performStart(Activity.java:3520)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2373)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
        at android.app.ActivityThread.access$2100(ActivityThread.java:116)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:4203)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:521)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
        at dalvik.system.NativeStart.main(Native Method)
  

Комментарии:

1. Какой код вызывает эту проблему?

2. Я отредактировал вопрос, чтобы добавить код.

Ответ №1:

В конце концов мне удалось решить эту проблему. Если я использую jarjar для переименования com.google.common.io.LineReader в другое имя пакета (например, com.triposo.vendor.com.google.common.io.LineReader), это сработает! Я предполагаю, что LineReader поставляется в комплекте с Android, но с немного другой (несовместимой) версией.

Ответ №2:

Вот почему использование недокументированных вызовов Android API является плохим. CharStreams никогда не был частью Android API (вы не видите упоминания о его удалении в списке изменений 1.6).

Недокументированные классы или методы могут исчезнуть без уведомления из любой версии ОС, как это произошло здесь.

Комментарии:

1. CharStreams является частью Guava, которая является третьей библиотекой, которую я пытаюсь использовать. Вот о чем вопрос. Это работает на 1.5 и на 2.x, так что в 1.6 что-то происходит, и я подозреваю, что это ошибка.

2. Хорошо, он ищет com.google.common.io.LineReader , который является частью Guava (теперь я вижу это в исходном коде). Итак, я отказываюсь от своего первоначального утверждения — похоже, проблема с загрузчиком / верификатором классов. Как вы импортируете их в свой проект? Является ли все это только одним файлом .jar? Множество .jars? Или вы берете необработанный исходный код?

3. Хорошо, я с этим разобрался. Если я использую jarjar для переименования com.google.common.io.LineReader в другой пакет, все это работает! Я предполагаю, что LineReader включен в немного другую версию в Android.