android - 将 android 应用程序与 akka 远程服务器连接

标签 android akka

我正在使用 Android 平台构建应用程序。想设计一个服务器端 akka 应用程序,以分布式方式为 android 应用程序提供服务。两个系统都设计为单独的应用程序。是否可以将 akka 远程服务器与 android 应用程序连接起来。请帮助我,因为我是 akka 和 android 的新手。

最佳答案

你可以这样做,但你会受苦。

您必须以某种方式能够从您的 Android 应用访问 akka-remote 和依赖项(netty、scala)的类定义。这可能会有问题,因为依赖项的总和有超过 65536 个方法,这是 Dalviks 的上限。 (也就是说 - apk 中的 classes.dex 文件的方法定义不能超过 65536 个)。

据我所知,主要有以下三种方法:

  1. 将依赖项拆分为单独的 apklib,并使您的 apk 依赖于它们。
    • 我真的不能推荐这个,因为我还没有尝试过。
  2. 将依赖项拆分为单独的 classes.dex 文件,您可以从您的应用程序中以编程方式加载这些文件
    • 可能可行。从未尝试过。
  3. 在打包 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

祝你好运。

关于android - 将 android 应用程序与 akka 远程服务器连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11199384/

相关文章:

android - 如何增加 Android 上的 Kotlin 协程 Dispatchers.IO 大小?

sbt - 具有模糊版本错误的 Akka Testkit 错误

java - 在 Patterns.ask() 中对发送者进行外部访问

scala - Akka IO 应用占用 100% CPU

java - 在单个项目中使用 SBT 和 Maven?

android - 返回类型与 FragmentPagerAdapter.getItem(int) 不兼容

android - Android Gradle依赖项冲突和资源重复值

Scala IntelliJ 警告 "dynamic invocation could be replaced with a constructor invocation"

android - 是否可以以编程方式运行 InstrumentationTestRunner?

android - 通知到达时不会出现提醒通知