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のインストール

  • 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/*