U8SDK——多包名下生成R.java(海外SDK接入普遍遇到的坑)

作者: 分类: U8SDK 发布时间: 2016-12-08 13:43 64条评论

在接入海外SDK,比如Google、Facebook以及国内的一些SDK,比如迅雷等,会遇到一个普遍的问题, 就是这些SDK中,对于资源的引用,是直接通过R..调用的。

R.java里面存储了Android工程中各种资源ID的索引,一般在编译的时候,R.java会自动生成在gen目录下。

这些SDK直接引用R的时候, 多半这些R所在的包名,是这些SDK自己的包名。 我们反编译下迅雷的SDK的jar包,以迅雷SDK中的一个UI资源引用为例:

20160320164421280

这里他直接引用了com.xunlei.thundergamesdk包名下的R类, 代码中,直接通过R.stytleable.*来获取资源ID。

而U8SDK打包工具在反编译资源动态整合的时候,会在当前游戏包名(比如,我们的游戏包名是:com.u8.sdk.demo)路径下,重新生成一个R.java,

那么不做特殊处理,程序运行的时候, 迅雷SDK中这些直接引用R的地方,会出现资源找不到的问题。

为了处理这种情况, 打包工具在重新生成R.java的时候, 我们将这个R.java同时也编译到com.xunlei.thundergamesdk包名下。 这样, 程序运行的时候, 这个R文件在这个包名下,就是存在的。

有了这个思路之后, 我们将需要生成R文件的包名,放在配置中。 同时,同一个SDK,可能需要在多个包名下生成R文件, 所以,我们的配置,需要支持配置多个包名。

我们在渠道配置文件中(打包工具/games/当前游戏/config.xml)的每个渠道参数配置这里,增加一条配置,用来配置需要生成R文件的包名,多个包名用逗号分割:

然后,我们在打包工具/scripts/apk_utils.py中,我们增加一个方法, 将生成的R.java文件, 拷贝到上面配置的多个包名路径下。

上面这个方法,就是将游戏包名下生成的R.java,编译到配置的多个包名路径下。 然后我们在generateNewRFile方法的最后,调用一下上面这个方法:

好了,这样,对于google,facebook,迅雷等这些直接引用R文件的SDK,这种方式就可以解决了。

本文出自 U8SDK技术博客,转载时请注明出处及相应链接。

本文永久链接: http://www.uustory.com/?p=2114

评论功能已经关闭,请加入U8SDK技术群进行讨论和咨询:207609068
Ɣ回顶部
U8SDK技术群 x
技术同学请加入
点击加入