随着Android系统的日益发展和日渐成熟,各种平台的合作就日渐频繁。现在主要互联网公司,都退出了各种各样的插件功能。如第三方支付,第三方联合登陆和微博分享等等功能。
近期由于业务的需要,公司提出将项目的功能打成jar包,提供给其它客户调用。经过一段时间的调查研究和实践,先将解决办法总结如下。
- 直接将布局文件通过代码来写,然后直接导出src目录文件成jar.
- 将src目录导出成jar,然后把res和jar同时提供给第三方。
- 通过aapt把资源打包进jar进行调用。
第一种方法我们就不讨论了,如果项目的界面不多而且比较简单采用这种方法比较适合。如果比较大,资源比较多,那可以把你写到吐血了.
之前我们公司一直采用的是第二种方法。这种方法简单方便,缺点是第三方可以随意更改你的布局文件,导致出错(虽然他们很少会这样做),而且没法发包给第三方的时候都要发很多的资源包,少发一个都可能导致出错,维护起来比较麻烦。
所以想着通过aapt打包资源的方式打包进jar进行发布。
首先先来了解一下概念。
Android查找资源的流程 http://blog.youkuaiyun.com/qq_32115439/article/details/55184022
有了这个概念后剩下的就会好理解很多。
偶然发现,在android开发时候,其实我们可以自定义资源的存放位置。怎么弄呢?只要将上面的代码放到values下面(类似strings文件格式,但type是layout),就会有一个R.layout.xxx的id指定到r/dir/xxx.xml,当然图片资源也可以这样用,type是drawable。
而我们可以直接在工程的src项目下新建r.dir的包名,未来打jar会自动打包成目录的。
关键是xml文件,这里我们r.dir不能再放源文件了,需要放用aapt编译的二进制文件。但是该方法也存在一个限制,就是你的values必须是源文件跟随调用你jar的主工程编译
接下来看具体的步骤:
1,在你的library工程src文件下新建demo文件夹,文件夹下放入通过aapt编译之后的二进制res资源文件。
2,在你的library工程vlues下新建一个public.xml文件如下
<resources>
<item type="layout" name="finalactivity">demo/activity_final.xml</item>
</resources>
3,library工程中引用资源
public class FinalActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getResources().getIdentifier("finalactivity", "layout", "com.example.testactivity"));//com.example.testactivity为合作方的包名,finalactivity为你在public.xml中的命名
TextView view=(TextView) findViewById(R.id.textview);//这里的id就不需要在public.xml中配置了
view.setText("123456");
}
}
4,导出jar包(只要勾选src就行了)同时把values下的public.xml提供给合作方。
5,合作方拿到jar进行加载,然后把public.xml复制到自己的values下编译运行就可以了。
这是唯一的缺点吧,values必须在合作方的源文件下编辑才能成功。
**接下来我来讲讲如果获取appt编译后的二进制文件
你可以通过aapt工具进行编译res资源文件然后会输出R.java文件和resources.ap_。了解过的朋友应该知道resources.ap_ 就相当于一个zip文件压缩包,重命名resource.ap_为resource.zip,通过解压工具unzip或者命令进行解压,这是我解压后的文件目录
这里的文件就是经过aapt编译的二进制文件。取出来放到src的demo文件下举行了(文件名可以自己定);
你还可以直接编译library工程,会在bin目录下直接生成resources.ap_ 直接用。**
如果大家有更好的办法,欢迎分享给我。