日付、時間の設定について

3,426 views
Skip to first unread message

timai

unread,
May 13, 2011, 8:01:43 AM5/13/11
to 日本Androidの会
お世話になります。
timaiと申します。

アプリより日時(システム日付)の設定を行おうと思っている所ですが
SystemClock.setCurrentTimeMillis()がroot権限でしか使えないようです。

実際にやってみましたがたしかに「Unable to open alarm driver: Permission」で
設定ができません。

しかし、設定画面の日付と時刻からは変更ができていますが、設定画面からはrootで設定
しているのでしょうか?

ご存じの方いらっしゃいませんでしょうか。

よろしくお願いします。

鷹見純

unread,
May 13, 2011, 10:33:25 AM5/13/11
to android-g...@googlegroups.com
tima様


ご指摘のとおり,いくつかのシステムで用意してあるアプリケーションは,root, system, radio などで稼働します。
たとえば,「設定」を起動しているときに,adb shell ps として確認すると,

USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
system    335   33    92828  24476 ffffffff afd0c51c S com.android.settings

のように,ユーザがsystemであることがわかります。
われわれの作成するアプリケーションは,通常の方法ではユーザ以外のオーナにはなれません。

また,ほとんどのデバイスは,ユーザではアクセスできないようにしてあります。

by 鷹見



飯塚康至

unread,
May 13, 2011, 10:57:51 AM5/13/11
to android-g...@googlegroups.com
お世話になります。飯塚です。

設定関係は非公開のAPIを使っているかもしれません。
(すみません、時刻の設定は調べていません)
ソースを見ると分かるかもです。

時刻だけ設定したい場合は公開NTPを使って、ネット越しでもOKだと思います。

2011年5月13日21:01 timai <t_i...@bun.bbiq.jp>:

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

--
以上、宜しくお願いします。

飯塚 康至

大垣憲俊

unread,
May 13, 2011, 2:48:06 PM5/13/11
to android-g...@googlegroups.com
timaiさん

大垣です。

>しかし、設定画面の日付と時刻からは変更ができていますが、設定画面からはrootで設定 
>しているのでしょうか? 

たしかに、エミュレータの設定画面の日付と時刻からは変更ができますね。

調べたら脆弱性を暴露することになるかも思いましたが、しかし考えてみれば、
実際の携帯電話に組み込まれる際には、root権限が奪取できる状態にはしない
(たとえば、/systemディレクトリにはアクセスできない)対策が取られているので。
それで、結論が出せたわけではないのですが、いくつか気づいたことをお知らせしておきます。


/android-2.2_r1.3/packages/apps/Settings の Android.mk には、

LOCAL_CERTIFICATE := platform

の1行があります。
次に、AndroidManifest.xml には android:sharedUserId があります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

        package="com.android.settings"

        android:sharedUserId="android.uid.system">


さらに、eclipse の ddms パースペクティブから見ることのできるファイル一覧に
/system/etc/permissions/platform.xml があり、その中を抜粋すると、たとえば、

   <assign-permission name="android.permission.WRITE_SETTINGS" uid="shell" />

   <assign-permission name="android.permission.WRITE_SECURE_SETTINGS" uid="shell" />


との記述があります。
それと、/data/system/accounts.db というDBファイルがあり、そのテーブル定義は

CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE accounts ( _id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, type TEXT NOT NULL, password TEXT, UNIQUE(name,type));
CREATE TABLE authtokens (  _id INTEGER PRIMARY KEY AUTOINCREMENT,  accounts_id INTEGER NOT NULL, type TEXT NOT NULL,  authtoken TEXT,  UNIQUE (accounts_id,type));
CREATE TABLE grants (  accounts_id INTEGER NOT NULL, auth_token_type STRING NOT NULL,  uid INTEGER NOT NULL,  UNIQUE (accounts_id,auth_token_type,uid));
CREATE TABLE extras ( _id INTEGER PRIMARY KEY AUTOINCREMENT, accounts_id INTEGER, key TEXT NOT NULL, value TEXT, UNIQUE(accounts_id,key));
CREATE TABLE meta ( key TEXT PRIMARY KEY NOT NULL, value TEXT);
CREATE TRIGGER accountsDelete DELETE ON accounts BEGIN   DELETE FROM authtokens     WHERE accounts_id=OLD._id ;   DELETE FROM extras     WHERE accounts_id=OLD._id ;   DELETE FROM grants     WHERE accounts_id=OLD._id ; END;


ついでに、時刻設定で rootでない場合に、エラーを出しているのは以下の箇所です。
/android-2.2_r1.3/frameworks/base/libs/utils/SystemClock.cpp

int setCurrentTimeMillis(int64_t millis)

{

//... 途中省略

#if HAVE_ANDROID_OS

    fd = open("/dev/alarm", O_RDWR);

    if(fd < 0) {

        LOGW("Unable to open alarm driver: %s\n", strerror(errno));

        return -1;

    }

//...



さてさて、これらの事実から導かれる結論とは?
(えーと、わかりません。。。)

Rabbit-U

unread,
May 14, 2011, 12:07:44 AM5/14/11
to 日本Androidの会
Rabbit-Uです。

この辺りが時刻設定のようですが、英語よくわかりません(^-^;
http://developer.android.com/intl/ja/reference/android/app/AlarmManager.html#setTime(long)

大垣憲俊

unread,
May 15, 2011, 7:22:33 AM5/15/11
to android-g...@googlegroups.com
大垣です。 断片的な情報で恐縮です。

/<source top>/frameworks/base/core/res/AndroidManifest.xml

に以下の記述があります。

    <application android:process="system" ...


このタグも関係がありそうです。
当初のご質問からずれてしまいました。

>しかし、設定画面の日付と時刻からは変更ができていますが、設定画面からはrootで設定 
>しているのでしょうか? 


rootユーザーが登録されているかどうか未確認ながら、
単にrootで設定しているというよりも、
上記のprocessタグをはじめ、これまでの断片すべて結びつけて
説明できる別のしくみがあるように思います。

あまり参考になりませんが、現時点ではそんなところです。

timai

unread,
May 16, 2011, 6:51:04 AM5/16/11
to 日本Androidの会
鷹見様、飯塚様、大垣様、Rabbit-U様

ご回答、ご確認をありがとうございます。

やはりrootとかsystemユーザーで設定されているんですね。

ちょっと難しそうですので別途、逃げ道を検討してみます。

有難う御座いました。
Reply all
Reply to author
Forward
0 new messages