Android 5から*.apkが配置されるディレクトリが一段深くなってた
Android 5になって、apkファイルを配置するディレクトリ構造が一段深くなり、
/data/app/[アプリ名].apk
が
/data/app/[アプリ名]/[アプリ名].apk
になったようです。以下、AVDでエミュレータを動かして確認した結果です。
Android 4.4.2
root@generic:/ # ls -la /data/app -rw-r--r-- system system 4764092 2015-02-18 21:30 ApiDemos.apk -rw-r--r-- system system 1579120 2015-02-18 21:30 ApiDemos.odex -rw-r--r-- system system 19334 2015-02-18 21:29 CubeLiveWallpapers.apk -rw-r--r-- system system 15080 2015-02-18 21:29 CubeLiveWallpapers.odex -rw-r--r-- system system 27681 2015-02-18 21:29 GestureBuilder.apk -rw-r--r-- system system 23240 2015-02-18 21:29 GestureBuilder.odex -rw-r--r-- system system 7974 2015-02-18 21:29 SmokeTest.apk -rw-r--r-- system system 12496 2015-02-18 21:29 SmokeTest.odex -rw-r--r-- system system 3355 2015-02-18 21:29 SmokeTestApp.apk -rw-r--r-- system system 2008 2015-02-18 21:29 SmokeTestApp.odex -rw-r--r-- system system 44065 2015-02-18 21:29 SoftKeyboard.apk -rw-r--r-- system system 28128 2015-02-18 21:29 SoftKeyboard.odex -rw-r--r-- system system 19235 2015-02-18 21:29 WidgetPreview.apk -rw-r--r-- system system 10800 2015-02-18 21:29 WidgetPreview.odex
Android 5.0.1
root@generic:/ # ls -la /data/app/ drwxrwx--x system system 2015-09-15 13:49 ApiDemos drwxrwx--x system system 2015-09-15 13:49 CubeLiveWallpapers drwxrwx--x system system 2015-09-15 13:49 GestureBuilder drwxrwx--x system system 2015-09-15 13:49 SmokeTest drwxrwx--x system system 2015-09-15 13:49 SmokeTestApp drwxrwx--x system system 2015-09-15 13:49 SoftKeyboard drwxrwx--x system system 2015-09-15 13:49 WidgetPreview root@generic:/ # ls -la /data/app/ApiDemos/ -rw-r--r-- system system 5026650 2015-03-06 12:17 ApiDemos.apk drwxr-xr-x system system 2015-09-15 13:49 lib
/system/appおよび/system/priv-appについても同様に1段深くなっています。
また、Android 5になってodexファイルが無くなったようです。これはDalvikからARTに移行した影響でしょう。
Nexus5にSuperSUをインストールするメモ
Nexus5以外の場合や、ClockWorkModやSuperSUのバージョンが上がった場合は適宜読みかえてください。
ClockWorkModの準備
ClockworkMod ROM Manager - Recoveriesから「Google Nexus 5」のDownload Recovery「recovery-clockwork-6.0.4.5-hammerhead.img」をダウンロードしておく。
Android 4.2.2以降であれば端末認証をしておく。
SuperSUの準備
を元に
をダウンロードしておく。
SuperSUのインストール
- PCやMacとUSB接続する
- 「adb reboot bootloader」
- 「fastboot boot recovery-clockwork-6.0.4.5-hammerhead.img」
- ClockworkModが起動する
- 「adb push UPDATE-SuperSU-v1.94.zip /sdcard/0/Download」
- ClockworkModのメニュー「Install zip from sdcard」からUPDATE-SuperSU-v1.94.zipをインストール
インストールパス
- apk
- /system/app/Superuser.apk
- ネイティブバイナリ
- /system/xbin/.tmpsu
- /system/xbin/daemonsu
- /system/xbin/su
- /system/xbin/sugote
- /system/xbin/sugote-mksh
- /system/xbin/supolicy
suはshellからも普通に使えますが、他のバイナリが何のためのものか、わかりません。
Tcl 8.6をAndroid NDKでクロスコンパイルする
http://www.tcl.tk/software/tcltk/download.htmlからtcl8.6.1-src.tar.gz をダウンロード。
Tclはクロスコンパイル環境をあまり考慮していないようで、「クロスコンパイル用のunameコマンドを作る - android-memoの日記」のunameコマンドが必要です。
$ tar xvzf tcl8.6.1-src.tar.gz $ cd tcl8.6.1/unix $ PATH=$HOME/bin/fake-uname/android:$PATH CFLAGS=-O2 LDFLAGS=-s tcl_cv_strtod_buggy=ok ./Configure --host=arm-linux-androideabi --prefix=$ANDROID_APP_ROOT/tcl-8.6.1 $ PATH=$HOME/bin/fake-uname/android:$PATH CFLAGS=-O2 LDFLAGS=-s tcl_cv_strtod_buggy=ok make configure-packages $ make $ make install
installed file
bin/tclsh8.6 include/*.h lib/libtcl8.6.so lib/libtclstub8.6.a lib/itcl4.0.0/*.tcl lib/itcl4.0.0/itclConfig.sh lib/itcl4.0.0/libitcl4.0.0.so lib/itcl4.0.0/libitclstub4.0.0.a lib/pkgconfig/tcl.pc lib/sqlite3.8.0/libsqlite3.8.0.so lib/sqlite3.8.0/*.tcl lib/tcl8/8.4/platform/shell-1.1.4.tm lib/tcl8/8.4/platform-1.0.12.tm lib/tcl8/8.5/msgcat-1.5.2.tm lib/tcl8/8.5/tcltest-2.3.6.tm lib/tcl8/8.6/http-2.8.7.tm lib/tcl8/8.6/tdbc/sqlite3-1.0.0.tm lib/tcl8.6/*.tcl lib/tcl8.6/*/*.tcl lib/tcl8.6/encoding/*.enc lib/tcl8.6/msgs/*.msg lib/tcl8.6/tclAppInit.c lib/tcl8.6/tclIndex lib/tclConfig.sh lib/tclooConfig.sh lib/tdbc1.0.0/libtdbc1.0.0.so lib/tdbc1.0.0/libtdbcstub1.0.0.a lib/tdbc1.0.0/*.tcl lib/tdbc1.0.0/tdbcConfig.sh lib/tdbcmysql1.0.0/libtdbcmysql1.0.0.so lib/tdbcmysql1.0.0/*.tcl lib/tdbcodbc1.0.0/libtdbcodbc1.0.0.so lib/tdbcodbc1.0.0/*.tcl lib/tdbcpostgres1.0.0/libtdbcpostgres1.0.0.so lib/tdbcpostgres1.0.0/*.tcl lib/thread2.7.0/libthread2.7.0.so lib/thread2.7.0/*.tcl man/man1/tclsh.1 man/man3/*.3 man/mann/*.n share/man/mann/*.n
クロスコンパイル用のunameコマンドを作る
クロスコンパイル環境を考慮しているUnixソフトウェアであれば、configureスクリプトの--hostオプションの指定だけでクロスコンパイルが成功することも珍しくありません。しかし、ソフトウェアによってはconfigureスクリプト中でunameを直接呼び出し、その結果に応じて分岐するようなものもあります。このような状況でクロスコンパイルを通しきるのは困難です。
そこで、クロスコンパイル時のためのunameコマンドをシェルスクリプトで作ってみました。
#!/bin/bash case "$1" in -a ) echo "Linux localhost 3.0.72-gfb3c9ac #1 SMP PREEMPT Fri Jun 7 12:00:19 PDT 2013 armv7l GNU/Linux";; -v ) echo "#1 SMP PREEMPT Fri Jun 7 12:00:19 PDT 2013";; -r ) echo "3.0.72-gfb3c9ac";; -m ) echo "armv7l";; -s ) echo "Linux";; * ) echo "Linux";; esac
上記はAndroid NDK用です。これを$HOME/bin/fake-uname/android/unameとして保存します。イケてないconfigureスクリプトに出会ったら下記のようにconfigureをかければ期待通りの結果が得られます。
$ PATH=$HOME/bin/fake-uname/android:$PATH ./configure --host=arm-linux-androideabi
tcpdump 4.5.1をAndroid NDKでクロスコンパイルする
http://www.tcpdump.org/#latest-releaseからtcpdump-4.5.1.tar.gzをダウンロード。
「libpcap 1.5.3をAndroid NDKでクロスコンパイルする - android-memoの日記」に従ってlibpcapがインストールされている前提です。
例によってconfig.subが古いので、libtoolのファイルをコピーしてからconfigureします。
$ tar xvzf tcpdump-4.5.1.tar.gz $ cd tcpdump-4.5.1 $ for i in `find . -name config.guess` ; do cp /usr/local/share/libtool/config/config.guess $i ; done $ for i in `find . -name config.sub` ; do cp /usr/local/share/libtool/config/config.sub $i ; done $ PATH=$ANDROID_APP_ROOT/libpcap-1.5.3/bin:$PATH CFLAGS='-O2 -DNBBY=8' LDFLAGS=-s ac_cv_linux_vers=2 ./configure --host=arm-linux-androideabi --prefix=$ANDROID_APP_ROOT/tcpdump-4.5.1 $ perl -i.bak -pe 's#setprotoent#//setprotoent#g;s#endprotoent#//endprotoent#g;' print-isakmp.c $ make $ make install
installed file
sbin/tcpdump sbin/tcpdump.4.5.1 share/man/man1/tcpdump.1
libpcap 1.5.3をAndroid NDKでクロスコンパイルする
ネットワーク管理者向けツールでよく使われているライブラリです。http://www.tcpdump.org/#latest-releaseからlibpcap-1.5.3.tar.gzをダウンロード。
例によってconfig.subが古いので、libtoolのファイルをコピーしてからconfigureします。
$ tar xvzf libpcap-1.5.3.tar.gz $ cd libpcap-1.5.3 $ for i in `find . -name config.guess` ; do cp /usr/local/share/libtool/config/config.guess $i ; done $ for i in `find . -name config.sub` ; do cp /usr/local/share/libtool/config/config.sub $i ; done $ CFLAGS=-O2 LDFLAGS=-s ./configure --host=arm-linux-androideabi --prefix=$ANDROID_APP_ROOT/libpcap-1.5.3 --with-pcap=linux $ make $ make install
installed file
bin/pcap-config include/pcap/*.h include/pcap-bpf.h include/pcap-namedb.h include/pcap.h lib/libpcap.a lib/libpcap.so.1.5.3 share/man/man1/pcap-config.1 share/man/man3/*.3pcap share/man/man5/pcap-savefile.5 share/man/man7/*.7
Nmap 6.46をAndroid NDKでクロスコンパイルする
Nmapは定番のセキュリティスキャナです。NcatというNetcatもどきが付属しており、僕はこれが欲しくてビルドしました。
http://nmap.org/download.html#source から nmap-6.46.tar.bz2 をダウンロードします。
例によってconfig.subが古いので、libtoolのファイルをコピーしてからconfigureします。
$ tar xvjf nmap-6.46.tar.bz2 $ cd nmap-6.46 $ for i in `find . -name config.guess` ; do cp /usr/local/share/libtool/config/config.guess $i ; done $ for i in `find . -name config.sub` ; do cp /usr/local/share/libtool/config/config.sub $i ; done $ CFLAGS=-O2 LDFLAGS=-s ./configure --host=arm-linux-androideabi --prefix=$ANDROID_APP_ROOT/nmap-6.46 --with-pcap=linux --without-liblua --without-zenmap --without-nping $ patch < patch-eth-bsd.txt $ make (liblinearに関するエラーが出る、クロスコンパイル環境への対応が中途半端なため) $ cd liblinear $ arm-linux-androideabi-ar rcv liblinear.a linear.o tron.o blas/*.o $ arm-linux-androideabi-ranlib liblinear.a $ cd .. $ make $ make install
コンパイルエラーを回避するためにconfigureで色々とwithoutにしています。
また、そのままではビルドが通らないので、下記パッチを当てる必要があります。この対応が正しいかは疑問ですが…。
*** nmap-6.46-orig/libdnet-stripped/src/eth-bsd.c 2009-11-09 13:49:32.000000000 +0900 --- nmap-6.46/libdnet-stripped/src/eth-bsd.c 2014-05-31 16:08:21.000000000 +0900 *************** *** 18,24 **** --- 18,29 ---- #include <net/route.h> #include <net/if_dl.h> #endif + + #ifdef HAVE_NET_BPF_H #include <net/bpf.h> + #else + #define BIOCSETIF _IOW('B',108, struct ifreq) + #endif #include <net/if.h> #include <assert.h>
installed files
bin/ncat bin/nmap share/man/*/man1/nmap.1 share/man/man1/ncat.1 share/man/man1/ndiff.1 share/man/man1/nmap.1 share/nmap/*