将android程序打包成sdk中资源的处理

来源:互联网 发布:js移除节点 编辑:程序博客网 时间:2024/04/30 06:56

背景

通常的android项目,都是以apk的形式对外发布的,但有一部分程序,是做为二次开发包提供给其它开发商的,例如,淘宝SDK,新浪微博SDK。笔者参与公司的一款支付插件的开发与维护,最终打包成jar+res的格式(与支付宝支付提供的支付不同。支付宝的交易功能,也是一个APK,商户接入后,通过AIDL调用支付)。以这款插件为例,讲解一下资源文件的处理。

工程设置与打包形式

工程设置:

因为插件本身不支持直接运行,必须接入到商户后,才能执行,所以,在维护该插件的时候,还有一个用于调起插件的商户DEMO。怎么样把两个项目整合到一起,可以正常运行呢?

把插件工程设置成android library project

如此一来,只要添加将lib工程添加到商户DEMO中的lib,就可以方便的调用。

打包:

将插件的代码打包成一个jar,再将插件工程复制一份出来,删除掉工程中的java源文件,这样,就留下了一个只有资源的lib project。商户接入的时候,将jar添加到libs下,将res library project添加到src lib下,就可以接入。为什么不把jar也放到res lib project里面呢?

新版本的ADT是可以的,支持直接把jar放入 lib project 里,会自动加到build path但以前的还得手工添加,另外单独提取出来,更直观一些

资源文件的处理

在插件项目中,资源文件的引用不能再以R.XX.XXXX这样的格式来使用,因为这种代码在编译的时候, 会用具体的int值来替换掉代码,当你的项目在别人的环境下重新编译,资源对应的id就被改了。

解决办法:

R.xx.xxx用方法替换。代码如下:

class ResLink{   public static int getIdXXXXX(){       return R.xx.xx;   }}

方法一:将ResLink的源码也提供给商户,这样,可以将R的常量的替换放到商户的项目编译时,保证id不紊乱。但要删除你的JAR中的该类的class文件

方法二: 使用资源名称。Resource类提供了一个叫getIdentifier()的方法,该方法可以根据资源的名称和类型来获取具体的值。

方法三: 为自己的资源固定id,查看android的R.java文件,可以发现生成的资源id常量值都是0x7f开头。其实,这个id的组成是 package + type + value ,其中,应用的资源生成的id都是7f开头的。而android提供了一种资源类型叫public,用法:

<resources>    <public type="id" name="xxx" id="0x7f040003" /><resources>

这样,aapt在编译的时候,会自动将该资源指定固定的id。如此一来,就可以在代码中用R.xx.xxx了。

总结

方法1中,编译时候及时报错,商户接入相对麻烦,必须指定类放入到指定包下才可以。

方法2中,资源全部以string的形式指定,如果资源有改动,每次新加都得手动添加其名字和类型,如果添加的多了,再删除,操作起来相当麻烦,而且都不知道哪些用到哪些没用到,即使没有这个资源也不会在编译时报错。

方法3中,完全指定了资源,可以用R.XX.XXXX来直接使用,在提供给二次开发商的时候,public.xml资源也会提供出去,这样,编译时候不会造成id冲突,相当于强制锁定了资源id。

以上3种方法中,我使用的是方法二,而且我发现很多家都是使用的该方法,尽管它对管理资源名称比较麻烦,但它是唯一的一种不以来R文件的办法。

不想把资源直接发给商户?请浏览这里android如何将资源打入jar并对资源进行保护

转自:http://www.lephones.net/2014/02/28/android-lib-res/

1 3