Android のコンパイル#
envsetup.sh スクリプトを使用して環境を初期化します:source build/envsetup.sh または. build/envsetup.sh
利用可能なコマンドの完全なリストを表示するには、次のコマンドを実行します:hmm
フレームワークデバッグ#
top#
VIRT
:このメモリ使用量は、アプリケーションが占有するアドレス空間です。アプリケーションが要求した場合はすべてここにカウントされ、実際に使用されたかどうかは関係ありません。プログラムを書くときにエラーを恐れ、占有を気にしない場合は、メモリを多く開放するのも普通です。RES
:常駐メモリ使用量。この値は、そのアプリケーションが実際に使用しているメモリですが、2 つの小さな問題があります。一つは、いくつかのものがスワップ領域に置かれている可能性があること(SWAP)、もう一つは、いくつかのメモリが共有されている可能性があることです。SHR
:共有メモリ。これは、このメモリ空間が他のアプリケーションによっても使用されている可能性があることを意味します。DATA
:データが占有するメモリ。この部分は、実際にそのプログラムが要求するデータ空間であり、実行中に使用されるものです。
vmstat#
vmstat は、システム情報を表示するコマンドです。たとえば、主記憶装置の利用可能な容量や CPU の動作状態を表示します。vmstat コマンドをそのまま実行すると、現在のプロセス、メモリ、スワップ、デバイス、割り込み、CPU に関する情報が表示されます。また、「-d」または「-p」オプションを追加すると、パーティションやディスクの読み書き状態などが表示されます。「-f」オプションを指定すると、システム起動からコマンド実行までに作成されたプロセスの数が表示されます。
meminfo#
cat /proc/meminfo
free#
-b バイト単位で容量を表示(デフォルト)
-k キロバイト単位で容量を表示
-m MB単位で容量を表示
-h 単位を含む容量を表示(G、Mを含む)
-t 物理メモリとスワップメモリの合計も表示
strace#
プロセスの実行中のシステムコールと受信した信号を追跡するためによく使用されます。
time#
指定されたコマンドの呼び出しから終了までにかかる時間、ユーザー CPU 時間、システム CPU 時間を測定します。指定されたコマンドの出力結果の後に、測定結果が標準エラー出力に出力されます。コマンドコードが実際に CPU を使用している時間はユーザー CPU 時間です。したがって、存在しないコマンドを time コマンドの引数として指定すると、ユーザー CPU 時間は 0 になります。スリープ時間は含まれません。
size#
ターゲットファイルまたはリンクライブラリファイル内のターゲットファイルの各セグメントのサイズを表示します。
file#
ファイルタイプを特定して表示します。
addr2line#
so ファイルを解析します。
ブートローダーをスキップ#
adb shell settings put global device_provisioned 1
readelf#
ELF 形式のファイル情報を表示します。
logcat#
adb root;adb remount
キャッシュをクリア adb logcat -c
クリアできない場合は、特定の領域を指定してクリア adb logcat -c main/system/event/kernel/all(ログバッファ)
キャッシュを表示 adb logcat -g
最大logcatキャッシュを設定 adb logcat -G 100M
dump meminfo#
adb shell dumpsys meminfo
または特定のパッケージ
adb shell dumpsys meminfo packageName
printk#
- デバッグログを印刷します。
printk("%d",intA);
- 変数が占めるメモリサイズを印刷します。
printk("sizeof(*intA)=%d",sizeof(*intA));
CPU アーキテクチャを表示#
adb shell getprop ro.product.cpu.abi
サービス#
サービスリスト: adb shell service list
特定のサービスが存在するかを確認: adb shell service check SurfaceFlinger
アクティビティ#
adb shell dumpsys activity top|grep ACTIVITY
adb shell am start -n ActivityName
パラメータを取得#
getprop すべてのマシン情報パラメータを表示
getprop ro.serialno マシンのシリアル番号を表示
getprop ro.carrier マシンのCID番号を表示
getprop ro.hardware マシンのボードコードを表示
getprop ro.bootloader SPL(Hboot)バージョン番号を表示
getprop ro.build.version.release システムバージョンを表示(8、9...)
getprop ro.build.display.id メーカーのシステムバージョンを取得
CPU 周波数#
root権限(suコマンドを直接入力)
cd sys/devices/system/cpu/cpu0/cpufreq
lsファイルは以下の通り
cpuinfo_cur_freq: 現在のCPUが動作している周波数
cpuinfo_max_freq:このファイルはプロセッサが動作できる最高周波数を指定します(単位:キロヘルツ)
cpuinfo_min_freq :このファイルはプロセッサが動作できる最低周波数を指定します(単位:キロヘルツ)
スクリーン#
表示:
adb shell
wm size 現在の解像度を取得
wm density 現在の画面密度を取得(例:560dpi)
変更:
wm size 1096*2560
wm density 420
復元:
wm size reset
wm density reset
仮想アドレスを表示#
adb root;adb remount
adb shell
ps -A|grep camera サービスのプロセス番号を表示(例:4712)
cd proc/4712 プロセス番号のフォルダに入る
more maps 仮想メモリアドレスを表示
SELinux モード#
adb shell setenforce 0(一時的にSELinuxモードを無効にする)
adb shell setenforce 1(SELinuxモードを有効にする)
パスを取得#
adb shell dumpsys SurfaceFlinger 最下部で実行中のAPKを確認
adb shell pm path "com.**" パスを取得
プロパティシステム#
Android は SystemProperties の set および get メソッドを使用して多くのものを制御します。一般的に上層で制御スイッチを追加することができます。このシステムには多くの prop ファイルが存在します。それぞれは system/build.prop、system/etc/prop.default、vendor/build.prop、vendor/default.prop です。以下にこれらのファイルの構成について説明します。
- system/build.prop
これは主に device\(platform) sample\product/system.prop、および build ディレクトリに追加された ADDITIONAL_BUILD_PROPERTIES から構成されています。
- system/etc/prop.default
主にシステムが追加した PRODUCT_SYSTEM_DEFAULT_PROPERTIES です。
- vendor/build.prop(比較的重要)
主にシステムが追加した PRODUCT_PROPERTY_OVERRIDES です。この属性は device.mk に追加され、ここにコンパイルされますが、9.0 のシステムでは、ここに追加しても無効になり、値を取得できません。
- vendor/default.prop(同じディレクトリの build.prop の同じプロパティに上書きされます)
主にシステムが追加した PRODUCT_DEFAULT_PROPERTY_OVERRIDES です。
接頭辞:
- ro:読み取り専用属性、変更できません。
- persist:属性を変更した後、再起動しても有効です。データは /data/property ディレクトリに保存されます。他の接頭辞の属性は設定後、メモリにのみ保存され、ディスクには保存されないため、再起動後はデフォルト値に戻ります。
- ctrl:サービスの起動と停止に使用されます。各サービスは init.rc で定義する必要があります。init が ctrl.start 属性の設定要求を受け取ると、属性サービスはその属性値をサービス名として使用してそのサービスを見つけ、起動します。このサービスの起動結果は init.svc.<サービス名> 属性に格納されます。
Android 署名#
Android ソースコードのシステム署名は、統一された保存パス:build/target/product/security にあります。
-
.pem タイプファイル:Android が apk に署名する際、.pem ファイルは X.509 のデジタル証明書であり、ユーザーの公開鍵などの情報が含まれており、復号化に使用されます。このファイル形式にはデジタル証明書だけでなく、さまざまなキーも保存でき、公開可能で、特定のアプリや他のものが対応する秘密鍵で署名されているかを検証するために使用されます。
-
.pk8 タイプファイル:.pk8 拡張子のファイルは PKCS 8 に対応しており、秘密鍵を保存するために使用され、この秘密鍵は秘密に保管する必要があります。
Android システム署名パスには合計 5 種類のキーがあります:
- testkey:プラットフォームのデフォルトキー。特別な変更がない限り、システムのコンパイルでデフォルトでこのキーが使用されます。testkey は公開されているため、誰でも取得でき、一定のリスクがあります。プロジェクトに特別な要件がある場合は、一般的に自分で作成したキーをシステムのデフォルトキーとして使用します。
- platform:プラットフォームのコアアプリケーションの署名の 1 つで、署名された apk はシステムのコア機能を完了します。これらの apk が存在するプロセスの UID は system です。manifest ノードには sharedUserId=”android.uid.system” が追加されています。
- shared:この署名の apk は home/contacts プロセスとデータを共有できます。manifest ノードには android=”android.uid.shared” が追加されています。一般的に tel 関連の apk で使用されます。
- media:この署名の apk は media/download の一部です。manifest ノードには android=”android.media” が追加されています。一般的に media 関連の apk で使用されます。各 apk パッケージは、その対応する Android.mk で LOCAL_CERTIFICATE 属性を設定し、その中の 1 つのキーを指定します(この変数が設定されていない場合、デフォルトで testkey が使用されます)。
- verity:特別なシステム署名です。システムのコンパイル時にシステムがコンパイル処理されます。個別に生成する必要があります。
署名の生成#
Android のルートディレクトリでコマンドを実行して releasekey、platform、shared、media を生成します。platform を例に、他のキーも同様に生成します。
development/tools/make_key platform'/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
解説:
- 所在国 (Country) 略称:C、国のアルファベット略称のみ(例:中国:CN)
- 所在省 (State/Provice) 略称 S
- 所在都市 (Locality) 略称 L
- 組織名 (Organization Name) 略称 O
- 部門名(Organizational Unit Name (eg, section))略称 OU
- 公称名 (Common Name) 略称 CN。コード署名証明書の申請組織名またはウェブサイトのドメイン名。
- メール(Email)
システムは、キーを生成するために必要なパスワードの入力を求めてきます。Enter を押すだけです。キーのパスワードを設定すると、コンパイルは通りません。
生成されたキーは Android のルートディレクトリに存在し、キーを/build/target/product/security
に移動して以前のキーと置き換え、OpenSSL ツールを使用して生成されたキーが正常であるかを確認する必要があります。releaseKey を例に、次のコマンドを実行します: openssl x509 -noout -subject -issuer -in releaseKey.x509.pem
verity_key の生成
- verity をコンパイル:Android のルートディレクトリで verity をコンパイルします。
make generate_verity_key (mmm system/extras/verity/)
- veritykey 署名を生成:
development/tools/make_key veritykey '/C=CN/ST=ChengDu/L=ChengDu /O=123/OU=13/CN=123/emailAddress=test@123.com'
- 次のコマンドを実行して.pk8 .pem ファイルを生成します:
out/host/linux-x86/bin/generate_verity_key -convert veritykey.x509.pem verity_key
署名の使用と設定
署名の使用は 2 つのケースに分かれます:
- user と debug バージョンを区別せず、現在のデバイスのコンパイルで使用されるキーを置き換えます。
- user と debug バージョンを区別し、異なるバージョンをコンパイルする際に異なるキーを使用します。
user と debug バージョンを区別しない場合
- Android のルートディレクトリで生成されたさまざまな.pk8 と.pem ファイルを
build/target/product/security/
ディレクトリにコピーし、以前のすべてのデフォルトキーを上書きします。veritykey.pk8、veritykey.x509.pem、verity_key をそれぞれ verity.pk8、verity.x509.pem、verity_key に名前変更します。 - Android の設定を変更します:
/build/core/config.mk
で定義された変数:DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
PS:PRODUCT_DEFAULT_DEV_CERTIFICATE
:mk ファイルで定義されたLOCAL_CERTIFICATE
変数。mk ファイルでLOCAL_CERTIFICATE
が定義されている場合、コンパイル時に定義された署名ファイルが使用され、定義されていない場合は else プロセスに入ります。
/build/core/Makefile
で定義された変数:ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey) BUILD_VERSION_TAGS += release-keys
**PS:** このコードは、config.mk で定義されたDEFAULT_SYSTEM_DEV_CERTIFICATE
変数を判断し、コンパイル時に対応する build_key を使用します。フラッシュ後、getprop build.tags
を使用して確認できます。
- SELinux を変更します:
system/sepolicy/private/keys.conf system/sepolicy/prebuilts/api/{apilevel}/private/keys.conf
user と debug バージョンを区別する場合
testkey を例に:
device/project/
パスに新しいキーを保存するためのフォルダ security を新規作成します。キーが存在するためだけに使用されます。後続のステップでパスに条件判断を行います。device/project/product.mk
で条件判断を行います:TARGET_BUILD_VARIANT を取得し、TARGET_BUILD_VARIANTがuserdebug/eng
の場合はbuild/make/target/product/security/testkey
を使用し、それ以外の場合はカスタムフォルダ内のキーを使用します。
Android デバイスでシステム署名キーを判断する#
adb root;adb remount
adb shell
cd system
getprop | grep ro.build.tags
# ro.build.tags=release-keysという行が表示されます。
サードパーティアプリで使用される署名ファイルの生成#
サードパーティアプリケーションでは、Android システムのコンパイルを経ないため、署名ファイルがない場合は特別な権限を使用できず、インストールできません。そのため、対応する.keystore ファイルを提供できます。
自分で生成したキーが存在するパスで:
- platform.pem ファイルを生成:platform.pk8 から
.pem
ファイルを生成します:openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt
- platform.p12 ファイルを生成:
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:pwd -name name
、ここで name はエイリアス名、pwd はエイリアスパスワードです。 - platform.keystore を生成:
keytool -importkeystore -deststorepass pwd -destkeystore ./platform.keystore -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass pwd
上記の 3 つのステップで、platform.keystore
ファイルが生成されます。このファイルは apk 署名に使用できます。
Bootchart パフォーマンスツールの使用方法#
Android システムソースコードには bootchart の実装があり、パスはsystem/core/init/bootchart.cpp
にあります。bootchart は init プロセスに埋め込まれて実装され、バックグラウンドで測定を実行します。ただし、bootchart の測定期間は init プロセスの起動後であり、uboot と kernel の起動時間は含まれません。
Android プラットフォームでの bootchart の使用手順#
- デバッグデバイスの bootchart プログラムを有効にし、デバイスに必要な起動ログを取得します:
adb shell 'touch /data/bootchart/enabled'
adb reboot
でデバッグデバイスを再起動した後、Ubuntu コンピュータを接続し、Android のルートディレクトリで次のコマンドを実行します:android$ ./system/core/init/grab-bootchart.sh
- bootchart のアイコンが Android のルートディレクトリに生成されます。
コマンドで横画面と縦画面を切り替える#
# 横画面に切り替え:
su
settings put system user_rotation 3
settings put system accelerometer_rotation 0
# 縦画面に切り替え:
settings put system accelerometer_rotation 1/2/ 3 任意に変更
kernel log コマンド#
adb shell cat proc/kmsg
selinux を変更した後の make コンパイル#
make selinux_policy
:このコマンドはすべての selinux ファイルをコンパイルします。約 50 秒で 1 回の make が完了します。make ファイル名
:例えば:
make plat_file_contexts -j9;
make plat_sepolicy.cil -j9;
make vendor_sepolicy.cil -j9;
make vendor_property_contexts -j9;
selinux の変更をデバイスに同期#
adb push out/target/product/product/vendor/etc/selinux/* vendor/etc/selinux/*
adb push out/target/product/product/system/etc/selinux/* system/etc/selinux/*
クラッシュアドレスの解析#
symbols/vendor$ addr2line -f -e bin/test_service 000000000000ac40
_ZN12UpdateSocket9handleMsgEPv
vendor/..../test.cpp:87
アプリデータのクリアとバージョンの確認#
アプリデータをクリア:adb shell pm clear com.test.upgrade
アプリのバージョン番号を確認:dumpsys package com.test.upgrade |grep version
odex ファイルを生成しないようにコンパイル#
LOCAL_DEX_PREOPT := false
ANR ログの抽出#
xxx_app_anr というファイルは、一般的にプロセススタック情報が traces ファイルよりも少ないです。
したがって、traces がある場合は、このファイルを基にバグを分析して特定します。
- traces ファイルは
/data/anr/
ディレクトリにあり、デフォルトでは、ANR が発生するたびに traces.txt ファイルが生成されますが、後に発生したものが以前のものを上書きします。 - xxx_app_anr ファイルは
/data/system/dropbox/
ディレクトリにあり、異なる圧縮パッケージに保存されます。Dropbox によって生成されます。
ANR が発生した場合は、adb pull
コマンドを使用して、上記の 2 つのディレクトリを抽出できます。
シリアルポートのカーネルログの印刷を禁止 / 復元#
printk の印刷レベルを調整することで行います:
- 印刷を禁止:dmesg -n1
- 印刷を復元:dmesg -n8
- 禁止を復元:echo 0 > /proc/sys/kernel/printk
- 印刷を復元:echo 7 > /proc/sys/kernel/printk
タッチ座標表示を開く#
- 開く:
settings put system pointer_location 1
- 閉じる:
settings put system pointer_location 0
特定のアプリを開く#
- アプリパッケージ名を確認する
dumpsys package
- 特定のパッケージのアクティビティを確認する:
dumpsys package com.***.***
- パッケージの位置を確認する:
adb shell pm path com.***.***
- アプリを開く:
am start ***/***.activity
- 現在開いているアプリのアクティビティを確認する:
dumpsys activity top|grep ACTIVITY
現在開いているアプリのパッケージ名を取得#
adb shell dumpsys window | grep mCurrentFocus
Selinux#
分類:
- untrusted_app: サードパーティアプリ、Android プラットフォームの署名がなく、system 権限がない
- platform_app: Android プラットフォームの署名があり、system 権限がない
- system_app: Android プラットフォームの署名と system 権限がある
- priv_app: platform 署名がないアプリ(確実に system 権限がない)、ただし Android.mk で
LOCAL_PRIVILEGED_MODULE := true
が設定されている、priv-app ディレクトリ内のアプリを確認します。