問題タブ [android-binder]

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.

0 投票する
2 に答える
36911 参照

android - Android Java バインダーは BINDER TRANSACTION に失敗しましたか?

サービスから画像をダウンロードしてアクティビティに表示しようとしていますが、取得し続けます

これは私のサービスコードです

}

圧縮機能

私の活動

コードの問題は何ですか。活動が始まらない。

アプリはクラッシュしていません。これはlogcatでのみ取得します:

それはおそらく、私が推測する大きなビットマップが原因です。

0 投票する
1 に答える
355 参照

android - プロセス間でアクティブ オブジェクトを共有する正しい方法は何ですか?

2 つのプロセス間でアクティブなオブジェクトを共有することを検討していますが、それに関するドキュメントはしばしば光沢がなく、間違っていることさえあります。

具体的には、パーセルを介して Binder オブジェクトを共有することを検討していました。ドキュメントの状態。

アクティブなオブジェクト

Parcel の珍しい機能は、アクティブなオブジェクトを読み書きできることです。これらのオブジェクトの場合、オブジェクトの実際の内容は書き込まれず、オブジェクトを参照する特別なトークンが書き込まれます。パーセルからオブジェクトを読み取るとき、オブジェクトの新しいインスタンスを取得するのではなく、最初に書き込まれたオブジェクトとまったく同じオブジェクトを操作するハンドルを取得します。使用可能なアクティブ オブジェクトには 2 つの形式があります。

Binder オブジェクトは、Android の一般的なクロスプロセス通信システムのコア機能です。IBinder インターフェイスは、Binder オブジェクトを使用して抽象プロトコルを記述します。そのようなインターフェースはすべてパーセルに書き込むことができ、読み取ると、そのインターフェースを実装する元のオブジェクト、または元のオブジェクトへの呼び出しを通信する特別なプロキシ実装のいずれかを受け取ります。使用するメソッドは、writeStrongBinder(IBinder)、writeStrongInterface(IInterface)、readStrongBinder()、writeBinderArray(IBinder[])、readBinderArray(IBinder[])、createBinderArray()、writeBinderList(List)、readBinderList(List)、createBinderArrayList() です。 .

ただし、パーセルを受け取ったときに返されるオブジェクトは単なる BinderProxy であり、元のクラスにキャストしたり、基本的な IBinder 呼び出し以外の呼び出しを実装したりすることはできません。これは明らかにドキュメントで言及されているプロキシ オブジェクトですが、同じステートメントでほのめかされた元のオブジェクトを参照するためのメソッドが何であるかを知りたいと思っていました。

また、このトピックがより完全に説明または文書化されているソースがあるかどうかも疑問に思っていました.

0 投票する
1 に答える
1102 参照

android - Android システムによるバインダー トークンの使用

このブログ投稿で、Android システム内での Binder トークンの使用について読んでいます。トークンを使用して同じアプリケーションからの後続のリクエストを識別するウェイクロックに関連する例を見ました。

Android システムでUIDは、アプリケーションからの後続のリクエストを追跡するのに、呼び出し元のアプリケーションの が十分でないのはなぜですか? アプリケーションを識別するという点で、UID ができないことをバインダー トークンが満たす必要はありますか?

0 投票する
1 に答える
65 参照

android - バインダー クラスを継承する別のクラスを使用して BoundServices にアクセスするのはなぜですか?

バインドされたサービスは、アクティビティまたはコンポーネントがそれを必要とするまでのみ存続することを知っています。onBind 関数から MyLocalBinder クラスを呼び出す必要があります。なぜそうなのですか?直接呼び出せないのはなぜですか?

0 投票する
1 に答える
5657 参照

android - C++ を使用した Android でのネイティブ バインダーの理解と実装

Android でバインダーを使用して単純な IPC メカニズムを実装したいと考えています。そのために、インターネットで検索したところ、これを見つけまし。コンパイルしたところ、Android デバイスで正常に動作しました。AOSP で各クラスを検索して、プログラムの全体像を把握しようとしましたが、すべてが難しくなり、めちゃくちゃになりました。コメントを追加して、将来の訪問者にも役立つように、誰でも説明してください(大まかなレベルです)。そこから取られたコードは次のとおりです。

0 投票する
1 に答える
1649 参照

android - メッセンジャーまたは AIDL を使用した高速 IPC

リモート サービス (~40,000/秒) と高速に通信するプログラムを Android で作成しようとしていますが、すべての Android IPC はこのタスクを達成するには不十分なようです。私の最初の試みは、標準の Messenger システムを使用したもので、1 秒あたり約 2,000 回を超える処理ができませんでした。同様に悪いのは、断続的なラグで中断されているように見えることでした。

MainActivity (メッセンジャーでテスト)

RemoteService (メッセンジャーでテスト)

2 回目の試みは AIDL で行われました。これは IPC 用のバインダーも実装しますが、オーバーヘッドが大幅に少ないと想定しました。ただし、AIDL はメッセンジャーよりも大幅に効率的であるとは言えず、吃音の問題も解決しませんでした。

MainActivity (AIDL でテスト)

RemoteService (AIDL でテスト)

これらのケースのいずれかで、私が〜5,000/秒を超えるのを妨げる何か間違ったことをしていますか? または、私が知らなかった Android IPC 用の別のシステムはありますか?

0 投票する
2 に答える
1298 参照

android - Android: AIDL に代わる安全な IPC?

私がやろうとしているのは、デバイスにインストールされた 2 つのアプリケーション間で軽量で安全なIPC プロトコルを実装することです。Serviceクライアント アプリは、サービス アプリで実行されているコマンドとクエリを送信し、計算結果を受け取ることができる必要があります。

アプリの関係:両方のアプリのソース コードは私の管理下にありますが、アプリの署名は異なります (交渉不可)。

セキュリティ要件:サービス アプリは、そのサービスを単一のクライアントに提供する必要があります。クライアントのアプリケーション ID (パッケージ名) は既知で一定です。

試したこと:双方向Messenger通信方式で IPC を実装しようとしました (このブログ投稿と同様)。このアプローチは問題なく機能しますが、大きな問題が 1 つUIDあります。クライアントを取得する方法が見つからないため、セキュリティ要件を満たすことができません。

Serviceサービス アプリケーションの次のコードについて考えてみましょう。

ここでの考え方は、クライアント アプリがメッセージを thisServiceに送信するときに、ローカルの「コールバック」MessengerreplyTosent のメンバーに入れるというものMessageです。次の状態のドキュメントMessenger:

注: 下の実装は、通信を実行するために使用される Binder の単純なラッパーです。

だから私はどうにかして返されたBinderMessenger#getBinder()をクライアントのUIDにマップできると思っていましたが、現在問題が発生しています:

  1. Messenger#getBinder()キャストできないIBinderを返しますBinder
  2. クライアントの への参照を取得できたとしてもBinder、メソッドBinder#getCallingUid()static引数を受け入れません...

したがって、この特定の実装を安全に機能させるには、クライアントによって作成された特定のコンテンツまたは特定UIDのコンテンツに基づいて呼び出し元を取得する方法を見つける必要があります。Android のセキュリティ アーキテクチャは を中心に構築されているため、(またはパッケージ名) へのマッピングへの直接的なアプローチがないのは奇妙に思えます...では、どうすればこれを行うことができますか?MessageMessengerBindersBindersUIDs

おまけの質問: AIDL を除いて、Android で上記の要件を満たす IPC 手法は他にありますか?

0 投票する
1 に答える
336 参照

android - Service または Binder オブジェクトを使用して Service 内に変数を設定する

バインダー オブジェクトを使用するか、サービス クラス オブジェクト自体を使用して、変数 int[] を設定できます。コードはpublic class MyActivity extends Activity.どちらにありますか、どちらも機能します:

Service int[] 配列は、次の 2 つの方法で設定できます。