SystemUI开发

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

相关推荐
陈随易11 分钟前
AI新技术VideoTutor,幼儿园操作难度,一句话生成讲解视频
前端·后端·程序员
Pedantic14 分钟前
SwiftUI 按钮Button:完整教程
前端
前端拿破轮16 分钟前
2025年了,你还不知道怎么在vscode中直接调试TypeScript文件?
前端·typescript·visual studio code
代码的余温18 分钟前
DOM元素添加技巧全解析
前端
JSON_L21 分钟前
Vue 电影导航组件
前端·javascript·vue.js
用户214118326360229 分钟前
01-开源版COZE-字节 Coze Studio 重磅开源!保姆级本地安装教程,手把手带你体验
前端
大模型真好玩43 分钟前
深入浅出LangChain AI Agent智能体开发教程(四)—LangChain记忆存储与多轮对话机器人搭建
前端·人工智能·python
帅夫帅夫1 小时前
深入理解 JWT:结构、原理与安全隐患全解析
前端
Struggler2811 小时前
google插件开发:如何开启特定标签页的sidePanel
前端
爱编程的喵1 小时前
深入理解JSX:从语法糖到React的魔法转换
前端·react.js