首页 > 系统 > Android > 正文

如何打包成 android SDK

2019-11-06 09:51:07
字体:
来源:转载
供稿:网友

通常的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上查看代码片class ResLink{     public static int getIdXXXXX(){         return R.xx.xx;     }  }  

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

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

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

[html] view%20plain copy 派生到我的代码片<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文件的办法。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表