2012-06-26 132 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)。 –

相關問題