問題タブ [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.
c - ストロングポインターとウィークポインターとは
「強いポインター」と「弱いポインター」の概念に混乱しています。ダイアン・ハックボーン自身は次のように述べています。
強いポインターがある間、オブジェクトは残ります。最後のものが解放されると、それは破棄されます。弱いポインターでできることは、比較して強いポインターに昇格しようとすることだけです。オブジェクトに他の強力なポインターがない場合、後者は失敗します。
これは私には非常に不明確です。ストロング ポインターは ( boost::
) 共有ポインターと同等ですか? また、自分自身を強いポインターに昇格させようとするだけの場合、弱いポインターの役割は何ですか? 同様に、弱いポインターと強いポインターが必要になるのはいつですか?
アップデート:
sp
皆様ありがとうございます。具体的には Android のカーネルとについて質問wp
しています。それらは Java のリファレンスとはまったく関係ありません。
基本的に私はここでコードをクラックしようとしていますhttp://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.htmlsp
と
の使用を本当に理解していませんwp
アップデート:
実際の答えは、受け入れられた答えのコメントにあります。Gabe Sechan に感謝します。
ストロング ポインターとウィーク ポインターは異なるスマート ポインターの実装であり、ほぼ同じことを行います。ポインターがスコープ外になると、少なくとも 1 つのストロング ポインターがそれを参照している限り、ポインターは解放されません。弱いポインターのみが参照する (または何も参照しない) 場合は、そうなります。それへの強参照または弱参照がスコープ解除されるたびに、チェックが行われます。
同じオブジェクトを参照する 10 個の弱いポインターがあり、それらの 10 個のうちの 1 つが範囲外になると、オブジェクトは破棄されますか? 一方、強力なポインターでは、10 個すべてがスコープ外になった場合にのみ、オブジェクトが破棄されますか?
はい、ほとんどです。10 個のウィーク ポインターしかない場合、最後のストロング ポインターが範囲外になったときに、おそらく既に範囲外になっているでしょう。予備のメモリがあれば、実装によってもう少し長く存続できるかもしれませんが、メモリが不足した状態になると、実装が彼女の引用から進んでいるようには思えず、チョップされます. そして、これの使用は依然として主にキャッシングです。これは、boost shared_ptr および boost weak_ptr とほぼ同等です。したがって、基本的に、弱いポインターは、参照するオブジェクトをいつでも削除できます。
android - AOSP で、ServiceManager が実装されている場所
IServiceManager.cpp
ファイルには、BnServiceManager::onTransact
関数定義が表示されます。
その関数内で、" addService
"、" listServices
" などの呼び出しがあります。
これらの関数 (IServiceManager で宣言されている) の実装が見つかりませんでした。
BnServiceManager の実装の場所を教えてください。
android - Google が Android カメラで C/S アーキテクチャを選択したのはなぜですか?
ご存知のように、Android カメラはクライアントとサービスを含む C/S アーキテクチャです。それらはバインダーによって相互に通信します。それらは異なるプロセスで実行されています。
だから私は質問があります:なぜAndroidカメラにはクライアントとサービスがあるのですか? 利点は何ですか?
java - AIDL(Android)を使用してプロセス全体でエラーを処理するための推奨されるアプローチ
異なるプロセスに存在するバインダーサービスとクライアントがあります。AIDLを使用すると、クライアントがリモートバインダーサービスを呼び出すときに、エラー(例外)をクライアントに中継する必要がある場合があります。
しかし、私の理解では、これは不可能です。バインダーサービスから「RemoteException」をスローして何が起こるかを確認しようとしましたが、
キャッチされていないリモート例外!(例外はまだプロセス間でサポートされていません。)
私のlogcatで。
これは不可能のように思われるので、クライアントにエラーを通知するための最良のアプローチは何ですか?AIDLを変換して、エラーコード(成功した場合は0)を返すCスタイルのインターフェイスを使用できると思っていましたが、これは見苦しいです。
より良いアプローチはありますか?
android - Android Binder が発信者 ID を消去しています
最近、ソース コードを読んだところ、 IPC 呼び出しAndroid
を実行するときに常にメソッドのペアが呼び出されることがわかりました。Binder
コメントを読みましたが、根本的な理由がはっきりとわかりません。メソッドのペアは次のとおりです。
そのメソッドのペアの機能を知っている人はいますか? 許可に関係しているようです。
android - putExtra: 大きな配列はどのように処理すればよいですか? データベースにするか、小さな配列に分割しますか?
次のアイデアのどれがより多くの文を作るのか知りたいです:
5,000 を超えるエントリを持つ 3 つの配列があります。そして、それらを Extra に入れようとすると、FAILED BINDER TRANSACTION になりました。
これらの大きな配列をより小さな配列に分割し、putExtra によって次のアクティビティに渡します
これらのエントリをデータベースに保存し、sqllite とカーソルを操作しますか?
前もって感謝します!
android - AIDL を介してサービス間でアクティブ オブジェクトを渡す
異なるパッケージのいくつかのサービスで共通のオブジェクトを共有しようとしています。各サービスは同じオブジェクトを呼び出す必要があります。
たとえば、サービス A (APK A から) がカスタム オブジェクトをインスタンス化し、サービス B と C (APK B と C から) がこのオブジェクトの参照を取得して、そのメソッドを呼び出すようにしたいとします。
Android リファレンスで、 Parcelを使用することで可能であることがわかりました。
アクティブなオブジェクト
Parcel の珍しい機能は、アクティブなオブジェクトを読み書きできることです。これらのオブジェクトの場合、オブジェクトの実際の内容は書き込まれず、オブジェクトを参照する特別なトークンが書き込まれます。パーセルからオブジェクトを読み取るとき、オブジェクトの新しいインスタンスを取得するのではなく、最初に書き込まれたオブジェクトとまったく同じオブジェクトを操作するハンドルを取得します。使用可能なアクティブ オブジェクトには 2 つの形式があります。
Binder オブジェクトは、Android の一般的なクロスプロセス通信システムのコア機能です。IBinder インターフェイスは、Binder オブジェクトを使用して抽象プロトコルを記述します。そのようなインターフェースはすべてパーセルに書き込むことができ、読み取ると、そのインターフェースを実装する元のオブジェクト、または元のオブジェクトへの呼び出しを通信する特別なプロキシ実装のいずれかを受け取ります。使用するメソッドは、writeStrongBinder(IBinder)、writeStrongInterface(IInterface)、readStrongBinder()、writeBinderArray(IBinder[])、readBinderArray(IBinder[])、createBinderArray()、writeBinderList(List)、readBinderList(List)、createBinderArrayList() です。 .
AIDL を介してオブジェクト (バインダーを拡張する) を渡してこれを実行しようとしましたが、何も機能しません。メソッド createFromParcel(Parcel in) から参照を取得しようとすると、常に ClassCastException が発生します。
私のコードの例:
誰かがすでにそれを行っていますか?
前もって感謝します !
java - Android で AIDL インターフェースを適切にアップグレードするにはどうすればよいですか?
2 つのアプリがあります。1 つはmy-app.apk、もう 1 つはmy-service.apkです。サービス アプリは、いくつかのメソッドを実行するためにプライマリ アプリによってバインドできる単一のAndroid Serviceを定義するだけです。これは AndroidのAIDLインターフェースを使用して行われ、これまでのところうまく機能しています。
サービスのインターフェースを変更したいのですが、何に気をつければいいのか悩んでいます。my-service.apkの IRemote.aidl ファイルを次のように変更しました。
好奇心から、my-app.apk の IRemote.aidlを次のように変更しました (違いに注意してください!)。
今、私は完全に予想外の結果を得ました:
私のアプリケーションからのログ出力は「11」になりました。どうして??
- bindService() 呼び出しでSecurityExceptionが発生するとは予想していませんでしたが、まったく異なるインターフェイスを使用する状況ではこれで十分です。
- 私が期待していたのは、呼び出しの実行時にRemoteExceptionであり、メソッドが使用できないことを示していました。
- 私が完全に期待していなかったのは、異なるデータをパラメーターとして別のメソッドを呼び出すだけだということでした。低レベルの観点からは理解できますが。おそらく彼らは、このインターフェースのパフォーマンスを確保するためにそれを行ったのでしょう...
だからここに私の質問があります:
- 最適なアップグレード戦略は何ですか? 古いメソッドと順序を削除/変更しないでください。
- my-service.apkがアップグレード (再インストール) されると、 my-app.apkのサービスが失われることに気付きました。通常、サービスはシステムによって再スケジュールされます。これは通常、クラッシュ時に行われます。my-app.apkがサービスを再度取得するようにするにはどうすればよいですか? 新しくインストールされたパッケージに注意してください。
よろしくお願いします。:-)
乾杯、マーク