修改framework后如何编译、生效!生效!
被framework生效问题困了一天, 一定要记下来。试了网上各种答案,得到的结果都没生效。最终还是从同事那里得到的一份答案,还是同事靠谱啊。
一、framework编译方法
一般修改framework层的内容分为两种,一种是res,一种是源代码。前者只需要在其目录下,通过mm的方式即可将framework-res.apk
编译出来,并且通过将其push到手机/system/framework/
目录下,可即时生效。后者则有一箩筐要说。
遇到了修改res
下的内容,生成framework-res.apk
后推到手机里面后,出现无法开机、资源无法找到的问题。困惑了很久,后来慢慢意识到可能是当前手机的系统版本的原因。手机当前的系统为客户分支系统,而当前的framework-res.apk
编译自master
分支,客户分支当然有很多master
分支没有的东西,所以推送到客户分支所编译出来的系统之后,出现了资源无法找到等奇怪的错误。正确的姿势是将当前的手机系统,刷成master分支所编译出来的系统,然后再进行操作。这个坑靠着自己的直(xia)觉(meng)怕了出来。
1.使用m命令编译framework只有在系统初次编译后第一次使用有效,之后编译会失败,需使用make命令。
2.编译命令及解释
编译指令 | 解释 |
---|---|
m |
在源码树的根目录执行编译 |
mm |
编译当前路径下所有模块,但不包含依赖 |
mmm [module_path] |
编译指定路径下所有模块,但不包含依赖 |
mma |
编译当前路径下所有模块,且包含依赖 |
mmma [module_path] |
编译指定路径下所有模块,且包含依赖 |
make [module_name] |
无参数,则表示编译整个Android代码 |
下面列举部分模块的编译指令:
模块 | make命令 | mmm命令 |
---|---|---|
init | make init |
mmm system/core/init |
zygote | make app_process |
mmm frameworks/base/cmds/app_process |
system_server | make services |
mmm frameworks/base/services |
java framework | make framework |
mmm frameworks/base |
framework资源 | make framework-res |
mmm frameworks/base/core/res |
jni framework | make libandroid_runtime |
mmm frameworks/base/core/jni |
binder | make libbinder |
mmm frameworks/native/libs/binder |
·对于make命令,模块名称未确定时,到相应目录下Android.mk文件中查找 LOCAL_PACKAGE_NAME 值。
通过上面的方法,可以编译成功得到framework.jar
文件,但是将其push到/system/framework/
后,则不一定会生效。
二、如何让它生效?
一般网上看到的做法是这样:
方法一:
将编译所生成的framework.jar
推送到手机相应的位置,重启,看是否生效。如果没有生效,则继续删除/system/framework/arm
目录和/system/framework/arm64
目录中的boot.art
和boot.oat
删除掉,之后重启机器。
如果这样操作后还是不生效该怎么办?
方法二:
在源代码的根目录,初始化好环境之后,在源代码的根目录下使用make snod
,重新打包生成system.img
,然后通过fastboot flash system %src_dir%\system.img
,将新生成的system.img
刷入手机,然后重启。
很遗憾,我还是没有生效。我把上面两者结合起来还是没有生效。。
方法三:
较为花式,请慎重服用。但这种近乎重新刷机的做法,感觉一定会生效。
修改好了framework
里面的东西之后,全局编译一次,然后将编译得到的结果刷入手机。
注意事项:
- 如果在修改
framework
之前就已经进行过全局编译操作,那么在修改后,再进行全局编译,速度则非常快。 - 如果在修改之后,还进行了
git pull
操作拉取了其他人对代码的修改,那么此次全局编译的速度就未知,不过基本上很慢。
修改framework后如何编译、生效!生效!