安卓项目导出成jar,自带的res资源不能正常使用,网上各说纷纭,总结一下归纳为五类,但是没有一种能够提供直接将res文件夹打包进jar,并能够使用R文件引用的方式。
打包时包含res文件夹,并通过R文件的反射获取资源:
此种方式最坑爹了,根本就是想当然。因为jar中的res与应用的res合并是在生成APK时,此时应用中对R文件中id的引用已经替换为常数,R文件不会在合并后再次更新,所以对jar中res的引用会报错。
打包时,将资源放在asset文件夹内,通过AssetsManager获取指定资源:
目标应用和jar中的assets文件夹会合并,所以可以通过获取该应用的此类文件夹来获取目标资源, ---缺点是如果是图片资源,不能与屏幕适配,如果有一种适配屏幕的算法,那么此法应该是可行的
另外就是资源会被暴露给二次开发者
使用library项目
参见博客地址:【这才是正解!】Android 自定义类库打包jar! 谁说不可以打包res 文件?
此类方法不能混淆代码,生成的jar包根本没有资源文件,而官网说明也指出此方式不能导出jar文件(并非那篇博客中所说的可以使用bin目录下的jar包),也就是说发布时需要提供library源项目,也就是说你所谓的库代码直接暴露给别人了,这恐怕不是广大开发者所希望的。
在引用此lib的目标项目中会看到一个包含已经编译成class.dex的jar文件,这个文件反编译以后仍然是只有代码部分。
使用双重library项目
参见博客地址:Android类库打包方法探究
博文的最后提供了一种双层library项目的方法,可以混淆代码,但是xml与图片资源仍然是暴露的,且发布时需要提供二级引用项目,操作上复杂度较高,不如直接提供jar包和资源
直接提供jar包和资源(分开)
依然是反射R文件,资源会被暴露给开发者。
目前综合判断,还是第五种方式最粗暴简单直接,还是希望未来谷歌可以有这个方向的支持。