修改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.artboot.oat删除掉,之后重启机器。

如果这样操作后还是不生效该怎么办?

方法二:

在源代码的根目录,初始化好环境之后,在源代码的根目录下使用make snod,重新打包生成system.img,然后通过fastboot flash system %src_dir%\system.img,将新生成的system.img刷入手机,然后重启。

很遗憾,我还是没有生效。我把上面两者结合起来还是没有生效。。

方法三:

较为花式,请慎重服用。但这种近乎重新刷机的做法,感觉一定会生效

修改好了framework里面的东西之后,全局编译一次,然后将编译得到的结果刷入手机。

注意事项:

  • 如果在修改framework之前就已经进行过全局编译操作,那么在修改后,再进行全局编译,速度则非常快。
  • 如果在修改之后,还进行了git pull操作拉取了其他人对代码的修改,那么此次全局编译的速度就未知,不过基本上很慢。

修改framework后如何编译、生效!生效!

https://eucham.me/2018/03/14/53dea99bd910.html

作者

遇寻

发布于

2018-03-14

更新于

2022-04-21

许可协议

评论