問題タブ [knopflerfish]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - OSGi バンドルの完全な Android サポート
このトピックでは、OSGI フレームワークを変換して Android で実行する方法について説明します。次に、Android API を呼び出すことができる OSGI バンドルとして Android パッケージを変換するためのヒントを提供します。
現段階では、これらの Android OSGI バンドルが実行できない唯一のことは、アクティビティの操作とリソースとアセットの使用です。この制限の修正に継続的に取り組んでいます。この件について良いニュースがあることを願っています。
標準の Android パッケージを OSGI バンドルとして変換するよりも、Eclipse で Create Plugin プロジェクト機能を使用する方が難しいことがわかったので、それについてはあまり説明しません。
このメッセージの最後にあるログ セクションで、私の業績を追跡できます。
Knopflerfishプロジェクトに言及しているのは、それが私の仕事の基礎だったからです。変更はKnopflerfish OSGi android プロジェクトで実行されることを意図していますが、実際には他の OSGI フレームワークにも適用できます。OSGi フレームワーク自体を変更する必要はありません。プロジェクトKfServiceLib
とKnopflerfish ディストリビューションKfBasicApp
のtool
ディレクトリを更新するだけです。
バンドルに基本的な Android サポートを追加
機能と制限
これは、Android 用フレームワークのカスタマイズの最初のレベルです。これらの変更は、コンテキストや呼び出しスレッドとは関係ありませんが、android.util.Log
.
これらの変更により、バンドルはプロトタイプと実装で Android クラスを使用できるようになります。それにもかかわらず、必須のリファレンスがないため、グラフィカル ユーザー インターフェイス、コンテンツ プロバイダー、システム サービスなどに関連する機能は何もありません。
Knopflerfish アプリの変更点
そのままでは、tools/android/apk の下にあるアプリケーションは Android 上で OSGi フレームワークを実行できますが、バンドルが Java クラスのみを呼び出している場合に限られます。これは、Knopflerfish フレームワークの一部であるバンドルの場合ですが、Android API を呼び出したいカスタム バンドルはどうでしょうか? Android クラスを解決するバンドルを有効にするために、フレームワークで行う変更を次に示します。
まず、解決できるように、Android パッケージはフレームワーク パッケージの一部である必要があります。これが OSGi プロパティの目的ですorg.osgi.framework.system.packages.extra
フレームワークを作成する前に、エクスポートする Android パッケージのリストにプロパティを設定すると、設定が完了します。ワイルド char は効果がないように見えることに注意してくださいandroid.*
。以下のように、各パッケージに 1 つずつ伝える必要があります。
KfServiceLib
ファイル src/org/knopflerfish/android/service/KfApk.javaに追加するには
次に、追加のパッケージを設定しますKfApk.newFramework()
注意: 可能であれば、プログラム内のコードではなく、ファイルを使用して追加の構成を設定する方がはるかに優れています。
Android パッケージをバンドルでインポートする
フレームワークによって宣言されたシステム パッケージに android パッケージが追加された場合でも、バンドルは、他のインポートされたパッケージと同様に、それらを解決するためにインポートする必要があります。
例:
インポート パッケージ: org.osgi.framework、android.content、android.widget、android.util
注意: Knopflerfish Eclipse プラグインのボタン « auto » を使用して、インポートを自動的に更新することができます。
Context をバンドルに渡す
Knopflerfish アプリのその他の変更点
これらの変更後、独自にアクティビティを開始したり、コンテキストのリソースにアクセスしたりして、バンドルを実行できるようになります。これにより、Android API クラスのセット全体がバンドルで完全に利用できるようになります。ただし、これを実現するためにバンドル コーディングに適用される制約がいくつかあります。必要なのはアプリケーションの Context の参照だけなので、それをフレームワークにプッシュします!
追加するにはorg.knopflerfish.android.service.Knopflerfish.onStartCommand()
これは、アプリケーションの存続期間全体にわたって存在する唯一のコンテキストであるため、アプリケーションのコンテキストのみを渡します。アプリケーションが起動するとすぐに、つまりインストールまたはシステムの起動後に設定されます。バンドルは、このコンテキストで強い参照を維持できます。問題ありません。
バンドルがコンテキストを使用する方法
バンドルは、アクティベーターに渡されたContext
から を取得します。BundleContext
バンドルは UI スレッドとは異なるスレッドで実行されるため、UI 操作は UI スレッドで「プッシュ」された場合にのみ実行できます。そのためには、次のような再利用可能なユーティリティ メソッドを設計するのが賢明です。
このメソッドは、多くの異なる Android バンドルから同じ方法でアクセスする必要があるため、ユーティリティ バンドルのサービスの一部である必要があります。
たとえば、このバンドルは開始時に「Hello」を表示しています。
バンドルなどのアプリケーションを使用する安価な方法
OSGI バンドルに変換されたAPK を略してバンドル APKと呼びます。
- たとえばEclipse Android Projectのおかげで、通常のAPKを作成します
- OSGi フレームワーク (私の場合は Framework.jar)のプロジェクトビルド パスに参照ライブラリエントリを追加します。
- バンドルを説明するバンドル マニフェスト ファイルを編集します
bundle.manifest
(以下の例を参照)。このファイルは実際には APK の一部ではありませんが、カスタム ビルド手順で使用されます - アプリケーション パッケージが
com.acme.helloworld
(この値は AndroidManifest.xml の manifest:package で設定されている) 場合、OSGI バンドルの Activator クラスをパッケージに配置する必要があり、バンドル マニフェストに設定する必要com.acme.helloworld
があります。これらの条件のいずれかが満たされない場合、実行時になります。Bundle-SymbolicName: com.acme.helloworld
java.lang.NoClassDefFoundError
ちなみに、バンドル マニフェスト ファイルは次のようになります。
- Android ツールを使用する> 署名されていない Android パッケージをエクスポートする
bundle.manifest
生成された未署名の APK を次のようにコピーします。META-INF/MANIFEST.MF
- 必要な証明書を使用して APK に署名します。これで、バンドル APK の準備が整いました
- 通常どおりバンドル APK をインストールします。アクティビティを解決するには、インストールが必要です。これがないと、アクティビティは解決されず、バンドルは失敗します
- OSGi フレームワークにバンドル APK (まったく同じ APK ファイル) をロードして開始させる
バンドル APK からアクティビティを開始するには、次のコードを使用します。
ログ
イニシャル
私の努力のこの時点で、Android バンドル:
- AndroidManifest.xml でリソースや宣言を必要としない限り、Android SDK クラスを呼び出すことができます。
android.content.Context
OSGi フレームワークからアクティビティを開始するために使用できるアプリケーションの にアクセスできます。
バンドルはできません:
- アンドロイドの許可を要求し、
- レイアウトからアクティビティを構築し、それらをまったく開始しません。
- で宣言されている静的ブロードキャスト レシーバーを定義します
AndroidManifest.xml
が、コードによってインスタンス化されたレシーバーでも問題ありません。
それは、私が克服しようとしているこれまでに経験した制限と、助けを求める私の目標のためです.
私が目指していること:
- 内部リソース、特にレイアウトをサポートしている
- XML ビルダーで作成できない場合は、コードで内部アクティビティを作成して開始できます。
試練を通して、これまでの私の成果は何ですか:
- Builder を混合し、署名されていないバイナリをエクスポートし、手動で
bundle.manifest
MANIFEST.MF にマージしてから、OSGi バンドルと APK/Android ライブラリの両方として表示される Android プロジェクトを作成しjarsigner
ます。その結果、APK は OSGi フレームワークによってロードされ、解決java.lang.NoClassDefFoundError
済みの状態になりますが、クラスが classes.dex の一部であり、パスに明らかなエラーがない場合でも、アクティベーター クラスが原因で起動できません。 . プロジェクトを Android 依存関係を持つ OSGi バンドルにすると、アクティベーターにはアクセスできますが、JAR 内の Android リソースにはアクセスできません。不可解。 - このガイドの「できること」セクションに記載されているすべての機能を検証します。
編集 2013-09-03
Android バンドルが所有するアクティビティを開始する方法を見つけました。対応する章を参照してください。
編集 2013-09-10: 汎用 OSGI フレームワーク コンテナー
数日後、必要な OSGi フレームワークを実行できるように、Knopflerfish プログラムを汎用にしました。たとえば、私は現在 Knopflerfish や Felix を同じ方法で実行しています。特定のフレームワーク構成の必要性がまだあります。
つまり、必要なプログラムが Knopflerfish によって発行されたとしても、トピックはもはや Knopflerfish だけではありません。
2013-09-27: ステータスとフレームワークの全体的な比較
優先度の変更により、このプロジェクトをしばらく脇に置かなければなりません。ただし、これまでに次のソリューションを評価しました。
- ノップラーフィッシュ OSGi [オープン ソース]、
- Felix と FelixDroid [オープン ソース]、
- ProSyst mBS SDK (Equinox ベース、商用利用)
要約すると、GUI サポートに関しては、どれも優れた利点はありません。Android の方法でアセットやリソース (文字列、レイアウト、画像) を処理できるものはありませんが、OSGi リソースとしてそれらを処理することはできます。 OSGi API ですが、通常どおり Android で使用することはできません。
個人的には、Knopflerfish の管理コンソール サーブレットが気に入っていますが、その GUI サポートは何の役にも立ちません。Felix + FelixDroid は無料の OSGi ソリューションとしてバランスが取れているのに対し、mBS SDK は多数の異なる VM ターゲットをサポートし、プロの開発者の好みにより適したインテント ベースのアプリケーション フレームワークを定義します。
Knopflerfish と Felix はほぼ同じように使用されますが、mBS SDK は多くの点で大きく異なります。Knopflerfish と Felix は交換可能です: OSGi フレームワークを選択することは、別の手作りの JAR 依存関係を選択するだけの問題であるコンテナー プログラムを作成しました!
GUIに関しては、Knopflerfishは何も提供しません。もう少しサポートを得るには、私のガイドラインを確認する必要があります。FelixDroid の主なアイデアは良いものです。実際には mBS SDK に実装されているものと似ていますが、バンドルとして実装されていないのは少しもったいないです。さらに言うと、mBS SDK は、特定のインテントによって開始される OSGi アプリケーション フレームワークを定義することによって、より適切に処理を行いました。どちらもほぼ同じ方法でメイン アクティビティにビューを統合しています。
mBS SDK のもう 1 つの驚くべき違いは、Android フレームワークの依存関係を追加したり、バンドルにそれらの Import-Package ディレクティブを追加したりする必要がないことです。しばらくノップラーフィッシュやフェリックスに頼っていると確かに不安です。また、Eclipse に完全に統合されており、PC からターゲットへの OSGi フレームワークの監視 (Kf と Felix はオンターゲットの管理コンソールのみを提供) や迅速な展開など、多くの便利なタスクを開発者に提供します。ピットは本質的に無料ではなく、コンテナアプリケーションをカスタマイズすることはほとんど不可能です.
android - Android の Knoflerfish - バンドルの開始に失敗しました
このチュートリアルに従って、OSGi を Android アプリケーションに組み込みます。ただし、バンドルをインストールして開始した後、その状態は本来あるべき ACTIVE (32) ではなく、RESOLVED (4) になりました。もう一度開始しようとすると、例外がスローされます。
このバンドルは、 Knopflerfish の例のソースからのサンプル バンドルです。Knopflerfish destop (framework.jar) にインストールするとうまく動作します
私はすでにdexのことを考えていましたが、jarファイルとそのdexファイルをマージするのは役に立たず、まだ機能しません。
ここで何が問題ですか?どうもありがとうございました!
java - Android 上の Knopflerfish の Pax Web
私はOSGi
Web サービスを使用して Android で開始することを計画しています。これにより、Android ブラウザーで Java Server Pages (jsp) と Java サーブレットを実行できるようになります。
私の最初のステップはKnopflerfish
、Android へのインストールでした。knopflerfish のこのチュートリアルに従いました: http://www.knopflerfish.org/releases/5.0.0/docs/android_dalvik_tutorial.html
Knopflerfish はうまくいきました。Android フォンのブラウザで localhost:8080 を確認しました。
2 番目のステップはPax Web
、Android にもインストールされている Knopflerfish にインストールすることでした。ここからのチュートリアルもフォローしました:http://www.knopflerfish.org/kf_pax_web_tutorial.html
チュートリアルでは、次のように述べています。
KF HTTP バンドルをアンインストールする
最初のステップは、HTTP ルート バンドルを停止し、JSDK および HTTP サーバー バンドルをアンインストールすることです。これは、PaxWeb がこの機能を引き継ぐためです。通常、HTTP-root-bundle もアンインストールする可能性が高いですが、このチュートリアルではインストールしたままにします。次のステップに進む前に、必ずパッケージを更新してください。
それで:
PaxWeb をインストールする
2 番目のステップは、PaxWeb から次のバンドルをインストールして開始することです。
- pax-web-jsp-1.0.2.jar (インストール)
- pax-web-jetty-bundle-1.0.2.jar (インストール & 開始)
- pax-web-extender-war-0.8.0.jar (インストール & 開始)
Pax Web
バンドルが正常にインストールされました。
問題
Pax Web
バンドルを開始できません。
HTTP-root-IMP
Knopflerfish バンドルを起動しようとすると、コンソールにこのエラー メッセージが表示されます。
Pax Web
もう 1 つは、Knopflerfishのチュートリアルからバンドルを開始するときです。ここで私は始めようとしましたpax-web-jetty-bundle-1.0.2.jar (OPS4J Pax Web - Jetty Bundle)
:
最後に、pax-web-extender-war-0.8.0.jar (OPS4J Pax Web - Extender - War)
このエラー メッセージを実行しようとすると、次のエラー メッセージも表示されます。
pax-web-jsp-1.0.2.jar (OPS4J Pax Web - Jsp Support)
また、このエラーメッセージが表示された開始しようとしました:
エラー メッセージから私が理解したところによると、バンドルはこれらのパッケージを探していました。これを解決し、OSGi フレームワークを使用して Android で Java Web アプリケーションを正常に実行できる方法はありますか?
osgi - OSGI バンドルの遅延アクティベーション
私はこれ(OSGI)で本当に初めてで、簡単な例をやろうとしています。私は怠惰な行動を働かせることができません。このような問題を解決するブループリント実装がいくつかあることは知っていますが、その実装に進む前に、いくつかの基本を学んでおくとよいと思いました。
OK、コードを変更しましたが、まだうまくいきません。
外部アプリケーション、バンドルのインストール、フレームワークの開始、および DataServiceClient バンドルのみの開始。どのバンドル クラスにもアクセスできません。
これが DataServiceClient の開始です。
「DataService」バンドルの DummyService クラスは次のとおりです。
「DataService」バンドルの開始は次のとおりです。
私が得ている出力:
ただし、次のことを期待しています。
http://www.osgi.org/Design/LazyStartから少し引用
レイジーアクティベーション
レイジー アクティベーションは、バンドルからクラスをロードする要求が最初に成功したときに、バンドルをアクティベートする必要があるライフ サイクル ポリシーです。
ただし、機能しないため、遅延アクティベーションの概念を完全に誤解しているか、何か間違っていると思います。
DataService バンドルの開始を明示的に呼び出さない限り、DataService バンドルの Activator.start を呼び出さないようです。これは私がatmを取得していないものです。
お時間ありがとうございました
java - BundleSignerCondition を正しく使用してキーを管理し、バンドル署名に基づいて安全な OSGI 環境を作成するにはどうすればよいですか?
ここに私の問題があります。バンドル署名に基づいて安全な OSGI (knopflerfish 5.0.0) 環境を作成しようとしています。Conditional Permission Admin サービスを使用し、ポリシー テーブルをポリシー ファイルで更新する管理バンドルがあります。バンドルの場所に基づいたアクセス許可ですべてが正常に機能します。「サンドボックス」フォルダーにあるすべてのバンドルには制限付きのアクセス許可があり、他のバンドルにはすべてのアクセス許可があります。しかし、場所に関係なく、特定の署名を持つバンドルにすべてのアクセス許可を付与したいと考えています。だからここに私のポリシーファイルがあります:
したがって、理論的には、サンドボックス フォルダーにあるバンドルは System.exit() を使用できません。ただし、すべての権限を持つ Orange によって署名されたバンドルは除きます。2 つの同一のバンドルを作成しました。1 つは署名されておらず、もう 1 つはこの識別名 (keytool で作成) で jarsigner によって署名されています。
X.509、CN=Martinelli Bastien、OU=テスト、O=オレンジ、L=メイラン、ST=RA、C=FR (キー)
しかし、System.exit() を呼び出そうとすると、2 つのバンドルがセキュリティ例外をスローします。
BundleSignerCondition でフィルタを変更しようとしましたが、効果がありませんでした。今は、knopflerfish のデフォルトのキーストアの設定などについてだと思います。
何が問題なのか分かりますか?
osgi - OSGi 初期プロビジョニングの実装
Compendium 仕様の Initial Provisioning セクションの実装を探しています。
Apache Felix はそれを提供していないようです。Knopflerfish は、Pro バージョンを提供します。Equinox が 1 つの実装を提供していることがわかりますが、それを Apache Felix 上で実行される OSGi アプリケーションと統合できるかどうか疑問に思っています。
また、Apache Felix がそのような実装を提供しないのはなぜだろうか? コミュニティによって採用されている初期プロビジョニングに代わるものはありますか?
ありがとう、ミカエル
java - OSGI コンテナの識別 Equinox / knopflerfish と Equinox osgi jar と core osgi jar の関係
質問1:-
OSGIを多用するプロジェクトに取り組んでいます。私は OSGI の初心者です。私のプロジェクトでは、分点と knopflerfish およびまたは knopflerfish バンドルの両方に JARS が表示されます。
質問2:-
Equinox と Knoplerfish のうち、OSGI がプロジェクトで使用するコンテナーはどのように決定すればよいですか? OSGI は一度に両方のコンテナーを使用できないと思います。
質問 3:-
このリンクでは、Equinox フレームワークが org.eclipse.osgi_<version>.jar
OSGI コアを実装するために必要であることが言及されています。これは、 OSGI web サイトosgi.core-6.0.0
から、コア OSGI jar を必要としないことを意味します。
舞台裏の春分の瓶org.eclipse.osgi_<version>.jar
はコア OSGI jar を使用していosgi.core-6.0.0
ますか?
org.eclipse.osgi_<version>.jar
Equinox jar はコア OSGI jar のラッパーですかosgi.core-6.0.0
?
org.eclipse.osgi_<version>.jar
Equinox jar とコア OSGI jar の間に関係や依存関係はありますosgi.core-6.0.0
か? それとも、2 つの jar は互いに独立していますか?
質問4:-
Equinox コンテナーを使用しているとします。また、プロジェクトを最新の OSGI バージョンに更新する必要があります。プロジェクトを最新の OSGI jar に更新するには、どの JAR を最新の jar に置き換えますか。
core OSGI jar
[OSGI Web サイト] から最新osgi.core-6.0.0
(OSGI の最新バージョン)に置き換えるか、または分点 jarorg.eclipse.osgi_<version>.jar
を最新バージョンに更新しますか?
java - サーバーサイド Knopflerfish を使用したアプリケーションの展開
Java で簡単な Web アプリケーションを作成しました。クリックするとindex.jspページにボタンがあり、何かを出力するjarファイルのメソッドが呼び出されます。index.jsp は次のようになります。
私の IndexServlet は次のようなものです:
Apache Tomcat でプログラムを実行し、プログラムが実行されているときに Test.jar を変更したい、Test.jar 内のメソッド getMessage() を変更したい。Knopflerfish OSGi でこれを行うにはどうすればよいですか? つまり、Test.jar を別の jar ファイル Test.jar に置き換えますが、新しい Test.jar ファイルの getMessage() は別のものを出力します。
Server-Side Equinox を使用した OSGi Web アプリケーション開発の記事がありますが、knopflerfish にはありません。
osgi - OSGi でサービス参照を削除する必要がありますか?
OSGi フレームワーク Knopflerfish を使用しています。サービスを登録することでバンドルを呼び出して何かを実行できるようになったので、サービスを削除する必要がありますか?
サービスを削除する方法が見つからないためです。「getAllService()」と ServiceTracker.getServices() の長さで BundleContext 内のサービスを確認すると、「ungetService(ServiceReference)」を呼び出してもサービスの総数が増加していることがわかります。
それで、サービスを削除する必要がありますか、それとも「ungetService」で十分ですか? 必要な場合、サービスを削除するにはどうすればよいですか?
java - NoClassDefFoundError: knopfletfish を使用した com/sun/xml/internal/bind/DatatypeConverterImpl
私は ogsi を初めて使用し、knopfletfish フレームワークでバンドルを実行すると、次のエラーが発生します。
なぜこれが起こっているのかわかりません。すべてのjabxb jarを参照しましたが、別のjdk7バンドルを操作するためにjdk8をjdk7で変更したために発生したと言うことが重要かもしれません.
これは、例外がマークされているクラスです。