果物大好き!

山形のお爺ちゃんから美味しいフルーツ沢山届きました。
麗は食べさせろと大興奮!
お爺ちゃん、ありがとうございます。

りんごの箱をしまったら、
りんご食わせろー、とおお泣き

りんごうめぇー


プラム美味しい

洋ナシうめぇー


太鼓たたきに!

お立ち台

積み木遊び

麗ちゃん「ニャーニャ」

麗ちゃん1歳2ヶ月。随分しっかり歩けるようになりました。
イヌとネコの絵本を見て、「ニャーニャ、ワンワン」と片言が言えるようになり、おててをあわせてごちそうさまでしたもできるようになりました。
あと、「お鼻」と「お耳」も分かるように。ガーゼをおけにつけながら、手洗い洗濯のマネをしたり、ガーゼを背中にまわして、背中を洗うマネをしたり、お掃除が始まると掃除機のコンセントを差しに行ったり、お人形を抱っこして「かわいいかわいい」となでなでトントンしたり…。毎日目覚しい成長を続けています。

麗ちゃん10歩!

最近の麗ちゃん、
・10歩歩けるようになりました。
・麗ちゃんをフルネームで呼ぶと、「あーい」とおててあげてお返事します。
・携帯電話を操作して、背景画像やデスクトップアイコンを変えたり、暗証番号による操作ロックをかけたり、運転マナーモードにしたり…と、ばあちゃまの携帯電話を元に戻すのに一苦労しました。
・知らない間に固定電話でよそのおうちにかけちゃったりします。(ごめんなさい)
・口紅で落書きが大好きです。
・なんでもかんでもゴミ箱にIN!知らない間に大事なものもゴミと一緒に出してしまいました。。
・くしで髪をとかしてキレイキレイします。
・携帯電話持ってもしもしします。
・お風呂掃除や絨毯のコロコロお掃除の真似をします
PS3の電源ボタンやコントローラ、テレビのリモコンを触って、画面が変化するのを楽しみます。
・パソコンをたたいたり、マウスの抜き差しして遊びます。
・お家の階段を手足を使って登ろうとします。
・麺棒をバラバラに出して、足の指でつまんだり、箱にしまうマネができます。
・やりたいことを阻まれると、強情に叫び倒します。
いーっぱいできるようになったね♪
「○○麗ちゃん。」「はーい」

リバースエンジニアリング検証

apkを元に、Proguardをかける前かけた後でどのくらい解読具合が異なるのか、パッケージが含むC++等のネイティブライブラリ(libXX.so)やjarライブラリがどのくらい解読し得るのか、少し気になって、自作アプリで確認してみた。

結論は、ネイティブライブラリの解読は逆アセンブルで困難だが、javaのソースはjarライブラリもプロジェクトのソースもしっかり見えた。
Proguardをかけるとやはり見えにくくはなっているが、ある程度推測して解読はできる感じ。(アプリのつくりにもよるが)

試したリバースエンジニアリングの手順は以下。
1.apkをunzipして、プロジェクトに含まれるclass.dex(javaのclassファイルの情報)、Manifestやresourceのxmlを取り出す。

2.http://code.google.com/p/android4me/ からAXMLPrinter2.jarをダウンロードして、AndroidManifest.xmlや、res/***/***.xmlを復元。

$ java -jar AXMLPrinter2.jar AndroidManifest.xml 

3.http://code.google.com/p/dex2jar/からdex2jarをダウンロードし、classes.dexをjarに復元

$ dex2jar.bat classes.dex
$ ls
classes.dex.dex2jar

4. http://java.decompiler.free.fr/からJava Decompiler(jd-gui)をダウンロードし、3で復元したからJavaソースを復元。

$ jd-gui.sh classes.dex.dex2jar

5.class.dex.dex2jarを展開し、含まれるjarやネイティブライブラリを取り出す。

$ jar xvf class.dex.dex2jar

パッケージが展開され、含まれるjarやネイティブのライブラリが取り出せる。
jarライブラリは更に本コマンドで展開するなり、4で復元してもよいし、EclipseのInstallからhttp://java.decompiler.free.fr/jd-eclipse/updateを追加してjd-eclipseをインストールし、jarや各classを開いても復元される。

ネイティブライブラリは、逆アセンブラで解読できる範囲まで。。
解析の仕方は、前のエントリ http://d.hatena.ne.jp/chiakisugimoto/20110604/1307170484 とか。

$ mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-objdump -d libCube.so(以前物理エンジンサンプルとして作成したネイティブライブラリ)
/パス/libCube.so:     file format elf32-littlearm

Disassembly of section .plt:

0003531c <.plt>:
   3531c:       e52de004        push    {lr}            ; (str lr, [sp, #-4]!)
…略
0009a14c <Java_chiaki_test_cube_Cube_simulate>:
   9a14c:       b5f0            push    {r4, r5, r6, r7, lr}
   9a14e:       465f            mov     r7, fp
   9a150:       4656            mov     r6, sl
   9a152:       464d            mov     r5, r9
   9a154:       4644            mov     r4, r8
   9a156:       b4f0            push    {r4, r5, r6, r7}
   9a158:       4ac8            ldr     r2, [pc, #800]  (9a47c <Java_chiaki_test_cube_Cube_simulate+0x330>)
   9a15a:       b0f3            sub     sp, #460
…略
   9a178:       6123            str     r3, [r4, #16]
   9a17a:       6165            str     r5, [r4, #20]
   9a17c:       61a5            str     r5, [r4, #24]
   9a17e:       61e1            str     r1, [r4, #28]
   9a180:       1c07            adds    r7, r0, #0
   9a182:       2058            movs    r0, #88
   9a184:       468b            mov     fp, r1
   9a186:       f79b e970       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a18a:       1c21            adds    r1, r4, #0
   9a18c:       1c05            adds    r5, r0, #0
   9a18e:       f7b4 fd4d       bl      4ec2c <_ZN31btDefaultCollisionConfigurationC1ERK34btDefaultCollisionConstructionInfo>
   9a192:       48bb            ldr     r0, [pc, #748]  (9a480 <Java_chiaki_test_cube_Cube_simulate+0x334>)
   9a194:       f79b e968       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a198:       1c29            adds    r1, r5, #0
   9a19a:       1c06            adds    r6, r0, #0
   9a19c:       f7a9 fdac       bl      43cf8 <_ZN21btCollisionDispatcherC1EP24btCollisionConfiguration>
   9a1a0:       209c            movs    r0, #156
   9a1a2:       f79b e962       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a1a6:       2100            movs    r1, #0
   9a1a8:       4682            mov     sl, r0
   9a1aa:       f79f fb55       bl      39858 <_ZN16btDbvtBroadphaseC1EP22btOverlappingPairCache>
   9a1ae:       2080            movs    r0, #128
   9a1b0:       f79b e95a       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a1b4:       4681            mov     r9, r0
   9a1b6:       f7ec fe2b       bl      86e10 <_ZN35btSequentialImpulseConstraintSolverC1Ev>
   9a1ba:       2088            movs    r0, #136
   9a1bc:       0040            lsls    r0, r0, #1
   9a1be:       f79b e954       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a1c2:       1c31            adds    r1, r6, #0
   9a1c4:       1c04            adds    r4, r0, #0
   9a1c6:       4652            mov     r2, sl
   9a1c8:       464b            mov     r3, r9
   9a1ca:       9500            str     r5, [sp, #0]
   9a1cc:       f7f5 f98a       bl      8f4e4 <_ZN23btDiscreteDynamicsWorldC1EP12btDispatcherP21btBroadphaseInterfaceP18btConstraintSolverP24btCollisionConfiguration>
   9a1d0:       6823            ldr     r3, [r4, #0]
   9a1d2:       4aac            ldr     r2, [pc, #688]  (9a484 <Java_chiaki_test_cube_Cube_simulate+0x338>)
…略

dalvikVM

こちらを参考にコンカレントGCの中を覗いてみました。
http://www.slideshare.net/akachochin/dalvikvm?from=download_email_for_pro&show_download_info=true#favsGroupsEvents

JITとhprofのON/OFF、シグナルのハンドリングとダンプについて、こちらが参考になりました。
http://blog.kmckk.com/archives/3076212.html
http://blog.kmckk.com/archives/3456418.html#more
http://java.dzone.com/articles/viewing-hprof-android