android framework系统开发总结
android framework系统开发总结:
·
android framework系统开发总结:
一,单独编译模块(前提条件:之前全编译过一遍整个系统代码)
source build/envsetup.sh
lunch
0. xxx-user
1. xxx-userdebug
// 比如编译xxx的userdebug版本,输入1 回车
make update-api && make framework && make framework-minus-apex && make framework-res && make services
// 在该系统代码的out/target/product/xxx/system目录下执行压缩framework目录:
tar -cvzf framework.tar.gz framework/ 压缩后,方便替换到手机中。
一般我是这样:
rm -rf framework.tar.gz;tar cvzf framework.tar.gz framework/;cp framework.tar.gz ~/1_temp_img/
二,打开Android Studio:
找到ubuntu工作站里,用户名为lqy_username,打开的Android studio进程,
然后kill掉后,重新打开。
ps aux | grep studio | grep lqy_username | awk {'print $2'} | xargs kill -9;~/lqy_tools/android-studio/bin/studio.sh
三,Android替换framework层jar方法
0,备份手机里的/system/framework目录,避免自己的修复导致设备启动不起来
首先解锁设备:在设置App里面,把开发者选项中的OEM解锁打开。
adb reboot bootloader(或者adb reboot fastboot)
或者按电源键+音量减键进入fastboot模式后执行:fastboot flashing unlock
然后,看着屏幕上的提示,点击音量减键,进行解锁。
fastboot reboot重启后,
执行adb root && adb remount -R,手机会自动重启。
重启手机后,执行adb root && adb remount后,这样就可以往手机里面替换文件了。
执行 adb shell 然后,cd /system/目录,
执行: tar cvzf framework.tar.gz framework/ 备份手机的framework目录文件。
1,编译framework层方法
android系统源码目录下:
source build/envsetup.sh
lunch // 输入编译工程的编号
make framework && make framework-minus-apex && make framework-res && make services
2,在源代码的out/target/product/xxx/system/目录下压缩:
tar -cvzf framework.tar.gz framework/
3,把framework.tar.gz 压缩包push到手机中进行解压
adb push framework.tar.gz /system/
4,进入到手机的/system/目录解压framework.tar.gz
tar -xzvf framework.tar.gz
完成后,删除framework.tar.gz 重启手机,即可
替换手机里面的apk也是如此。
例如,替换SystemUI.apk
> adb shell pm path com.android.systemui //查找出apk在手机中的路径。
package:/system/priv-app/SystemUI/SystemUI.apk
# adb shell
# cd /system/priv-app/SystemUI/
/system/priv-app/SystemUI/ # mv SystemUI.apk System.apk.bak // 通过修改后缀名,使其不生效,或者拷贝出去备份一下
// 如果有oat目录,把oat目录删除
> adb push SystemUI.apk /system/priv-app/SystemUI/
> adb shell pm clear com.android.systemui // 清除应用数据
> adb reboot // 重启后,替换的apk才生效
四、修改某文件后,如何找到该文件在哪个目录里
比如,修改了A文件,往A文件的父目录里一直找,
直到找到最近的Android.bp文件,找出哪个name命名的模块包含了A文件,
就 "make 模块名",编译该模块。
单独编译的模块名在:Android.bp中
例如编译services.jar的命令是:make services
在你修改的文件的最近的Android.bp中,
frameworks/base/services/Android.bp
java_library {
name: "services", // services.jar的模块名
编译framework层的jni so库:
frameworks/base/core/jni/Android.bp
frameworks/base/services/Android.bp
frameworks/base/core/jni
frameworks/base/services/core/jni
make libandroid_servers -j3 && make libandroid_runtime -j3
五、grep找出包含某个关键字的文件,输出给sed进行修改。
grep -rl -E "old_str1|old_str2" | xargs sed -i -e "s/old_str1/new_str1/g" -e "s/old_str2/new_str2/g"
grep -rl -E "old_str1" | xargs sed -i -e "s/old_str1/new_str1/g"
对修改的文件进行修改某个关键字
git diff --name-only | xargs sed -i -e "s/old_str1/new_str1/g"
如果修改后,执行了git add . 则需要添加 --cached
git diff --cached --name-only | xargs sed -i -e "s/old_str1/new_str1/g"
六、打堆栈调试
1,打印java堆栈
String st = android.util.Log.getStackTraceString(new RuntimeException());
android.util.Log.e(TAG, "lqy ===== " + st);
2,C++添加堆栈:
#include <utils/CallStack.h>
CallStack stack("xxx");
shared_libs:["libutilscallstack"]
这个方法只打印出C++中的堆栈log
3,Android S上C++堆栈log中的地址是使用 llvm-addr2line 反编译
demo:
lqy:~/sources/3_S/3_android_code/LINUX/android/out/target/product/diablo/symbols/system/lib64$ ~/sources/3_S/3_android_code/LINUX/android/prebuilts/clang/host/linux-x86/clang-r416183b/bin/llvm-addr2line -Cfe libmediaplayerservice.so 97d80
android::MediaRecorderClient::stop()
frameworks/av/media/libmediaplayerservice/MediaRecorderClient.cpp:308 (discriminator 4)
4,打印目标进程Trace
# debuggerd --help
usage: debuggerd [-bj] PID
-b, --backtrace just a backtrace rather than a full tombstone
-j collect java traces
demo:
# debuggerd -b pid
# debuggerd -j pid
kill -3 pid <=> kill -SIGQUIT pid
kill -3在/data/anr/目录中生成trace文件
5, 秒数或毫秒数转换到日期时间
date --help
@UNIXTIME[.FRACTION] seconds since midnight 1970-01-01
1493235762是秒数,如果是毫秒数的话,需要去掉后三位
$ date -d @1493235762
2017年 04月 27日 星期四 03:42:42 CST
6,jadx反编译工具反编译代码和apktool反编译资源
7,git使用相关
git 生成patch和打path 技巧
7.1, 生成patch
git format-patch -1 commitid
7.2, 打patch
//git am打patch
git am xxx.patch
有冲突的话加--rej参数,强制合入,然后,手动合入冲突的地方
git am --rej xxx.patch
gitk // git的图形化显示工具
git stach
git stach pop
git log -p // 查看详细提交记录
git diff // 显示已修改的文件
git diff --cached
修改代码后git提交步骤Demo:
git add . // 或者 git add filename
git commit //执行该命令后,填写comment,尽量详细填写修改原因
git branch -a | more // 查看当前分支名 或者 repo info .
git push origin HEAD:refs/for/当前分支名
如果此时发现又有了新的改动
git add .
git commit --amend
git push origin HEAD:refs/for/当前分支名
合并commit记录方法
如果提了多个commit提交,想把这多个commit提交合为一个提交push
例如:
本地已经commit过多次
本地已经完成多次的开发并commit,
可是未push到服务器上,如果直接push提交,
会在服务器上形成3个提交记录
git log 查看本地多次commit log
~/workspace/code/toolstest
$git log
commit 7141f9420d98bc6612184e4f004
Author: lqy
Date: Thu Dec 11 14:49:42 2022 +0800
change 3
commit 6566c4c20daa5e2f7f2b54a16ce
Author: lqy
Date: Thu Dec 11 14:47:50 2022 +0800
change 2
commit 8e9a9a8473d7dbecbbc7d6ea256
Author: lqy
Date: Thu Dec 11 14:47:37 2022 +0800
change 1
commit 649d68bc65ba97d30381399f484
Author: lqy
Date: Thu Dec 11 14:47:24 2022 +0800
have push marged
git rebase -i HEAD~3
或者
git rebase -i 649d68bc65ba97d30381399f484 // 这个commit id为要合并commit的前一个commit id
// git rebase -i后,会进入编辑界面
pick 8e9a9a8 change 3 // 第一个pick保留
s 6566c4c change 2 #s原来都是pick,手动修改为s,即把该提交合并到之前的提交里
s 7141f94 change 1
# Rebase 8d23b31..90c2471 onto 8d23b31
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
// 修改后后,wq保存退出后,自动会合并,并又进入编辑界面,此时可以编辑comment描述,保持退出即可。
8,meld文本比较工具
9,Notepad++ 分析log用
10,常用调试命令
10.1 抓log命令:
adb --help
adb logcat > d:\log.txt
adb bugreport
adb logcat -b kernel
adb logcat -b events
抓取多个关键字的log demo:
adb shell // 进入手机中
logcat | grep -i -E "start u0|ActivityTaskManager|WindowManager" --color
adb root
adb remount -R
adb reboot //重启手机
adb reboot -p // 关机
10.2 进程显示
ps -A | grep system_server // 查看system_server进程id
实时显示进程使用情况
top --help
top
top -H
top -m
top -m 5 -d 2 // 每个2秒显示top前5个进程
10.3 /proc/cmdline 提取信息内核启动参数
# cat /proc/cmdline 提取信息内核启动参数
kasan.stacktrace=off stack_depot_disable=off kvm-arm.mode=protected cgroup_disable=pressure cgroup.memory=nokmem page_owner=on no_hash_pointers panic_on_taint=0x20 console=ttyMSM0,115200n8 loglevel=7 kpti=0 log_buf_len=1M kernel.panic_on_rcu_stall=1 swiotlb=noforce loop.max_part=7 cgroup.memory=nokmem,nosocket pcie_ports=compat service_locator.enable=1 msm_rtb.filter=0x237 allow_mismatched_32bit_el0 cpufreq.default_governor=performance pelt=8 kasan=off rcupdate.rcu_expedited=1 rcu_nocbs=0-7 irqaffinity=0-3 ftrace_dump_on_oops pstore.compress=none fsa4480_i2c.async_probe=1 can.stats_timer=0 video=vfb:640x400,bpp=32,memsize=3072000 bootconfig buildvariant=userdebug raid_enabled=true msm_drm.dsi_display0=qcom,mdss_dsi_samsung_ams692yt01_dsc_cmd: rootwait ro init=/init
10.4 打开关闭selinux
getenforce
setenforce 0 // 关闭selinux
setenforce 1 // 打开selinux
10.5 Android 调试数据库技巧:adb shell content命令应用
adb shell content命令应用应用实例:
1,打印mediaprovider数据库中external.db数据库中的images表的所有记录数据。
adb shell content query --uri content://media/external/images/media > D:\1_external_images_media_log_002.txt
2,打印mediaprovider数据库中external.db数据库中的file表的所有记录数据。
adb shell content query --uri content://media/external/file > D:\2_external_file_log_002.txt
3,打印mediaprovider数据库internal.db数据库中的audio表中的所有记录数据。
adb shell content query --uri content://media/internal/audio/media
10.6 adb shell settings数据库调试技巧
adb shell settings数据库调试技巧
settings --help
adb shell // 进入手机中
$ dumpsys settings
10.7 input调试
adb shell sendevent
// 查看input设备用的是哪个kl文件
dumpsys input | grep kl -C 10
例如:
设备里的:/system/usr/keylayout/Generic.kl
对应的是代码里的:frameworks/base/data/keyboards/Generioc.kl
// 查看input设备支持报哪些key事件
getevent -lp
// 查看input上报的input事件
getevent -l
getevent
sendevent命令模拟按下音量减键:
例如,通过getevent -lp查看到
0x72(十六进展) = 114(十进制)
adb shell sendevent /dev/input/event1 0001 0114 00000001 && \
adb shell sendevent /dev/input/event1 0000 0000 00000000 && \
adb shell sendevent /dev/input/event1 0001 0114 00000000 && \
adb shell sendevent /dev/input/event1 0000 0000 00000000
adb shell // 进入手机中
$ getevent
$ getevent -l
$ getevent -ilp
$ dumpsys input
$ input keyevent 3 // KeyEvent.KEYCODE_HOME
$ input keyevent KEYCODE_POWER
Input模块的两个映射表
1,android中的两个按键映射表
kl文件映射表:
用于从linux扫描码映射到根据按键功能命名的字符串标签。
frameworks/base/data/keyboards/xxx.kl
如:Generic.kl
...
key 113 VOLUME_MUTE
key 114 VOLUME_DOWN
key 115 VOLUME_UP
key 116 POWER
...
在手机的/system/usr/keylayout中
InputEventLabels.h中的KEYCODES[]映射表:
static const InputEventLabel KEYCODES[] = {
...
DEFINE_KEYCODE(VOLUME_UP),
DEFINE_KEYCODE(VOLUME_DOWN),
DEFINE_KEYCODE(POWER),
...
DEFINE_KEYCODE(SLEEP),
DEFINE_KEYCODE(WAKEUP),
DEFINE_KEYCODE(PAIRING),
...
}
用于字符串标签映射到Android Keycode
frameworks/native/include/android/keycodes.h
...
AKEYCODE_VOLUME_UP = 24,
AKEYCODE_VOLUME_DOWN = 25,
AKEYCODE_POWER = 26,
...
AKEYCODE_SYSRQ = 120,
...
打开开发者选项中的“显示点按操作反馈”调试开关命令:
adb shell settings put system show_touches 1
打开开发者选项中的“指针位置”调试开关命令:
adb shell settings put system pointer_location 1
或者:通过 && 把两条命令,在终端里同时执行。
adb shell settings put system show_touches 1 && adb shell settings put system pointer_location 1
10.8 调试动画
在开发者选项中:
把“窗口动画缩放”改成最大10x
把“过渡动画缩放”改成最大10x
把“Animator时长缩放”改成最大10x
命令方式:
adb shell settings put global animator_duration_scale 10
adb shell settings put global transition_animation_scale 10
adb shell settings put global window_animation_scale 10
或者:
adb shell settings put global animator_duration_scale 1 && adb shell settings put global transition_animation_scale 1 &&adb shell settings put global window_animation_scale 1
或者:
adb shell settings put global animator_duration_scale 10 && adb shell settings put global transition_animation_scale 10 &&adb shell settings put global window_animation_scale 10
10.9 dumpsys调试命令
$ dumpsys --help
$ dumpsys -l
$ dumpsys activity -h
$ dumpsys activity
$ dumpsys window -h
$ dumpsys window
logcat -b events | grep wm_ --color
10.10 grep多个关键字
grep -r -i -E "android|os" --include "*.java" --color
10.11 pm命令
pm -h
pm clear com.android.systemui // 清除应用数据
pm list features
// dumpsys user 和 dumpsys account中能看到UserInfo{0:null:c13} 0就是userid
pm remove-user USER_ID
# pm path com.android.systemui
package:/system/priv-app/SystemUI/SystemUI.apk
force stop某些包(类似 设置->应用管理->某个App应用信息->强制停止)
$ su
# pm disable com.google.android.gms
Package com.google.android.gms new state: disabled
# ps -A | grep gms
# pm enable com.google.android.gms
Package com.google.android.gms new state: enabled
# ps -A | grep gms
u0_a138 14619 976 17322328 166340 do_epoll_wait 0 S com.google.android.gms.persistent
u0_a138 14620 976 17310216 159436 do_epoll_wait 0 S com.google.android.gms
pm grant [--user USER_ID] PACKAGE PERMISSION
pm revoke [--user USER_ID] PACKAGE PERMISSION
//dumpsys package com.android.systemui 能够看到相应权限是否授予
# pm revoke com.android.systemui android.permission.BLUETOOTH_SCAN
# pm grant com.android.systemui android.permission.BLUETOOTH_SCAN
adb shell cmd package query-activities --brief -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
10.12 am命令
log:
ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.android.settings/.Settings bnds=[540,1233][792,1602]} from uid 10070 ,pid=3560
am start -n com.android.settings/.Settings -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
am start -n com.android.settings/.Settings
//--windowingMode 指定窗口模式 WindowConfiguration.java WINDOWING_MODE_FREEFORM = 5 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY = 3
am start -n com.android.settings/.Settings --windowingMode 5
10.13 bmgr命令
10.13 svc命令
10.14 cmd overlay查看系统字符串资源
adb shell cat /sys/class/backlight/panel0-backlight/brightness
$ cmd overlay lookup com.android.providers.settings com.android.providers.settings:bool/def_screen_brightness_automatic_mode
$ cmd overlay lookup android android:integer/config_screenBrightnessSettingMaximum
255
$ cmd overlay lookup android android:integer/config_screenBrightnessSettingMinimum
$ cmd overlay lookup android android:integer/config_screenBrightnessSettingDefault
$ cmd overlay lookup android android:dimen/config_screenBrightnessSettingMinimumFloat
$ cmd overlay lookup android android:dimen/config_screenBrightnessSettingMaximumFloat
$ cmd overlay lookup android android:dimen/config_screenBrightnessSettingDefaultFloat
cmd overlay lookup android android:dimen/config_screenBrightnessDimFloat
$ cmd overlay lookup android android:array/config_autoBrightnessLevels
$ cmd overlay lookup android android:array/config_autoBrightnessDisplayValuesNits
$ cmd overlay lookup android android:array/config_screenBrightnessNits
$ cmd overlay lookup android android:array/config_screenBrightnessBacklight
$ cmd overlay lookup android android:fraction/config_autoBrightnessAdjustmentMaxGamma
10.15 调试命令研究
/system/bin
/vendor/bin
dumpsys -l
cmd -l
例如:在/system/bin看到如下命令,了解怎么用
// 截图命令
screencap --help
// 录屏命令
screenrecord --help
11、google android 网址
https://issuetracker.google.com
https://drive.google.com
https://developer.android.google.cn
android源代码review:https://android-review.googlesource.com/q/status:open
android代码在线浏览:https://cs.android.com/
12、常用log关键字
adb shell进入手机:
// activity和window生命周期状态相关log
$ logcat -b events | grep -i -E "am_|wm_" --color
// 应用crash,系统crash,native crash 相关log
$ logcat | grep -i -E "AndroidRuntime|SYSTEM PROCESS|DEBUG :|ActivityManager: ANR" --color
// 查看启动activity信息,哪个pid启动的。pid需要自己添加
$ logcat | grep -i -E "start u0" --color
ActivityTaskManager: START u0 {act=android.intent.action.MAIN flg=0x14000000 cmp=com.android.compatibility.common.deviceinfo/.GlesStubActivity (has extras)} from uid 10221 ,pid=8936
ActivityManager: ANR
*** FATAL EXCEPTION IN SYSTEM PROCESS
Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS:
native crash log: "DEBUG : pid"
13, Android S:cmd window logging 和 dumpsys window logging 调试WMS功能
$ cmd window logging
Unknown command
Window manager logging options:
start: Start proto logging
stop: Stop proto logging
enable [group...]: Enable proto logging for given groups
disable [group...]: Disable proto logging for given groups
enable-text [group...]: Enable logcat logging for given groups
disable-text [group...]: Disable logcat logging for given groups
Not handled, calling status bar with args: []
$ dumpsys window logging
WINDOW MANAGER LOGGING (dumpsys window logging)
ProtoLog status: Disabled
Enabled log groups:
Proto: TEST_GROUP WM_DEBUG_ADD_REMOVE WM_DEBUG_APP_TRANSITIONS WM_DEBUG_APP_TRANSITIONS_ANIM WM_DEBUG_BOOT WM_DEBUG_CONFIGURATION WM_DEBUG_CONTAINERS WM_DEBUG_DRAW WM_DEBUG_FOCUS WM_DEBUG_FOCUS_LIGHT WM_DEBUG_IME WM_DEBUG_IMMERSIVE WM_DEBUG_KEEP_SCREEN_ON WM_DEBUG_LOCKTASK WM_DEBUG_ORIENTATION WM_DEBUG_RECENTS_ANIMATIONS WM_DEBUG_REMOTE_ANIMATIONS WM_DEBUG_RESIZE WM_DEBUG_SCREEN_ON WM_DEBUG_STARTING_WINDOW WM_DEBUG_STATES WM_DEBUG_SWITCH WM_DEBUG_SYNC_ENGINE WM_DEBUG_TASKS WM_DEBUG_WINDOW_MOVEMENT WM_DEBUG_WINDOW_ORGANIZER WM_DEBUG_WINDOW_TRANSITIONS WM_ERROR WM_SHOW_SURFACE_ALLOC WM_SHOW_TRANSACTIONS
Logcat: WM_DEBUG_FOCUS_LIGHT WM_DEBUG_WINDOW_TRANSITIONS WM_ERROR
Logging definitions loaded: 604
例如:
$ logcat | grep findFocusedWindow // 抓取findFocusedWindow相关的log
在DisplayContent.java中,有如下代码:
ProtoLog.v(WM_DEBUG_FOCUS_LIGHT, "findFocusedWindow: Found new focus @ %s", w);
正常情况下,logcat中不会输出上面的log。
但通过如下命令打开调试log后,在logcat中就会输出上面的log:
$ cmd window logging enable-text WM_DEBUG_FOCUS_LIGHT
14, 替换系统apk的方法
替换系统apk的方法是:
$ adb root && adb remount
然后,拿home桌面(包名: com.android.launcher)举例:
$ adb shell pm path com.android.launcher
package:/system/priv-app/Launcher/Launcher.apk
$ adb shell
# cd /system/priv-app/Launcher/
# /system/priv-app/Launcher # ls
Launcher.apk oat
// 删除oat目录
/system/priv-app/Launcher/ # rm -rf oat
// 删除Launcher.apk或修改后缀名也相当于删除
/system/priv-app/Launcher/ # mv Launcher.apk Launcher.apk.bak
然后
// 下面这句命令是:把myLauncher.apk push到/system/priv-app/Launcher/目录,并重命名为Launcher.apk
$ adb push myLauncer.apk /system/priv-app/Launcher/Launcher.apk
$ adb shell pm clear com.android.launcher
$ adb reboot
重启设备,就能替换生效
15、aidl和hidl
aidl:
out_sys/host/linux-x86/bin/aidl -I./frameworks/base/core/java/ -p./prebuilts/sdk/current/public/framework.aidl ./frameworks/base/core/java/android/window/IWindowOrganizerController.aidl
hidl:
make hidl-gen
~/sources/3_S/qssi_only/LINUX/android$ hidl-gen -o . -L java android.hardware.tests.baz@1.0
全编译时,保持编译时log到文件中
make all 2>&1 | tee build_log.txt
更多推荐
已为社区贡献5条内容
所有评论(0)