2013/05/28

[n7]ソフトの改造をしよう (1)

今週は、毎日定時で仕事が終わりそうな予感がする。
こういうときに、勉強をしておかねば。

そんなわけで、Nexus7の改造をすることにした。
改造、といっても分解するわけではなく、ソフトウェアの改造に留まる。

目的がないと勉強してもつまらない。
まずは「かざしている間だけNFCが動作する」にしよう。


前に、「かざす」という動作をどうやって端末で実現させるか検討したが、一番楽なのはハードウェアキーを押している間だけにする、というものだった。
まあ、かざす、というには弱いが、人間の意思をどこかに入れたいので、それをハードウェアキーに託したというところだ。

Nexus7には、ハードウェアキーが3つしかない。

  • 電源ボタン
  • 音量アップボタン
  • 音量ダウンボタン

ホームボタンなどはソフトウェアキーなので、対象外だ。

この3つのうち、自由に使えそうなのは音量ボタンだと思う。
つまり、こうしようと考えている。

音量ボタンを押している間だけ、NFCの動作ができるようにする

 

音量も変更させたいだろうから、どうにかして動的な切替ができるようにせんといかん。
そこは・・・あとで考えよう。


Froyo時代に調べた資料があったのだが、さすがにパスなどが変更されている。
仕方なく、今の動きから調べることにした。

入力イベントをさばいているのが、frameworks\base\services\input\EventHub.cppのようだった。
ここのEventHub::getEvents()だ。
gdbclientを使ってブレークポイントを設定すると、何度も止まった。

(gdb) bt
#0  android::EventHub::getEvents (this=0x65336af0, timeoutMillis=-1,
    buffer=0x65336ea0, bufferSize=256)
    at frameworks/base/services/input/EventHub.cpp:646
#1  0x67f0162a in android::InputReader::loopOnce (this=0x65336d98)
    at frameworks/base/services/input/InputReader.cpp:268
#2  0x67f02dd8 in android::InputReaderThread::threadLoop (this=0x6533a3f8)
    at frameworks/base/services/input/InputReader.cpp:838
#3  0x401cfc76 in android::Thread::_threadLoop (user=0x6533a3f8)
    at frameworks/native/libs/utils/Threads.cpp:796
#4  0x4022c1f2 in android::AndroidRuntime::javaThreadShell (
    args=<optimized out>) at frameworks/base/core/jni/AndroidRuntime.cpp:991
#5  0x401cf7cc in thread_data_t::trampoline (t=<optimized out>)
    at frameworks/native/libs/utils/Threads.cpp:132
#6  0x40143a54 in __thread_entry (
    func=0x401cf739 <thread_data_t::trampoline(thread_data_t const*)>,
    arg=0x653402b8, tls=0x6acf5f00) at bionic/libc/bionic/pthread_create.cpp:92
#7  0x40143bd0 in pthread_create (thread_out=0x697f5bac, attr=<optimized out>,
    start_routine=0x78, arg=0x653402b8)
    at bionic/libc/bionic/pthread_create.cpp:201
#8  0x00000000 in ?? ()

さかのぼってみたが、どうもスレッドでぐるぐる回っているところらしく、イベントの発生地点はこれからではわからなさそうだった。

電源ボタンを押したときの処理は、policyのPhoneWindowManager.javaだったよなぁ、と思って音量ボタン押しにブレークポイントを設定してみたが、止まらず。
これは、アタッチしたプロセスが悪いのかもしれない。
けど、その部分をまるまるコメントアウトしても音量ボタンの操作ができたので、ここではないみたい。

 

面倒になったので「KEYCODE_VOLUME_UP」でjgrepすると、media/java/android/media/AudioManager.javaが出てきた。
handleKeyDown()やhandleKeyUp()があるので、処理をコメントアウトすると音量ボタンを操作しても何も起こらなくなった。


今日の調査は、ここまで。

手を加えるなら、AudioManager.javaではなく、これを呼び出した上位層にしたいものだ。
電源ボタン+音量ダウンボタン同時押しでスクリーンショット撮影とか、ああいうのと同じ階層にできるのが望ましいところだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。