3

Androidプラットフォームでアプリケーションを構築しています。Android アプリケーションに分散方式でサービスを提供するサーバー側の akka アプリケーションを設計したいと考えています。どちらのシステムも個別のアプリケーションとして設計されています。akkaリモートサーバーをAndroidアプリケーションに接続することは可能ですか. 私はakkaとandroidの両方に慣れていないので、助けてください。

4

2 に答える 2

3

あなたはこれを行うことができますが、あなたは苦しむでしょう。

Android アプリから akka-remote と依存関係 (netty、scala) のクラス定義にアクセスできる必要があります。依存関係の合計には、Dalviks の上限である 65536 を超えるメソッドがあるため、これは問題になる可能性があります。(つまりclasses.dex、apk 内のファイルに 65536 を超えるメソッド定義を含めることはできません)。

私の知る限り、主なアプローチは 3 つあります。

  1. 依存関係を個別の apklib に分割し、apk をこれらに依存させます。
    • 試したことがないのであまりお勧めできません。
  2. 依存関係を個別の classes.dex ファイルに分割し、アプリからプログラムでロードします
    • おそらく実行可能です。試したことはありません。
  3. 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

幸運を。

于 2013-04-19T07:28:48.437 に答える
0

あなたが 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

于 2012-12-08T13:48:35.320 に答える