最近要实现一个把自己的整个应用打包成SDK接入到合作公司的应用中,刚开始是想采用插件(如360的DroidPlugin,原理解析链接:分析DroidPlugin,深入理解插件化框架)的形式来做,这样的话很方便,只要提供一个apk就行了。但是问题来了,一个完整的应用里面接入了很多第三方平台的功能,在插件app中运行的话有些第三方服务启动不了,如极光推送。因此只能放弃这种便捷途径。
我们知道就算应用再大只要把应用代码与资源拷贝到调用工程中一起编译的方法是绝对可行的,只是这种方法看起来有点low而且繁琐麻烦;经过查找资料决定采用jar包+apk的方式来实现,这样我们中只要提供jar+apk+jniLib(如果有)给调用方即可。
在Android应用中我们是可以访问zip文件(如apk)或者目录中的资源的,这里我们先了解一下一个apk文件的结构,用好压打开一个apk文件,如下图:
图1
图1中dex文件表示的是代码,resources.arsc中保存了R文件中Id与资源的对应信息,因此在制作资源apk时可以用好压把除了resources.arsc、AndroidMainifest.xml(包含SDK版本信息)、res和META-INF(包含签名信息,用于安全校验)之外的文件全删除以减轻apk大小。
那么在制作好资源apk后如何在jar中使用其中的资源呢,在类AssetManager通过addAssetPath方法可以添加资源路径,方法代码如下:
/**
* Add an additional set of assets to the asset manager. This can be
* either a directory or ZIP file. Not for use by applications. Returns
* the cookie of the added asset, or 0 on failure.
* {@hide}
*/
public final int addAssetPath(String path) {
synchronized (this) {
int