之前在网上也有看到过将android应用打包成jar的形式提供给第三方使用,使用的方法是将源码打成jar,而资源文件是直接提供给使用者,或者将资源文件放在单独项目中作为library提供给调用者。这两种方式都有个缺点,就是资源文件会暴露给使用者,使用者可以随意修改资源文件。为了保证源码以及资源文件不暴露给调用者,我这里仿照一些产品尝试了以下方法。
大体思路是:
1、首先使用纯代码开发JAR中的Actvity页面,将源码导出jar(导出方法不做说明);
2、将资源文件(图片)单独处理成可读文件;
3、在调用者的项目中使用jar以及可读资源文件;
1、在开发JAR中Activity页面过程中需要使用图片的时候,需要获取资源data.ebi文件;
<span style="font-size:14px;">private Object getObjectFromAssets(String name) {
AssetManager asm = getAssets();
InputStream is = null;
ObjectInputStream ois = null;
try {
is = asm.open(name);
ois = new ObjectInputStream(is);
return ois.readObject();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return asm;
}</span>
2、在获取到data.ebi 对象后在data.ebi对象中获取相应的资源并使用:
<span style="font-size:14px;">HashMap<String, byte[]> list2 = (HashMap<String, byte[]>) o;
byte[] bottom_coupon_s2 = list2.get("bottom_coupon_s");
Bitmap bo = Utils.Bytes2Bimap(bottom_coupon_s2);
//为TextView设置背景
textView.setImageBitmap(bo);</span>
这样使用纯代码开发的Activity就完成了,并且没有调用本地资源,之后就是将用代码开发的Activity打成jar,只需要将src中的源码导出,其他的所有文件都不要,到处的jar可以自行混淆;
下面是data.ebi的存储方法:
单独新建一个资源处理的工程用于专门处理资源文件(图片)
其中主要的方法:
HashMap<String, byte[]> dblist = new HashMap<String, byte[]>();
dblist.put("redbtn", bitmap2Bytes(BitmapFactory.decodeResource(
getResources(), R.drawable.redbtn)));
saveObj("data.ebi", dblist);
protected void saveObj(String name, Object dblist) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = openFileOutput(name, MODE_PRIVATE);
oos = new ObjectOutputStream(fos);
oos.writeObject(dblist);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private byte[] bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
以上方法会将 data.ebi 文件保存与设备的data/data/yourapplicationname中.
将data.ebi导出来提供给第三方调用者使用。
使用方法,将data.ebi放入需要使用的项目的assets中,在前面生成的jar导入需要使用的项目中即可;
具体的Activity调用方法可以自己封装;
总结:这种方法由于页面开发需要使用纯代码开发,所以不太适合页面过多的jar,除非不嫌麻烦;其实android的插件开发有很多方法.这种方法只适合于小型插件的开发.
小弟拙见,请多多赐教。