tetsu31415.log

androidなどのことを書き綴っていこうと思います。

自分自身をadb接続してlogcatを見てみる

突然ですがlogcatではシステムやアプリから吐かれたlogを見ることができます。
通常はUSBデバッグをONし、USB接続をしてPC上で見るのですが今回は端末上で見る方法について書いてみたいと思います。

ICS(Android4.0)までの端末ではAndroidManifestに権限を記載するだけでlogcatを見ることができます。
代表的なlogcatを見るアプリとしてaLogcatを紹介します。

aLogcat - GooglePlay
https://play.google.com/store/apps/details?id=org.jtb.alogcat

これはAndroid4.0.3のF-12Dで起動した場合のスクリーンショットです。

f:id:tetsu31415:20140429022849p:plain

このようにlogcatを表示することができます。

このアプリには

android.permission.READ_LOGS

という権限がついていてこれをAndroidManifestに記載することでlogcatの読み取りが許可されます。
この権限を使うと他のアプリが吐くLogの取得も可能になります。
logcatには重要な情報が含まれる場合があるので危険な場合があります。
JB(Android4.1)以降ではこの権限のprotectionLevelが"dangerous"から"signature|system|development"に格上げされたので通常アプリでこの権限を使うことはできなくなりました。
よってアプリから取得できるLogは自分のアプリのLogのみとなりました。

JB(4.1)以降の端末でもなんとかlogcatを見たい!

色々調べていたところこのような記事を見つけました。

XPERIA内部から自身へのadb接続 - コンピュータを楽しもう!

この記事でやっていることはadbをTCPモードに切り替えて自分の端末から自分の端末にadb接続する方法です。
本来TCPモードはWi-Fi経由でPCからadb接続をするためのものですが自分自身をadb接続することもできます。
これを使うとshell権限を取得することができるのでlogcatを見ることができることがわかりました。

TCPモードに切り替えるとその端末が接続しているWi-Fiネットワークの端末からパスワードなしにadb接続できるようになるので危険です。とくに公衆の無線LANなどで利用するすることは危険です。
Android4.2以上では許可されていないデバイスからのadb接続はできなくなっています。
自己責任でお願いします。

それでは方法の説明をします。

ここでは > の後に書かれたコマンドはPC上で入力、$ のあとに書かれたコマンドは端末上のターミナルで入力という区別をつけています。端末上のコマンド入力にはAndroid Terminal Emulatorを使用しています。

ここではAndroid4.3のGALAXY Note3を使用します。

Android4.1までの端末ではUSBデバッグをONにするとすべてのPCでadbを使用することができましたが、Android4.2以降は新しいPCと接続した時にPCを許可するかどうかの確認ダイアログが出るようになりました。
4.2以降でこの方法を使って自身をadb接続する場合にも自身からのアクセスを許可する必要があります。

  • 端末をUSB接続して以下のコマンドを入力します。
> adb tcpip 5555

このコマンドにより5555ポートが開放され、TCPモードになります。ここでPCからUSB経由でのadb接続はできなくなります。
PCによる作業は以上ですがPCと接続したままにします。
ここからは端末上のターミナルでの作業をします。

  • adb serverを再起動します。
$ adb kill-server
$ adb start-server
* daemon not running. starting it now on port 5038 * 
*  daemon started successfully * 

ここで4.2以上の端末ではこのようにUSBデバッグの許可をしますかというダイアログが出てくると思うので許可します。
常に許可するにチェックを入れると次回以降ダイアログで許可する必要がなくなります。

f:id:tetsu31415:20140429044513p:plain

  • 自分自身をadb接続する
$ adb connect 127.0.0.1:5555
connected to 127.0.0.1:5555

adbのデフォルトポートは5555なので最後の:5555の部分は省略しても大丈夫です。
先ほどのPC上でのコマンドで5555以外のポートに設定した場合はそのポートを入力してください。

  • 接続されているデバイスを確認する
$ adb devices
List of devices attached
emulator-5554 device
127.0.0.1:5555 device

127.0.0.1:5555がdeviceになっていればOKです。

  • shell接続する
$ adb -s 127.0.0.1:5555 shell
$ 

このように shell@デバイス名 と出ればshell権限を取得できています。

f:id:tetsu31415:20140429044534p:plain

これでshell権限を取得出来ました。

ここでlogcatとコマンドを打つとこのようにlogcatが流れます。

f:id:tetsu31415:20140429045251p:plain

TCPモードは再起動するまで有効です。再起動後はUSBモードになるので再度TCPモードに切り替える必要があります。
意図的にUSBモードに切り替えるには以下のコマンドを使います。

$ adb usb

このようにしてAndroid4.1以降でもアプリからlogcatを強引に取得することができました。
shell権限を使うとlogcatをみることやタッチイベントの取得/送信などさまざまなことができるので危険を伴いますので自己責任でお願いします。

この方法を使用するには
USBデバッグを有効にする。→
adbをTCPモードに切り替える→
バイスの許可をする(Android4.2以上)

という手順を踏む必要があるのでアプリから意図せずshell権限を奪取されるということは通常使っている分には心配する必要はありません。

最後まで読んでいただきありがとうがございました。

何かございましたら@tetsu31415までお願いします。

参考

CustomFont Managerを作った話

はじめに

このアプリはSHARP(au,docomoのみ)とFUJITSUAndroid端末でrootを取らずにカスタムフォントを入れるツールです。
標準的なAndroidではsystem領域を弄らないとシステムフォントの変更ができませんがSHARPFUJITSUに関しては任意のフォントを使用することができる機能が実装されているのでフォントを変えることができます。(公式的な方法ではない)

多くのサイトでadbを使ってカスタムフォントを転送する方法が紹介されていますが、このアプリはそれをアプリで完結させるために作られました。
昨年の5月に野良アプリでSHARP端末のフォントを変更するツールを公開してこちらの記事に書いたのですがPlayに上げるために作りなおしました。

ダウンロード

CustomFont Manager - Google Play
https://play.google.com/store/apps/details?id=com.tetsu31415.customfont

auSHARP端末でこの方法を使ったフォント導入をするとauアプリが使えなくなるようです。ご注意ください。

使い方はアプリ内に書いてあるのでここには特に書きません。
いくつかのサイトで使い方が紹介されているのでこちらを見ていただければ幸いです。

  • orefolder.blog

CustomFont Managerでシステムフォントを変更しよう ※ただし富士通・シャープに限る

CustomFont Managerを使ってAndroidスマートフォンのフォントを変更する。

  • あんどろいど遅報

【アプリレビュー】root不要でシャープ製、富士通製Androidスマフォのフォント変更が簡単に出来る! CustomFont Manager レビュー

仕組み

なぜこのようにフォントが変更出来るか、アプリでどのようなことを行っているかを書きます。

SHARP端末の場合

/data/fonts/customfont.ttf

に任意のフォントを置くとフォント設定画面でそのフォントが選択できるようになっています。
adbを使うとこのようにして転送できます。(入れたいフォントはxxx.ttfとする)

adb push xxx.ttf /data/fonts/customfont.ttf

この場所はユーザーアプリの権限で書き込み可能です。
Android1.6の機種(IS01/SH-10B)ではユーザーアプリ権限の書き込みが無理だった気がしますが、一度shellの方でcustomfont.ttfをおいてしまえば、このアプリでそれを上書きしてフォント変更することは可能なはずです、たぶん。
SoftBankSHARP端末では/data/fonts自体が存在しないのでこの方法は使えません。
au端末でこの方法を使ってフォントを変えるとauアプリ周りが使えなくなるそうなので気をつけてください。
【追記】SHL23以降、SH-01F以降のSHARP端末ではこの方法は使えなくなりました。/data/fontsが存在しません。残念ですね。

FUJITSU端末の場合

FUJITSUの端末にはオリジナル手書きフォント機能が搭載されています。
この機能は10文字の指定された文字を手書きすることでその手書きしたのようなフォントを生成してそのフォントに変更できるという独自機能です。
ここで重要なのが生成されたフォントをどこに保存して読み込んでいるかです。

/data/fonts/myfont.ttf

オリジナル手書きフォントに設定した際、生成されたフォントはここに置かれます。そしてそれが読み込まれます。
ということはここを書き換えれば自由なフォントを設定できます。ありがたいことにこの場所は書き換え可能です。
adbを使うとこのようにしてできます。(入れたいフォントはxxx.ttfとする)

adb push xxx.ttf /data/fonts/myfont.ttf

アプリの仕組みについて

このアプリでは上に書いたadbでできるフォント導入をアプリでやっているだけです。
ただ、フォントの転送はシャットダウン処理中にされています。
起動中でも転送はできますが、一部しか変更されなかったり、文字表示がおかしくなることがあるからです。
シャットダウン処理中に書き込まれるので正常な方法でシャットダウンをしないとフォントは書き込まれないようになっています。
例えばadb rebootやバッテリーを抜くなどして電源を切ってもフォントは書き込まれませんのでご注意ください。

このアプリはroot権限を使って本来書き換え不可能な部分を書き換えるものではないので基本的に文鎮化等は起こらないはずです。
何かありましたら @tetsu31415 まで連絡していただけるとありがたいです。

最後まで読んでいただきありがとうございました。