Androidプラットフォームでアプリケーションを構築しています。Android アプリケーションに分散方式でサービスを提供するサーバー側の akka アプリケーションを設計したいと考えています。どちらのシステムも個別のアプリケーションとして設計されています。akkaリモートサーバーをAndroidアプリケーションに接続することは可能ですか. 私はakkaとandroidの両方に慣れていないので、助けてください。
2 に答える
あなたはこれを行うことができますが、あなたは苦しむでしょう。
Android アプリから akka-remote と依存関係 (netty、scala) のクラス定義にアクセスできる必要があります。依存関係の合計には、Dalviks の上限である 65536 を超えるメソッドがあるため、これは問題になる可能性があります。(つまりclasses.dex
、apk 内のファイルに 65536 を超えるメソッド定義を含めることはできません)。
私の知る限り、主なアプローチは 3 つあります。
- 依存関係を個別の apklib に分割し、apk をこれらに依存させます。
- 試したことがないのであまりお勧めできません。
- 依存関係を個別の classes.dex ファイルに分割し、アプリからプログラムでロードします。
- おそらく実行可能です。試したことはありません。
- classes.dex をパックする前に 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 -your-android-app/1076