2012-04-18 6 views
2

私はネイティブ部分以上の層からなるアプリケーションを持っています。 層。アプリケーションにルート特権を与えます

したがって、一部の ネイティブ関数を実行するには、ルート特権を与える必要があります。

私が前に記事を書いたので、私はBluez Utils(hidd.c)から取ったコードを追加しました。

if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 
    close(sk); 
    return -1; 
    } 

コードはNDKによって.soになるように構築されています。

残念ながら、それは-1を返し続け、errnoは13であり、これは 許可が拒否されたことを意味します。

このアプリケーションには十分な権限がないため、 エラーが発生したという経験豊富な開発者(ありがとうございました)があります。

それは

プロセスプロセス= Runtime.getRuntime()のexec( "SU")のようなものに、 "ない(SHOULD NOT)"。

あなたはシステム許可を持っていますが、あなたの アプリケーションはdoesntだと思います。 (私が間違っている場合は教えてください)

ルート権限を持っていることをアプリに許可する方法はありますか?

すべての返信/ヒント/ヒントを高く評価します。

Regards-

サム

+0

と思わないでしょう。 あなたは根っこのデバイスだけでそれをすることができます。 –

+0

はい、私の電話は完全に根付いています。 – Sam

+0

私のソリューションを試しましたか? –

答えて

1

私はこれをお手伝いできると思います。

ここGOOO ...

void gainRoot() 
{ 
    Process chperm; 
    try { 
     chperm=Runtime.getRuntime().exec("su"); 
      DataOutputStream os = 
       new DataOutputStream(chperm.getOutputStream()); 
      os.writeBytes("chmod 777 /dev/video0\n"); 
      os.flush(); 

      os.writeBytes("exit\n"); 
      os.flush(); 

      chperm.waitFor(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

これは私が通常のルートファイルのパーミッションを変更するために使用する機能です。

suを実行すると、root権限で新しいプロセスが作成されます。このプロセスを使用すると、ルート操作を行うことができます。いくつかの具体的な構文があります。上記の例に示されています。

あなたができることの1つは、コードのバインド部分を別個の実行可能ファイルとしてビルドし、システム/ binまたは通常の実行可能ファイルが保存されている場所に配置することです。実行可能ファイルの名前は、次にbind123代わりに

  os.writeBytes("chmod 777 /dev/video0\n"); 
      os.flush(); 

上記のコードで

  os.writeBytes("bind123\n"); 
      os.flush(); 

に置き換えであると仮定する。

これは動作するはずです。おそらくこれが機能していれば、実行可能ファイルに依存せずにアプリケーションと統合することができます。私はあなたを混乱させないことを願っています。もしすべての明快さが必要なら、私に知らせてください....すべて最高です...

+0

私はそれを少し後で与えます。私はあなたのコンセプトを理解しているようですが、あなたが言及したように、私のアプリケーションにそれを統合してルート権限を得る方法はまだわかりません。あなたのアプローチをまず試してみます。 – Sam

+0

私の知る限りでは。アプリケーションは常にデフォルトでユーザーモードで実行されます。通常のLinuxでさえ、このようなものです。 suを実行すると、UID 0の新しいプロセスが作成されます。つまり、root previlagesを持つカーネルプロセスです。このプロセスを使用して、特権タスクが実行されます。 Android Appでこれまでやっていることと同じことです。あなたのアプリケーション全体にroot権限が必要な場合は、利用可能なサポートがあると思いません。 –

+0

こんにちはhappy2Help、私の場合、bind()は私が私のブルートゥースと対話するために使用できることを望んでいたシステムコールです。しかし、私のコードがbind()に実行されるとき、エラーは許可が拒否されたことを示します。このドキュメントでは、このエラーについて「このプロセスは、socket_descriptorが指すソケットにlocal_addressをバインドする適切な特権を持っていません(たとえば、socket_descriptorがAF_INETのアドレスファミリを持つソケットであり、sockaddr_in構造体to local_address)は、使用が制限されているポートを指定しました。 – Sam

0

あなたはポート> = 1024にバインドするルートは必要ありません。 ApplicationManifest.xmlファイルには、INTERNETのアクセス許可が必要です。

+0

このコードはBluetooth用に実装されています。インターネット目的ではありません。 – Sam

関連する問題