• 译android framework层的资源文件


    1、将资源放入 frameworks/base/core/res/res/ 中的相应目录,假设要添加的资源是 drawable 类型,文件名为 test(后缀可能为xml或者png等等),则将文件放入 frameworks/base/core/res/res/drawable*/ 下。

    2、仿照已有的同类型系统资源修改 framework/base/core/res/res/values/public.xml,public.xml中有两种类型的资源描述,一种是<java-symbol/>系统私有的资源(不对app公开),另一种是<public />公共资源(可以在app中访问)。

    如果要添加的资源是私有的,则加上 <java-symbol type="drawable" name="test" />(不需要id),如果是公共的则先找到最后一个type为 drawable 的 public 项,4.1.2系统中最后一项为<public type="drawable" name="dialog_holo_light_frame" id="0x010800b3" />,然后添加一句 <public type="drawable" name="test" id="0x010800b4" />,即id为最后一个的id+1(为了避免 id 冲突)

    3、在 frameworks/base/core/res/ 中执行mm,编译后生成framework-res.apk 并会更新com.android.internal.R,该 R 所对应的文件为 /out/target/common/R/com/android/internal/R.java,可以在该文件中查看自己的资源是否已经加进去了。(如果mm出错可以尝试先执行一下“touch 资源文件”命令)

    4、如果添加的是公共资源,则还需要在源码目录下执行 make update-api 以更新 frameworks/base/api/current.txt 文件。

    5、完成之后需要重新编译framework,如果单编framework模块则在源码根目录下make -j4 framework,全编make -j4即可。

    另外,如果要在系统中添加一个新的id,比如为myid,则上述第一步改为在 frameworks/base/core/res/res/values/ids.xml 中增加一列<item type="id" name="myid" />,之后的步骤都一样。

    6、在编译资源过程中可能会遇到一些奇怪的问题,比如有时候许多图标会显示错误,原因猜测跟重新编译资源有关,可以试着重新编译services.jar并替换看看.

    举一个例子:假如我想在WindowManagerService.java中使用一个图片资源pic.png.顺序如下.

    1,将文件pic.png拷贝到位置:frameworks/base/core/res/res/drawable下.

    2,在frameworks/base/core/res/res/drawable目录下执行touch pic.png.

    3,进入目录frameworks/base/core/res/ 执行mm命令, 编译 framework-res.apk

    4,执行完后com.android.internal.R 会新生成一个R.drawable.pic的引用.在程序中使用即可.

    5,在目录frameworks/base/ 下执行mm 编译 framework.jar.

    6,在frameworks/base/services/java/com/android/server 下的WindowManagerService.java中使用com.android.internal.R.drawable.pic,使用完后保存文件.

    7,进入目录frameworks/base/services/java/ 执行mm 编译  services.jar

    8,替换机器上(虚拟机或者真机)的jar apk文件,编译出的包在out/target/product/xxxx/system/framework下

      adb push framework-res.apk /system/framework/

      adb push services.jar /system/framework/

      adb push framework.jar /system/framework/

      执行命令时注意framework-res.apk 的真实路径.

    9,adb reboot 机器,查看修改结果.大功告成!

    注:在4.2源码中,将系统私有资源分离成了单独的文件symbols.xml,公共资源仍然在public.xml中。

    symbols.xml 和 public.xml的作用是一样的。
    区别:
    symbols.xml定义的资源进入到com.android.internal.R.java(私有资源),
    public.xml定义的资源进入到android.R.java(公有资源),
    并不是严格定义,在一个xml文件里也可以通过不同的标签来控制资源是公共的还是私有的。

  • 相关阅读:
    java基础之java今生前世
    java线程的方便调用方式
    await和async更多的理解
    asp.net mvc webapi 实用的接口加密方法
    微信小程序开发心得
    为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
    微软常用的组件设计思想-‘工厂的工厂类’
    尝试asp.net mvc 基于controller action 方式权限控制方案可行性
    cookie 和session 详解
    sql注入详解
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/5134287.html
Copyright © 2020-2023  润新知