如何打包成 android SDK

通常的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用方法替换。代码如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. class ResLink{  
  2.    public static int getIdXXXXX(){  
  3.        return R.xx.xx;  
  4.    }  
  5. }  

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

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

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <resources>  
  2.     <public type="id" name="xxx" id="0x7f040003" />  
  3. <resources>  

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

总结

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

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

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

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

发布了77 篇原创文章 · 获赞 28 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览