問題タブ [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.
android - 新しいバージョンの AIDL サービスを開始し、現在実行中の古いバージョンを停止する方法
必要なものは、Android で AIDL インターフェースを適切にアップグレードする方法と非常に似ていますか? 質問ですが、インストール後に新しいバージョンの AIDL サービスを起動し、古いバージョンを停止することも望んでいます。簡単に言えば、最新バージョンが常に実行中のバージョンである必要があります。(もちろん、新しいバージョンの後方互換性は維持されます。)
詳細に、次のように言いましょう。
- Android アプリ A のコードには古いバージョンの AIDL サービスが含まれています (また、マニフェストに特別なリモート プロセスとして記述されています)。
- アプリ B は、ユーザーがインストールしたばかりの新しいバージョンの AIDL サービスを含むアプリです。
アプリ B がインストールされると、両方のアプリのプロセスと AIDL サービスのリモート プロセスをプログラムで強制終了します。その時点以降、新しいアプリ B に含まれる AIDL サービスを起動しようとして何をしても無駄であり、古いバージョンは常に再起動されます (古いアプリ A をアンインストールしない限り)。
興味深いことに、両方のアプリがインストールされているだけで、古いバージョンの AIDL サービスが以前に開始されたことがない場合は、特に新しい AIDL サービスを開始する (新しいアプリからサービスにバインドする) ことができます。これは、古いアプリ A を起動し、アプリ B 内で新しいバージョンの AIDL サービスを開始できることを意味します。古いバージョンの AIDL が過去に少なくとも 1 回実行されている場合、それは、将来何があっても(デバイスを再起動した後でも)Androidが常に起動するものになります!
java - ライブラリ プロジェクトのサービスとバインダーを使用する
私は現在、ラジオストリーミングアプリケーションに取り組んでいます。作業を行うために、コードのリファクタリングを行うライブラリ プロジェクトを作成することにしました。
したがって、私のライブラリプロジェクトには次のものがあります:
- StreamingService.java
- StreamingPlayerMP.java
- StreamingPlayerAAC.java
- StreamingCallback.java
- StreamingNotification.java
- StreamingState.java
- StreamingStation.java
ライブラリ マニフェストとアプリケーション マニフェストの両方でサービスを定義する必要がありますか?
ライブラリ マニフェストとアプリケーション マニフェストの両方にアクセス許可を設定する必要がありますか?
現在、Service/players/callbackを使用する準備ができています。ServiceConnectionとメイン アクティビティへのバインダーを使用してサービスを管理したい:
そしてバインダーメソッド(サービスにあります):
サービスは foregroundservice です:
あなたが完全な解決策を持っているなら、あなたは大歓迎です! アドバイスも大歓迎
android - インテントへのバインダー ドライバーの関与 (IPC の一種)
Android アプリのすぐに使用できる分析を行う予定です。つまり、Android QEMU エミュレーターでアプリを実行し、仮想マシン イントロスペクション (VMI) を実行してアプリの動作を監視します。この目的のために、QEMU エミュレーターをインストルメント化し、アプリの Linux システム コールと Binder IPC を監視しました。
ただし、低レベルの操作を監視しているため、インテントを使用して実行されるプロセス間通信を監視できるかどうかはわかりません。バインダー ドライバーまたはインテントとのインテント トークは Java API レベルで動作しますか。
android - ParcelFileDescriptor.createPipe() を使用して (プロセス境界を越えて) 別のサービスに InputStream を転送すると、「EBADF (Bad file number)」で失敗します。
ある Android サービスから別のプロセス内で実行されている別のサービスに InputStream を「送信」しParcelFileDescriptor.createPipe()
たいBinder IPC を使用。
コードの送信 (プロセス A)
特定の InputStream を受信側サービスに送信したい:
ParcelFileDescriptorUtil はヘルパー クラスであり、従来java.io.
のストリームからストリームへのコピー Thread:
サービスコードの受け取り(プロセスB)
受信サービスの.aidl
:
プロセス A によって呼び出される受信サービス:
しかしin.read()
、inputStream()
常にスローされますIOException
read()
ファイル記述子が閉じられると、EBADF errno が設定されるようです。しかし、何が原因で、どのように修正すればよいのかわかりません。
そして、はい、ConentProvider も可能性があることを知っています。しかし、それは私のアプローチでも機能するべきではありませんか? Android で InputStream ストリームを別のサービスに渡す他の方法はありますか?
余談ですが、CommonsWare は ContentProvider を使用して同様のプロジェクトを作成しました(関連する SO の質問1、2 )。私のアプローチのアイデアのほとんどはそこから得たものです
android - Facebook API はデバイスでは失敗するが、エミュレーターでは失敗する
Facebook 2.0 アプリを持っていて、3.0 にアップグレードしようとしています。新しい SDK をダウンロードしましたが、Samsung S3 または Note デバイスでサンプル アプリを実行しようとすると、アプリに応じて次のいずれかのエラーで失敗します。
奇妙なことに、エミュレーターを介してテスト アプリを実行しようとすると、アプリが動作します。一部のメーカーがデバイスに付属の Facebook アプリを変更しているという投稿をいくつか読んだので、これが問題である可能性があると考えています。誰かアイデアを持っていますか、それともあなたの誰かにこれが起こったことがありますか?
android - アクティビティの起動時に FAILED BINDER TRANACTION が発生する
私の問題は、このスタック ポスト ( Android リモート メソッドのデータ制限) に関連している可能性があると思います。返されるデータのサイズのみが 661KB であり、記事ではバインダーが 1MB をサポートできると述べています。
状況は次のとおりです。単一のパラメーターを受け取り、パイプで区切られた文字列と整数値の配列リストを返す Web サービスを呼び出す非同期タスクがあります。次に、これらの値を取得して、JAVA 配列リストに挿入します。小規模なデータセットでは、これはうまく機能します。より大きなデータセット (つまり、この 661KB のデータセット) では、以下のエラーが発生します。
ログキャット:
実行中のコードは次のとおりです。
インテントが開始されると、新しいアクティビティには到達しません。onCreate に LOG.i があり、ヒットすることはありません。プロシージャ コールはタイムアウトしません。返されるデータが少ないこの同じコードを試しても、エラーは発生しません。つまり、非同期タスクにデータを返すステートメントに SELECT TOP 100 を置くと、まったく問題ありません。
私の質問はこれだと思います-返されるデータが1MB未満の場合、なぜこれがエラーになるのですか? 1MB の制限が原因である場合、この制限を回避するか、返されるデータを何らかの方法で圧縮するために他にできることはありますか?
意図した設計は、この最初の呼び出しが名前とそれらの名前に関連付けられた予定を戻すことです (パイプで区切られています)。スピナーに名前だけの個別のリストを表示します (arraylist から取得)。ユーザーがスピナーの名前をクリックすると、その名前に関連付けられたすべての予定を表示する新しいアクティビティが開始されます (すべてのデータは最初の arraylist から取得されます)。すべてのデータは最初の非同期タスクで収集され、操作されています。これは、Web コールの量を減らすために行われました。このタスクは 2 つの Web サービス呼び出しで実行できるので、それが答えであれば問題ありません。Web サービス呼び出しを制限し、ユーザーの待ち時間を短縮できるように、別の方法やより良い方法があればいいのにと思っていました。
android - AIDL の「一方向」リモート呼び出しの順序保証は何ですか?
「 oneway 」キーワードでマークされた AIDL メソッドとインターフェイスは、リモートプロセスの非同期 Binder 呼び出しであり、呼び出しの順序は保証されないと言われています。一方、このスレッド ( https://groups.google.com/forum/#!topic/android-developers/FFY-hg2Jx0M ) の Dianne Hackborn (Binder の作成者) の最後のコメントは次のように述べています。
「配信の順序はターゲットオブジェクトに関連付けられています(したがって、異なるインターフェイスで順不同で呼び出しを受け取ることができます)」
これは、同じインターフェイスへの呼び出しが順序を維持していることを示唆しているようです。
誰でもこれを明確にできますか?
android - Android IPC と service_manager
すべての Android IPC は service_manager を通過しますか? アプリケーションはサービスやインテントとどのようにやり取りしますか?
すべてのメッセージはプロキシとして service_manager を通過しますか? またはアプリケーションは直接「話す」ことができますか?
android - Android のブロック インテント
私のアプリケーションは、他のアプリケーションからのインテントをブロックできますか? 特定のアプリからのリクエストをブロックしたいのですが、
どうすればできますか?AOSP にアクセスできるので、ブロック メカニズムを追加できるコードの場所を知りたいのですが。
たとえば、ブラウザから届いたもの (URL のコピーなど) を特定のアプリケーションと共有することを拒否したいと考えています。
インテントがアクティビティ マネージャーに送信され、アクティビティ マネージャーがそれを関連するアプリケーションに配信することがわかります。下位層でリクエストの発信元を知るにはどうすればよいですか?
例: am start -a android.intent.action.SEND -d "some message" -t text/plain シェルに表示されます: Starting: Intent { act=android.intent.action.SEND dat=some message typ= text/plain } I/ActivityManager( 309): START u0 {act=android.intent.action.SEND dat=some message typ=text/plain flg=0x10000000 cmp=android/com.android.internal.app.ResolverActivity} からピッド 1149
元のプロセスが 1149 であることを下位層で知るにはどうすればよいですか? バインダーで、アクティビティ マネージャーである 309 からの要求であることを確認しました。プロセス 1149 をブロックしたいと思います。AOSP は変更できますが、どこで変更できるかわかりません。