武藤です。
だいたい思ったとおりの実装ですね。
どのみち危険ではあると思うのですよ。
まず現状のandroid osの実装ではforkを禁止していないけれど、いつ
禁止されるかわからないのがひとつ。
またはuninstall時に、該当プロセスの子プロセスを皆殺しにするように
いつされるかわからないのがひとつ。
あと、どうやって監視プロセスが綺麗に死ねるかという問題。
親プロセスが先に死んでるから子はzonbe化しませんか?
コールスタックは綺麗に巻き戻るわけにいかないので、exitしているのかな?
そうすると何かグローバルなリソースをリークさせたりしませんか?
心配事が尽きません。
では。
(2014/05/02 10:58), masa wrote:
> 返信ありがとうございます。
>
>> たぶん、ひとつの.apkの中に、本来の仕事をする部分と、uninstallを監視する
>> 部分とで分かれていて、forkした後execしないという方針なのではないかと
>> 思うのですが違います?
>
> はい、apkの本来の機能は社内の資産管理を行うアプリなので、ユーザが自分からアプリをアンインストールした場合に、
> その情報をサーバに通知する必要があります。
>
> 実装部分のコードは以下になります。(大分省いていますが・・)
> 起動時に1回呼ばれfork後に作成された子プロセスが常時アンインストールを監視します。
>
>
> pid_t pid = fork();
>
> if (pid == 0) {
>
> //forkで子プロセスとして実行される
>
> int fd = inotify_init();
> if (fd < 0) {
> return false;
> }
>
> //監視対象のディレクトリ(自分自身)を指定
> int wd = inotify_add_watch(fd, "data/data/hogehoge", IN_DELETE);
> if (wd < 0) {
> return false;
> }
>
> void *p_buf = malloc(sizeof(struct inotify_event));
> if (p_buf == NULL) {
> return false;
> }
>
> //アンインストールされるまで待機
> size_t readBytes = read(fd, p_buf, sizeof(struct inotify_event));
> free(p_buf);
>
> inotify_rm_watch(fd, IN_DELETE);
>
>
> //ここにアンインストール時に行いたい処理を追加
> }
>
>
> 一応手持ちのNexus7では成功したのですが、実運用で全端末でテストした場合にアンインストールの検知ができない、
> もしくは、アプリ(親プロセス)が落ちる端末が出ることを懸念しています。
>
>
>
>
> 2014年5月2日金曜日 0時07分05秒 UTC+9 TM:
>>