修改 framework 代码的经验和踩过的坑

修改 framework 代码的经验和踩过的坑

1 经验

  • 源码主要目录结构
目录 子目录 子目录 描述
android/frameworks/base core java/com/android/ 和 java/android/view/ 音量调节的代码位置;涉及部分关机逻辑代码;android 的核心源代码
- packages SystemUI SystemUI 目录是亮度调节、WiFi状态改变的代码;android 系统界面代码
- policy src/com/android/internal/policy/impl 系统关机界面的部分代码

Note:具体 java 文件和布局文件位置在后文说明。以下所有的命令都是在 android 目录中执行。

  • 配置环境变量

初次进入 Ubuntu 系统,或者切换用户后,需要重新配置编译环境,命令如下:

source build/envsetup.sh
lunch mgm-eng
  • mmm 编译

mmm 命令只能编译有 Android.mk 文件的目录,并且它有个特点,我称之为最小单位编译,什么意思呢,就是最小单位编译咯。。。

啊,,,啊,壮士,请放下你手中愤怒的西瓜刀!!!听我解释…
所谓最小单位编译,就是如果你改了一个目录的代码,比如修改了 android/frameworks/base/core/res/res/layout/ 目录下的布局文件,而该路径中,base/ 目录和第一个 res/ 目录都包含 Android.mk 文件,这个时候,你必须编译 res/ 目录,命令如下:

mmm frameworks/base/core/res/

编译后的文件路径如下图所示:(图片仅供参考,实际情况实际考虑)

Note:上图编译的路径是:frameworks/base/packages/SystemUI/

  • 文件推送

代码编译后,会形成一个 jar 文件或 apk 文件,这个时候就可以推送到设备中进行测试,但是,但是来了哦,在推送之前一定要先进行拉取,先把设备中的对应文件进行备份保存,命令如下:

//拉取 framework.jar 和 framework2.jar 进行备份保存
adb pull /system/framework/framework.jar
adb pull /system/framework/framework2.jar

//拉取 SystemUI.apk 进行备份保存
adb pull /system/priv-app/SystemUI.apk

拉取的文件路径问题,请参考上一步图片中的路径,都是对应的: /system/…
拉取保存后,就可以放心的推送了,哈哈:

adb push out/target/product/.../system/priv-app/SystemUI.apk /system/priv-app/

推送完成后,就可以重启设备,查看修改效果了,命令如下:

adb shell
stop && start
//查看设备log的命令:logcat
//退出命令:exit

2 令人不爽的坑

  • 推送,拉取时不成功

在推送或拉取时,可能报 read-only 的错误,这个表示设备没有挂载成功,执行命令挂载即可:

adb remount
  • 测试时莫名奇妙崩溃

这是个大坑,测试的时候,程序崩溃,查看日志有错误日志,但是跟我修改的代码没有半毛钱的关系,开始不太在意,后来折腾了一个下午,抱着最后的希望,将所有能推的 jar 包和 apk 文件都推送了一遍,卧槽槽槽,居然成了~~我一脸懵逼的状态…

后来琢磨出来,可能是从新编译的包,其他地方的一些资源引用不成功导致。还是上面的例子,如果你修改了 android/frameworks/base/core/res/res/layout/ 目录下的布局文件,编译完 res/ 目录后,还需要编译 base/ 目录,然后两次编译生成的 jar 包和 apk 文件,都要推送,才能确保万无一失。

  • 第一次拿设备推送

这是上一个问题的升级版,如果你只推送你需要测试的 jar 包或 apk 文件,你也会一脸懵逼的,设备会有莫名的错误日志,正在你怀疑系统出问题的时候,就差说出 wtf 的时候,你把所有修改过的 jar 包和 apk 文件都进行推送后,bug 好了。。。好吧,我错了,系统赢了。

由于公司测试设备很紧俏,你测试的时候,不一定就是上次测试的设备,这个时候,如果你只 push 你需要测试的 jar 包,系统 jar 包之间互相引用的时候,会出现找不到资源的错误,so,你要将所有修改过的 jar 包和 apk 文件都进行 push,目前文件列表如下:

framework.jar
framework2.jar
framework-res.apk
android.policy.jar
services.jar
SystemUI.apk
  • 设备启动,界面不显示

电源的电压不够,设备带不起来

  • 设备连接不成功,不识别

usb 连接线太长,电阻较大,电流不够

  • 相关代码路径

音量调节定位java文件,740行左右:

android/frameworks/base/core/java/android/view/VolumePanel.java(280行)

布局文件:

core/res/res/layout/volume_adjust_item.xml 

core/res/res/layout/volume_adjust.xml 

亮度调节:

android/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/ToggleSlider.java

packages/SystemUI/res/layout/status_bar_toggle_slider.xml

packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml 

关机界面:

android/frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java

android/frameworks/base/core/java/com/android/internal/app/AlertController.java

base/services/java/com/android/server/power/ShutdownThread.java

base/core/res/res/values/symbols.xml

wifi无网浮层提示:

frameworks/base/services/java/com/android/server/wifi/WifiNotificationController.java

packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java

packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java

你可能感兴趣的:(Android)