14

jni経由でlibusbを使用するアプリケーションを開発しています。このアプリケーションは現在、ルート化された USB ホストの Android 3 以降のマシンのみを対象としています。

シナリオは次のとおりです。

<java Activity>
       loads <jni_wrapper.so>
               which wraps <my_main_lib.so>
                       that uses <libusb.so>
                               that needs rw access to: /dev/bus/usb/<device>

すべての .so ネイティブ ライブラリは、/system/lib に (ルートとして) インストールするインフラストラクチャの一部であり、単純なユーザーが実行する Java アクティビティで使用できます。

つまり、USB 通信全体をネイティブ側から行う必要があります。

USB パーミッション: /dev/bus/usb/ エントリのデフォルトのパーミッションは (0660, uid= root, gid= usb) です。

明らかに、ネイティブ コードを実行する標準の Java プロセスは上記の要件のいずれも満たしていないため、対応する /dev エントリを "chmod 666" して、これを機能させる必要があります。

ただし、このソリューションはあまり良くありません。再起動、またはデバイスの取り外し/再接続に耐えられないためです (権限は 0660 に戻ります)。

私が探しているソリューションは、次のことを行う必要があります。

  • 再起動/再接続に耐える
  • root によって ~1 回 ~ インストールされ、アクセス許可を取得するたびにユーザーを煩わせる必要はありません
  • 汎用的であり、すべての (/ほとんどの) android 3+ マシンで実行されます
  • [必須ではありません] 必要最小限の認証情報を提供します

私が考えた方向:

  • /init.rc または /ueventd.rc の権限を変更する --> 再起動するたびに両方とも上書きされる
  • usbfs /proc/bus/usb を devmode=0666 でマウント --> 再プラグしても存続しますが、再起動はしません
  • 私のプロセスを「usb」グループに参加させますか? --> android.permission.ACCESS_USB を試しましたが、動作/サポートしていません... :/

何か案は?:-)

ありがとう!

4

4 に答える 4

2

私は同じ問題を抱えており、ndkでこれを実行して解決し、ケースでusbがマウントされている場所に/ proc/bus/usbを変更します。それが役に立てば幸い。

r = system("su -c \"chmod -R 777 /proc/bus/usb/\"");
if(r!=0) {
    LOGD("Could not grant permissions to USB\n");
    eturn CANT_GRAN_PERMISSION_USB;
}
于 2011-10-28T12:52:20.683 に答える
1

デバイスをルート化せずに解決策を見つけました。

Android 4.2.2 カーネル バージョン 3.3.39 でテスト済み

アプリケーションを「usb」グループに追加するだけです。

root がなければ、/system/etc/permissions/platform.xml の権限ファイルを使用できます

「android.permission.CAMERA」など、使用しない権限を 1 つ選択します。

/system/etc/permissions/platform.xml を次のように変更します。

<permissions>
...
    <permission name="android.permission.CAMERA" >
        <group gid="camera" />
    </permission>

    <permission name="android.permission.CAMERA" >
        <group gid="usb" />
    </permission>
...
</permissions>

したがって、アプリケーションのマニフェスト ファイルに追加<uses-permission android:name="android.permission.CAMERA" />して、libusb でアクセス可能な USB をお楽しみください。

于 2014-06-04T08:44:19.553 に答える
1

編集:

質問を読み直したところ、ホスト マシンが Android を実行していると誤解していたことは明らかです。Android には udev が存在しないため、以下の回答は質問への回答ではありません。Android以外のLinuxホストPCでAndroidデバイスを認識させる方法に関する情報を誰かが探している場合に備えて、この回答をここに残しておきます。

編集を終了

これらのドライバー (/dev/bus/usb/###/###) のデフォルトのパーミッションは、udev によって決定されます。具体的には、/etc/udev/rules.d および /lib/udev/rules.d 内の構成ファイルを番号順に解析して、デフォルトを決定します。

デフォルトをオーバーライドするには、独自の udev .rules ファイルを作成する必要があります。そのためには、アクセス許可を付与するデバイスのベンダー ID が必要です。lsusb は、特定のデバイスのデバイス ID を出力します。すべてのベンダーのリストが必要な場合は、これを試すことができます。

したがって、/etc/udev/rules.d/99-android.rules ファイルで、サポートするベンダーごとに次の行に入力します。

SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", MODE:="0666"

上記のリンクの例では、:= の代わりに = を使用し、ATTRS の代わりに SYSFS を使用していることに注意してください。理由はわかりませんが、私のマシンではそのファイルが逐語的に機能しないことがわかりました。

ファイルを書き込んだ後、

restart usbserial 

デバイスを再接続します。これで、デフォルトで 666 のアクセス許可になります。

于 2011-12-06T23:13:15.113 に答える