修改 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.shlunch 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.jaradb 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 shellstop && 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.jarframework2.jarframework-res.apkandroid.policy.jarservices.jarSystemUI.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.javapackages/SystemUI/res/layout/status_bar_toggle_slider.xmlpackages/SystemUI/res/layout/quick_settings_brightness_dialog.xml 

关机界面:

android/frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.javaandroid/frameworks/base/core/java/com/android/internal/app/AlertController.javabase/services/java/com/android/server/power/ShutdownThread.javabase/core/res/res/values/symbols.xml

wifi无网浮层提示:

frameworks/base/services/java/com/android/server/wifi/WifiNotificationController.javapackages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.javapackages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java

更多相关文章

  1. 在Android设备与Mac电脑之间传输文件
  2. android中文件IO
  3. Android 常用UI控件的一些属性设置(在.xml文件里进行的设置)
  4. Windows电脑:Android Studio 连接不上设备真机测试的问题
  5. 如何检索Android设备的唯一ID
  6. Android多媒体开发(5)————利用Android AudioTrack播放mp3文件
  7. android常用颜色代码定义
  8. android设备信息获取
  9. AndroiManifest.xml文件中android属性

随机推荐

  1. 如何获取和安装Android(安卓)L开发者预览
  2. Android:学习AIDL,这一篇文章就够了(下)
  3. Android无障碍服务三 创建辅助功能服务
  4. android自定义相机拍照
  5. 一起来开发Android的天气软件(一)——功能
  6. Android(安卓)App列表之圆角ListView
  7. 【Android】Handler使用入门 处理耗时较
  8. Android应用程序开发以及背后的设计思想
  9. Android之Handler的用法
  10. Android触摸滑动全解(三)——View坐标体系