2012-06-26 131 views
3

我正在用android平台构建应用程序。想要设计一个服务器端的akka​​应用程序,它将以分布的方式向android应用程序提供服务。两个系统都被设计为独立的应用程序是否有可能连接akka远程服务器与android应用程序。请帮助我,因为我对akka和android都很陌生。将android应用程序与akka远程服务器连接

回答

0

我不确定您是否在考虑使用Akka远程协议,但如果是我,我会考虑查看优秀的HTTP + REST库Spray(http://spray.io/)。我玩过这个库,它非常漂亮。它与Akka很好地集成,并允许您为您的服务提供REST API。作为奖励,使用REST还可以让您获得与Android前端以外的其他产品轻松集成的服务。

我已经包含了几条链接作为起点。编写REST客户端Android应用程序的谷歌2010 I/O谈话是特别有趣:

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

你可以这样做,但你会受到影响。

你必须以某种方式能够从android应用程序访问akka-remote和依赖关系(netty,scala)的类定义。这可能是有问题的,因为依赖关系的总和超过了65536个Dalviks上限的方法。 (也就是说 - 您的classes.dex文件在apk中不能有比65536更多的方法定义)。

AFAIK,有三种主要的方法:

  1. 分手了依赖成单独apklibs,使您的APK依赖于这些。
    • 我不能真正推荐这个,因为我没有尝试过。
  2. 将依赖关系拆分为单独的classes.dex文件,您可以从应用程序中以编程方式加载
    • 可能是可行的。从未尝试过。包装你的classes.dex
    • 运行proguard的你将不得不使用ProGuard战斗来获得配置的权利,你可能会得到奇怪的运行时故障。我的配置张贴在下面。

一旦你阿卡远程启动和运行在Android设备上,你可以连接到服务器就像在文档中的示例。但是,请记住:

  • 您的Android设备的IP可能在启动时可用,也可能不可用,因此您可能不希望保留akka配置的那部分动态(尚未完成此操作我)。
  • 您的Android设备的IP可能无法从服务器访问。所以如果你进入服务器需要调用客户端的状态,它永远不会成功。

我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

在Android上使用Spray也可能会遇到[此处]描述的问题(http://code.google.com/p/android/issues/detail?id=22586)。 –

相关问题