Android Framework中新加res资源方式

[注]下面描述的内容适用于Android 4.1以及之后的版本,试验的模块为frameworks/opt/telephony/src/java/android/telephony

维护WebView期间一直就只有关注code的逻辑,以及进行一些java逻辑的修改,还真没有在framework中添加过资源,

第一次在framework中添加资源,直觉以为在frameworks/base/core/res中添加编译即可使用,结果还是出现类似如下错误:

frameworks/opt/telephony/src/java/android/telephony/SmsMessage.java:369: error: cannot find symbol
        if (r.getBoolean(com.android.internal.R.bool.config_sms_force_7bit_encoding1)) {
                                                    ^
  symbol:   variable config_sms_force_7bit_encoding1
  location: class bool


果断到Lollipop/out/target/common/R/com/android/internal/R.java查找是否有该资源ID生成,结果没有。


通过必应哥搜索前辈经验,以及根据自己的理解,总结在framework中添加资源需要如下几步才行:

1.将资源添加到Lollipop/frameworks/base/core/res/res/values/strings.xml中,如果在实际开发中建议是将自己的资源另创建strings_xx.xml

   文件来存放。


2.如果资源为private的需要手动添加到symbols.xml中,格式类似<java-symbol type="string"  name="config_wifi_random_mac_oui" />,

  为什么说private的资源加到symbols.xml中呢,可以看如下symbols.xml文件中的注释,一目了然。

  <!-- We don't want to publish private symbols in android.R as part of the
       SDK.  Instead, put them here. -->
  <private-symbols package="com.android.internal" />

  这里面的资源,通过com.android.internal.R.XXX来访问,例如com.android.internal.R.string.anna

  

  如果资源为随着SDK release给开发者用的平台公用资源,需要将其手动添加到public.xml中,格式参考public.xml中已有的资源格式。

  public.xml的官方注释,该资源release出来就必须存在,且其需要make update-api将其写到frameworks/base/api/current.txt中。

  public.xml的首行注释:

  <!-- This file defines the base public resources exported by the
     platform, which must always exist. -->

  添加在这里的资源,根据理解可以通过android.R.XXX来进行使用,例如 android.R.string.cancel

  忘了说一句了,通过make update-api将该资源的ID生成在current.txt中为如下格式

  field public static final int ic_menu_close_clear_cancel = 17301560; // 0x1080038

  通过这个可以通过aapt dump资源的时候可以直接grep该资源的ID哦,前面为十进制,后面注释为十六进制。


3.上两步修改完成之后需要mm frameworks/base/core/res,重新编译生成framework-res.apk

  

4.现在转到需要使用该资源的模块,该模块可能还需要修改Android.mk文件,让需要使用资源的模块能够访问到frameworks的R,

  在Android.mk文件中添加如下配置:

  framework_res_source_path := APPS/framework-res_intermediates/src

  LOCAL_INTERMEDIATE_SOURCES := \
            $(framework_res_source_path)/android/R.java \
            $(framework_res_source_path)/android/Manifest.java \
            $(framework_res_source_path)/com/android/internal/R.java


 这样本模块mm就可以编译通过了。


如上描述的方式是在现有的framework-res.apk中添加资源,而如果想要在framework添加一个新的XXX-res.apk,需要修改framework的Android.mk

文件,AssetManager等内容,可以参考http://blog.csdn.net/argonwu/article/details/18703915,这篇blog可以作为参考,如果要想添加成功可能还得

自己研究研究,我暂时没有这方面的需求所以没有研究过,简单看过他的说明,4.4以及5.0的添加方式应该只能是参考加自己研究才行了。

你可能感兴趣的:(Android Framework中新加res资源方式)