我正在使用android平台构建一个应用程序。想设计一个服务器端的akka应用程序,以分布式的方式向android应用程序提供服务。两个系统都设计为单独的应用程序。是否可以将akka远程服务器与android应用程序连接起来。请帮助我,因为我对akka和android都是新手。
2 回答
你可以这样做,但你会受苦。
您必须能够以某种方式从您的 android 应用程序访问 akka-remote 和依赖项(netty、scala)的类定义。这可能是有问题的,因为依赖项的总和有超过 65536 个方法,这是 Dalvik 的上限。(也就是说 - 您classes.dex
在 apk 中的文件的方法定义不能超过 65536)。
AFAIK,有三种主要方法:
- 将依赖项拆分为单独的 apklib,并使您的 apk 依赖于这些。
- 我真的不能推荐这个,因为我还没有尝试过。
- 将依赖项拆分为单独的 classes.dex 文件,您可以从应用程序中以编程方式加载这些文件。
- 大概是可行的。从未尝试过。
- 在打包你的 classes.dex 之前运行 proguard
- 您必须与 proguard 斗争才能正确配置,并且您可能会遇到奇怪的运行时失败。我的配置发布在下面。
在您的 android 设备上启动并运行 akka-remote 后,您可以像文档中的示例一样连接到服务器。但是,请记住:
- 您的 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
祝你好运。
我不确定您是否考虑使用 Akka 远程处理协议,但如果是我,我会考虑研究优秀的 HTTP+REST 库 Spray ( http://spray.io/ )。我玩过这个库,它非常漂亮。它与 Akka 很好地集成,并允许您为您的服务提供 REST API。作为奖励,使用 REST 还允许您拥有可以轻松与 Android 前端以外的其他东西集成的服务。
我已经包含了几个链接作为起点。关于为 Android 应用程序编写 REST 客户端的 Google 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 -你的安卓应用程序/1076