1.代码下载
如果只在systemui项目工作可以直接打开MiuiSystemUI项目即可,如果想要framework代码导入及在线调试可以参考:Android Studio在线调试Android Framework Java代码
查看机型信息:设备列表
mk相关知识:理解 Android Build 系统 bp编译:Android 编译之android.bp
编译ROM包:Corgi编译平台
下载内部ROM包:Corgi-制品管理-Rom 选择线刷包、userdebug、Rom和对应机型版本。pre为测试版,stable稳定版
刷机步骤1:刷机教程
刷机步骤2-在线刷机:corg搜索Rom包后,选择一键刷机。
获取root权限:adb root,adb remount
进入fastboot模式:adb reboot bootloader,sudo fastboot
执行刷机脚本:sudo ./flash_all.sh(./flash_all_except_storage.sh ./flash_all_except_data_storage.sh )
跳过开机引导:adb shell settings put global device_provisioned 1
禁止进入recovery模式:adb shell setprop persist.sys.disable_rescue true
禁止弹出USB弹窗:adb shell setprop miui.usb.dialog 0
解锁System分区执行:adb disable-verity
强制更新所有代码:repo sync --force-sync
指定文件类型查找:find . -name "*.xx" | xargs grep xxxx
关闭odex:WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY=true
2.代码编译
编译中需要注释掉python命令
Rom 需为 USERDEBUG 包
adb push MiuiSystemUI.apk /system/priv-app/MiuiSystemUI/ R Miui12及之前
adb push MiuiSystemUI.apk /system_ext/priv-app/MiuiSystemUI/ R Miui12.5及之后
重启com.android.systemui进程:
adb shell ps -A | grep systemui
adb shell kill pid
3. 查看日志
代码中默认只会打印部分log,可进入调试模式打开开关,查看详细的log:
进入Debug模式:adb shell setprop debug.miuisystemui.staging true,重启进程。
查看手机IP:adb shell ip route
查看NMS日志:adb root;adb shell setprop log.tag.NotificationService D;adb shell stop;adb shell start;
可过滤相应的tag查看某个类的日志:adb logcat | grep StatusBar
可实时查看通知相关日志:adb logcat -b events | grep notification_
SystemUI的系统日志:adb logcat -b events | grep sysui_ (锁屏状态:sysui_status_bar_state)
锁屏:KeyguardDisplayManager(show锁屏,hide解锁)
桌面角标相关:Tag(Launcher.ApplicationsMessage) Broadcast(android.intent.action.APPLICATION_MESSAGE_UPDATE)
另一部分较为重要的是 dump 日志,主要用来记录当前状态信息,可查看代码中的dump()方法了解日志内容:
查看通知和状态栏信息:adb shell dumpsys activity service SystemUIService
查看通知信息:adb shell dumpsys notification --noredact
查看内存信息:adb shell dumpsys meminfo
systrace:python systrace.py am wm disk memreclaim mmc res sched freq binder_driver binder_lock dalvik pagecache database pm bionic rs gfx input view sm aidl sched freq idle
OpenGL api:adb shell setprop debug.egl.trace systrace & adb shell stop & adb shell start
查看Window信息:adb shell dumpsys window windows
查看SurfaceFlinger信息 adb shell dumpsys SurfaceFlinger
循环dump例如: adb shell "while true; do dumpsys SurfaceFlinger;done" > dump.SF.log
SystemUI LogBuffer: adb shell dumpsys activity service com.android.systemui/.SystemUIService buffers 也可以是部分buffer(NotifLog、NotifSectionLog、NotifInteractionLog、QSLog)等
查看Activity/Broadcasts/Service信息:adb shell dumpsys activity activities/broadcasts/services 更多ams知识可以参考AMS专栏
抓取内存hprof文件:adb shell am dumpheap com.android.systemui /data/local/tmp/sysui.hprof
跑monkey:adb shell monkey -v -v --throttle 500 --pct-touch 20 --pct-motion 25 --pct-nav 20 --pct-majornav 15 --pct-appswitch 5 --pct-anyevent 15 --pct-trackball 0 --pct-syskeys 0 --ignore-crashes --monitor-native-crashes --bugreport 500000000 logcat_file=logcat.txt >log.txt
常见其他服务:DUMP OF SERVICE statusbar,notification,audio,vibrator,battery,batterystats,settings
打印trace:Log.d(TAG, Log.getStackTraceString(new Throwable()));
查看sp及数据库:data/user_de/0/com.android.systemui/databases(/shared_prefs)
锁屏通知显示规则:lock_screen_allow_private_notifications 人脸解锁:face_unlock_success_show_message
内存&ANR:搜索"pid 进程id",或者搜索"Cmd line: com.android.systemui"
查看Log.isLoggable(TAG, Log.DEBUG):adb shell setprop log.tag.TAG D
批量更改文件内容:grep "DEBUG = false" -rl ./ | xargs sed -i "s/DEBUG = false/DEBUG = true/g"
系统跟踪:adb pull /data/local/traces/ .
atrace转换:python2.7 ~/Android/Sdk/platform-tools/systrace/systrace.py --from-file XXXX
手机温度过高:ThermalTempInfoHelper,PowerKeeper.Thermal
4. 代码上传
查看所有远程分支:git branch -a
查看当前分支:git branch -vv
切一个临时分支:git checkout -b fix_bug -t m/alpha
查看改动内容:git diff
上传改动内容:repo upload . [--cbr] [--draft] [--no-verify]
Git忽略.idea文件夹:编辑 .git/info/exclude,添加目录
删除当前目录下没有被track过的文件和文件夹:git clean -df
Comment规范:Commit Message规范
常用类别:BugFix,Feature,Stability,Performance,Improvement,CTS。
git push ssh://@gerrit.pt.mioffice.cn:29418/platform/packages/apps/MiuiSystemUI/ <local_branch>:refs/for/<remote_branch>
5. 日常必备
adb shell cmd uimode night [yes|no|auto]
adb启动Activity:adb shell am start -n "包名/包名+类名" --es name string --ez name bool --ei name int -f flag
adb发广播:adb shell am broadcast -a action --es name string --ei name int -f flag
网络调试,需查看手机IP地址:
adb tcpip 1234
adb connect 10.232.92.137:1234
编译framework:make framework,生成 /system/framework/framework.jar
编译framework-res:make framework-res,生成 /system/framework/framework-res.apk
编译Settings:make Settings,生成 /system/priv-app/Settings/Settings.apk
查看/更改Settings值:adb shell settings --user userid get/put global key value
查看/更改Properties值:adb shell getprop/setprop key value
查看手机屏幕:adb shell wm size/density
自定义快捷命令:gedit ~/.bashrc,执行kk重启systemui进程,执行pp sagit将push对应机型的MIUISystemUI.apk
bash
function _kill_systemui() {
echo kill systemui...
adb shell kill `adb shell toybox pgrep systemui`
sleep 1
echo done pid: `adb shell toybox pgrep systemui`
}
alias kk=_kill_systemui
function _push_systemui() {
echo push apk...
adb push /home/mi/miui/v9-o-sagit-alpha/out/target/product/$1/system/priv-app/MiuiSystemUI/MiuiSystemUI.apk /system/priv-app/MiuiSystemUI/
kk
}
alias pp=_push_systemui
6. 常用测试方法
1. 进入 Debug 模式
adb root adb shell setprop debug.miuisystemui.staging true adb shell ps -A | grep systemui adb shell kill pid
2. 低电量通知测试
在锁屏状态下,设置手机断电:adb shell dumpsys battery unplug 设置手机电量为19%:adb shell dumpsys battery set level 19 恢复手机充电状态:adb shell dumpsys battery reset
3. 模拟应用发通知
SystemUI进入Debug模式。
安装Whale apk:whale26.apk
在Whale主界面右上角点击"设置",点击"Mock"选择要模拟的应用。
4. dark mode
adb shell cmd uimode night [yes|no|auto]
5. 强制执行JOB
1 执行命令获取JOB_ID
adb shell dumpsys jobscheduler | grep SettingsJobSchedulerService
JOB #1000/300002: c21c59b com.android.systemui/.analytics.SettingsJobSchedulerService(红色字体即为JOB_ID)
2 强制执行JOB
adb shell cmd jobscheduler run -f com.android.systemui JOB_ID(第一步获取的JOB_ID)
6.1 使用adb push命令传输文件,报错Remote couldn't create file:Read-only file system
解决方法:
执行adb root
adb disable-verity
adb reboot
再次 adb root
adb remount
adb push即可使用
再次输入adb push就能正常传输文件了
构建的版本只能是userdebug版本,并且是manifest是debug版本的才能push
可能需要刷Root版本或者自己构建
7. Code Style
代码风格约定了文件的组织样式,包含如缩进,换行长度等等配置信息。
Android中定义了AndroidStyle.xml,具体见opengrok.pt.xiaomi.com/opengrok2/x...
由于历史原因,我们使用这个AndroidStyle.xml。
使用方法:
AndroidStudio->File->Settings->Editor->Code Style->JAVA->Scheme->右侧设置按钮->Import Scheme