Использование MessagePack с Android - PullRequest
       34

Использование MessagePack с Android

10 голосов
/ 23 сентября 2011

Кто-то пытался использовать MessagePack с приложением для Android?
Возможно ли это?Я попытался использовать банку из msgpack-java и получил следующее исключение:

Caused by: java.lang.ExceptionInInitializerError
  at org.msgpack.Packer.pack(Packer.java:532)
  at org.msgpack.MessagePack.pack(MessagePack.java:31)
  ... 15 more
  Caused by: java.lang.ExceptionInInitializerError
  at org.msgpack.template.TemplateRegistry.<clinit>(TemplateRegistry.java:38)
  ... 17 more
  Caused by: java.lang.VerifyError: org.msgpack.template.BeansFieldEntryReader
  at org.msgpack.template.builder.BeansTemplateBuilder.<init (BeansTemplateBuilder.java:42)
  at org.msgpack.template.builder.BuilderSelectorRegistry.initForJava(BuilderSelectorRegistry.java:73)
  at org.msgpack.template.builder.BuilderSelectorRegistry.<clinit>(BuilderSelectorRegistry.java:38)
  ... 18 more

Код, который я использую, очень простесть javassist.jar, msgpack-0.5.2.jar, slf4j-api-1.6.2.jar и slf4j-jdk14-1.6.2.jar в моем каталоге lib.

В моем серверном приложении этот код отлично работает с теми же библиотеками.

Ответы [ 4 ]

13 голосов
/ 02 октября 2011

(Надеюсь) ФИНАЛЬНОЕ ОБНОВЛЕНИЕ

msgpack : 0.6.8 работает на Android без проблем

msgpack-rpc : 0.7.0 работает на Android с одним предупреждением.

В частности, вам нужно добавить следующее к onCreate для API уровня 8 (Android 2.2.1) и, возможно, ниже:

java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");

из-за этой ошибки .

Если вы хотите увидеть простой пример, вот пара проектов, созданных для этой цели:


Предыдущие версии

ОБНОВЛЕНИЕ: начиная с 0.6.7 msgpack должен быть совместим с Android (существует небольшая проблема исключения зависимостей). Проверьте текст ниже для msgpack-rpc (который также может быть адаптирован в будущем).

ПРИМЕЧАНИЕ. Если вы также используете msgpack-rpc , вам необходимо выполнить следующие шаги:

  1. Загрузите исходный файл msgpack-rpc из git: //github.com/msgpack/msgpack-rpc.git (в частности, папка "java" ).
  2. Измените основную версию артефакта msgpack на созданную вами.
  3. В org.msgpack.rpc.loop.netty.NettyEventLoop измените NioClientSocketChannelFactory на OioClientSocketChannelFactory (getWorkerExecutor ())
  4. Создайте MessagePack-RPC таким же образом, как в случае основного JAR-файла MessagePack (см. Шаг 11 выше).

Замена NettyEventLoop вызвана этой проблемой: http://markmail.org/message/ypa3nrr64kzsyfsa.

Важно: Я только что протестировал синхронную связь. Асинхронный может не работать.


А вот причина, по которой msgpack не работал с Android до 0.6.7:

Причина ошибки заключается в том, что MessagePack использует несколько классов java.beans, которые не включены в Android SDK. Вы, вероятно, используете аннотацию MessagePackBeans .

Эта проблема аналогична описанной здесь , для которой общее решение обозначено здесь . К сожалению, в нашем случае это требует перекомпоновки msgpack. Вот что я сделал (вы почти наверняка можете пропустить шаги 5 и 8, но я так не пробовал):

  1. Загрузите исходный код MessagePack с https://github.com/msgpack/msgpack-java.git.
  2. Импортируйте источник MessagePack как проект в вашей IDE.
  3. Загрузите исходный код Apache Harmony для соответствующих пакетов из http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/beans/src/main/java.
  4. Скопируйте эти пакеты в папку src / main / java вашего проекта MessagePack:
    • java.beans
    • java.beans.beancontext
    • org.apache.harmony.beans
    • org.apache.harmony.beans.internal.nls
  5. В вашем проекте MessagePack удалите следующие классы:
    • PropertyChangeListener
    • IndexedPropertyChangeEvent
    • PropertyChangeEvent
    • PropertyChangeListenerProxy
    • PropertyChangeSupport
  6. Переименуйте пакеты java.beans во что-то другое, например. custom.beans .
  7. Изменить все java.beans ссылки на переименованный идентификатор, так снова, например, custom.beans . Это относится , особенно к BeansFieldEntryReader (этот класс является причиной исходной ошибки).
  8. Измените ссылки custom.beans для пяти классов, которые вы удалили в Шаг 5 , обратно на java.beans .
  9. В классе org.apache.harmony.beans.internal.nls.Messages закомментируйте метод setLocale и удалите связанный с ним импорт.
  10. Удалите все классы, в которых все еще есть ошибки, , кроме Кодер . В этом классе закомментируйте все ссылки на классы, которые вы удалили. Теперь у вас должен быть безошибочный проект.
  11. Создайте JAR-файл MessagePack:
    • Если вы используете Maven, измените версию в pom.xml на что-то уникальное, запустите сборку Maven с целью install , затем добавьте зависимость в свой проект Android с этой версией .
    • Если вы не используете Maven, вам нужно выполнить цель jar для Ant с включенным build.xml . Замените JAR-файл msgpack в вашем проекте Android на этот.
  12. Если вы публикуете свое приложение, не забудьте включить соответствующее юридическое уведомление для Apache Harmony. Это лицензия Apache, как и MessagePack.

Это должно сделать это. Используя ваш пример кода и мой собственный класс данных, я смог успешно упаковать и распаковать данные.

Весь ритуал переименования связан с тем, что компилятор DEX жалуется на java. * Именование пакетов.

0 голосов
/ 10 мая 2017

Я предлагаю вам написать это в главном файле правил proguard-

-dontwarn org.msgpack.**
-keep class org.msgpack.** { *; }
0 голосов
/ 15 августа 2012

@TheTerribleSwiftTomato и основная команда MessagePack постоянно работают над тем, чтобы заставить MessagePack работать на Android, см. Связанную с проблему GitHub . Исправление, упомянутое в ответе @ TheTerribleSwiftTomato, можно найти здесь .

Обновление

Мне удалось запустить его как минимум на Android, добавив (кропотливо) все необходимые javassist классы, которые в настоящее время требуются для успешной сборки. Дополнительный 600KB выигрыш в размере, но, по крайней мере, это похоже на работу. В целом, похоже, что он работает в некоторой степени на Android, в конечном итоге обратитесь к менее известным ресурсам о пакете сообщений, таким как Группа пользователей и его Wiki для получения дополнительной информации.

В качестве примечания обязательно используйте библиотеку HTTP-запросов (например, LoopJ Android Async HTTP или Apache HttpClient ), которая может обрабатывать двоичные данные .

И последнее, но не менее важное: вы можете пропинговать меня, если есть интерес к этому jar, который заставляет MessagePack, по-видимому, работать на Android - кредиты идут, конечно, @TheTerribleSwiftTomato, который предоставил исправление выше!

0 голосов
/ 01 ноября 2011

Существует критическая ошибка в сообщении msgpack о том, что данные, упакованные в msgpack, будут повреждены на виртуальной машине Dalvik.http://jira.msgpack.org/browse/MSGPACK-51

...