2012-06-26 2 views
3

Я создаю приложение с платформой Android. Хотелось бы разработать приложение akka на стороне сервера, которое будет предоставлять сервисы распределенным образом для приложения Android. Обе системы разработаны как отдельные приложения. Будет ли возможно подключить удаленный сервер akka к андроидному приложению. Пожалуйста, помогите мне, потому что я новичок и для akka, и для android.подключение приложения для Android с удаленным сервером akka

ответ

0

Я не уверен, если вы подумывали использовать протокол Akka remoting, но если бы это был я, я бы рассмотрел возможность использования превосходной библиотеки HTTP + REST Spray (http://spray.io/). Я играл с этой библиотекой, и она очень гладкая. Он хорошо интегрирован с Akka и позволит вам предоставлять API REST для ваших услуг. В качестве бонуса, REST также позволяет вам иметь услуги, которые легко интегрируются с вещами, отличными от вашего Android-интерфейса.

Я включил пару ссылок в качестве отправной точки. 2010 я говорить Google/O писать REST клиенты для Android приложений особенно интересно:

http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html http://www.techrepublic.com/blog/app-builder/calling-restful-services-from-your-android-app/1076

+0

спасибо, что xbones попробуют и вернутся к вам –

+0

Любая удача в этом? Я не смог заставить Spray работать на Android и не обнаружил никаких доказательств того, что кто-то еще это делает. –

2

Вы можете сделать это, но вы будете страдать.

Вы должны каким-то образом получить доступ к определениям классов для akka-remote и зависимостей (netty, scala) из вашего приложения для Android. Это может быть проблематично, так как сумма зависимостей имеет более 65536 методов, которые являются колпачком Dalviks. (То есть ваш файл classes.dex внутри apk не может иметь больше определений методов, чем 65536).

AFAIK, есть три основных подхода:

  1. дробить зависимости в отдельных apklibs и сделать свой APK зависит от них.
    • Я не могу рекомендовать это, так как я не пробовал.
  2. Разделите зависимости на отдельные файлы classes.dex, которые программно загружаются из приложения.
    • Вероятно выполнимый. Никогда не пробовал.
  3. Run ProGuard перед упаковкой вашего classes.dex
    • Вам придется сражаться с ProGuard, чтобы получить право конфигурации, и вы можете получить странные сбои во время выполнения. Мой конфиг размещен ниже.

После того, как вы получите Акку-пульт и работает на вашем устройстве Android вы можете подключиться к серверу, как в примерах в документации. Однако, имейте в виду, что:

  • IP-вашего Android устройства могут или не могут быть доступны во время загрузки, так что вы можете wan't сохранить эту часть вашего Akka конфигурации динамических (не сделали этого себя).
  • IP-адрес вашего устройства Android может быть недоступен с сервера. Поэтому, если вы попадаете в состояние, когда серверу нужно позвонить клиенту, он никогда не преуспеет.

Мой proguard.cfg (некоторые строки не нужны - не удосужился выяснить, какие из них):

-dontoptimize 
#-optimizationpasses 2 
-dontobfuscate 
-dontpreverify 
-dontskipnonpubliclibraryclassmembers 
-dontskipnonpubliclibraryclasses 
-dontnote ** 
-verbose 

-keep class com.typesafe.config.Config { *; } 
-keep class com.typesafe.config.ConfigFactory { *; } 
-keep class org.slf4j.Logger { *; } 
-keep class org.slf4j.LoggerFactory { *; } 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

#Scala 
-dontwarn scala.** 

-keepclassmembers class * { 
     ** MODULE$; 
} 

-keep class scala.Option 
-keep class scala.Function1 
-keep class scala.PartialFunction 
#https://issues.scala-lang.org/browse/SI-5397 
-keep class scala.collection.SeqLike { 
    public protected *; 
} 
-keep class scala.Tuple* 

-keepclasseswithmembers public class * { 
    public static void main(java.lang.String[]); 
} 

-keep class * implements org.xml.sax.EntityResolver 

-keepclassmembers class * { 
    ** MODULE$; 
} 

-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool { *; } 

-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread { 
    int base; 
    int sp; 
    int runState; 
} 

-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask { 
    int status; 
} 

-keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue { *; } 

#Akka 
-dontwarn org.jboss.netty.logging.** 
-dontwarn org.osgi.** 
-dontwarn javax.servlet.** 
#-dontwarn org.jboss.netty.channel.socket.http.** 

## Unsafe is there at runtime 
-dontwarn sun.misc.Unsafe 
-keep class sun.misc.Unsafe{ 
    *; 
} 

-keep class akka.** { *; } 

-keep class com.google.protobuf.GeneratedMessage { 
    *; 
} 
-keep class org.javatuples.** { *; } 
-keep class org.jboss.** 

-dontwarn org.jboss.netty.handler.codec.marshalling.** 
-dontwarn org.jboss.netty.channel.socket.nio.** 
-dontwarn org.jboss.netty.handler.codec.compression.JdkZlibEncoder 
-dontwarn org.jboss.netty.handler.codec.spdy.SpdyHeaderBlockZlibCompressor 
-dontwarn org.jboss.netty.channel.socket.http.HttpTunnelingServlet 
-dontwarn org.jboss.modules.** 
-dontwarn __redirected.** 
-dontwarn org.slf4j.LoggerFactory 
-dontwarn org.slf4j.MarkerFactory 
-dontwarn org.slf4j.MDC 
-dontwarn org.slf4j.impl.AndroidLogger 
-dontwarn org.slf4j.impl.AndroidLoggerFactory 

Удачи.

+0

Использование Spray на Android также может столкнуться с проблемой, описанной здесь (http://code.google.com/p/android/issues/detail?id=22586). –

Смежные вопросы