apkに自作実行モジュールを入れる方法

334 views
Skip to first unread message

たろサ

unread,
Feb 15, 2011, 11:48:31 PM2/15/11
to 日本Androidの会
 こんにちは、たろサです。

 できるのであれば教えて欲しいのですが、現在、作成しているアプリでは、
linuxのコマンドを実行することが可能です。
 例えば、下記のようなことが可能です。
os.execute( "dd if=/sdcard/test.dat of=/sdcard/test1.dat" )

 そこで、さらに自作のコマンドを追加したいと思っています。
 NDKを用いて、include $(BUILD_EXECUTABLE)としてndk-buildすると、ビルド
はできました。

 これをroot権限があるマシンなら、適当なところに置いて、前記自作アプリか
ら呼び出せるのですが、root権限が無い場合は、システム側に入れることも実行
権限をつけることも困難です。

 そこで、自作アプリのapkに入れて、インストール時に実行権限付きで展開す
るようなことができないかと考えました。

 このようなことは、可能なのでしょうか。

 可能だとすれば、該当eclipsのプロジェクトのどこに置いて、どういう風に展
開すればできますでしょうか。

 わかる方がいらっしゃれば、教えてください。よろしくお願いします。

--
山本三七男 (Minao Yamamoto) ---------------- ハンドル:たろサ -----
E-Mail: taro...@gmail.com

nagamatu

unread,
Feb 16, 2011, 12:57:19 AM2/16/11
to 日本Androidの会
assetに native binaryを追加し、実行時に自分のパッケージの領域に展開し、
実行権限を付加して呼び出す事は可能です。以下のコードでは busyboxを起動
するようなことをしています。

https://github.com/nagamatu/SetupSU/blob/master/src/com/gmail/nagamatu/setupsu/main.java

--

> E-Mail: taros...@gmail.com

たろサ

unread,
Feb 16, 2011, 1:09:30 AM2/16/11
to android-g...@googlegroups.com
 nagamatu様、

 たろサです。

 ありがとうございます。

 assetsに置いておいて、パッケージ領域に自力展開すればいいのですね。
 了解しました。githubのソースを参考にさせていただきます。

 ありがとうございます。

E-Mail: taro...@gmail.com

たろサ

unread,
Feb 16, 2011, 4:08:10 AM2/16/11
to android-g...@googlegroups.com
 たろサです。

 ソースを参考にさせてもらって、作ってみました。
 ありがとうございました。

--
//**************************************************
// assets/bin以下にあるコマンドを本体フォルダにコピーします。
//**************************************************
private int assetsCopyBin(){
String folder = "bin";
FileOutputStream output = null;
int ret = 0;
String[] cmds = new String[] { "/system/bin/chmod", "755", "" };
try {
Runtime runtime = Runtime.getRuntime();
AssetManager as = getResources().getAssets();
String[] binfiles = as.list(folder);
int n;
int DEFAULT_BUFFER_SIZE = 1024 * 4;
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];

//asset/bin/以下のファイルを /data/data/パッケージ名/files/以下にコ
ピーします
for(int i=0; i<binfiles.length; i++ ){
InputStream is = as.open(folder+"/"+binfiles[i]);
output = openFileOutput(binfiles[i], Context.MODE_PRIVATE);
n = 0;
while (-1 != (n = is.read(buffer))) {
output.write(buffer,0,n);
}
output.flush();
output.close();
is.close();
//パーミッションを設定します
cmds[2] = getFileStreamPath(binfiles[i]).getAbsolutePath();
runtime.exec(cmds);
}
} catch (IOException e) {
e.printStackTrace();
ret = 1;
}
return ret;
}
--

nagamatu

unread,
Feb 16, 2011, 4:31:21 AM2/16/11
to 日本Androidの会
参考にしたコードも悪いんだけど chmodコマンドが /system/binに
存在する保証はないので、PATHをなめてみると問題を起こしにくくな
ります。また、

http://developer.android.com/reference/java/io/File.html#setExecutable(boolean)

なんてあるんですね。

公開されている仕様以外はデバイスによって異なっている可能性があり
ます。

--

> >>https://github.com/nagamatu/SetupSU/blob/master/src/com/gmail/nagamat...
> E-Mail: taros...@gmail.com

たろサ

unread,
Feb 16, 2011, 9:40:41 AM2/16/11
to android-g...@googlegroups.com
 たろサです。

 java初心者なので、変なところで悩んでいるのかもしれませんが、

 File#setExecutable(boolean)。これはいい。と思って、

 getFileStreamPath(binfiles[i]).setExecutable(true);

 としても、.setExecutable(boolean)が出てこないです。

 getFileStreamPath(binfiles[i]).でeclipsさんが候補に出すのは、

 getFileStreamPath(binfiles[i]).setReadOnly();と、
 getFileStreamPath(binfiles[i]).setLastModified(time);くらいです。

 どこを勘違いしているのでしょうか。
 

E-Mail: taro...@gmail.com

たろサ

unread,
Feb 16, 2011, 9:52:53 AM2/16/11
to android-g...@googlegroups.com
 たろサです。

 自己解決しました。

 setExecutable(boolean)は、API Level9 でした。

Tatsuo Nagamatsu

unread,
Feb 16, 2011, 9:53:27 AM2/16/11
to android-g...@googlegroups.com
プロジェクトの Build Targetをチェックしてみてください。
File.setExecutableは API Level 9からのサポートです。

--

2011/2/16 たろサ <taro...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

Reply all
Reply to author
Forward
0 new messages