一、資源文件的使用
首先是如何使用res下的資源文件,直接使用R.id這樣的格式是不正確的,原因如下:
當(dāng)我們將
src目錄下的源碼打出Jar后,源碼代碼中的如Object = findViewById(R.id.id_name)中的R.id.id_name部分,都會被替換成此時(shí)在R文件中生成的id_name對應(yīng)的ID值(如果有興趣的話,可以用反編譯軟件可以查看到)。但是由于R文件中的ID值是由系統(tǒng)自動生成的,而且在不同的系統(tǒng)環(huán)境和不同的時(shí)間,id_name對應(yīng)的ID可能不一樣。
如果你使用的是androidstudio , 打出aar包,就不會有這個問題。但是這樣的話,就相當(dāng)于拋棄了eclipse用戶,這個方法是不可取的。
這里提供兩種解決方案:
-
將資源文件放到
assets目錄下。?
可使用下面方法讀取圖片,其他資源文件可使用類似方案,這里不再詳細(xì)說明,后面會提供將
assets文件夾打入jar包的方法。/** * 從Assets中讀取圖片 */ private Bitmap getImageFromAssetsFile(String fileName) { Bitmap image = null; AssetManager am = context.getResources().getAssets(); try { InputStream is = am.open(fileName); image = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); } return image; }?
-
使用
Identifier獲取組件ID。方法如下
/** * 獲取組件的id * @param className layout,string,drawable,style,id,color,array * @param idName 文件名 * @return 資源id */ public static int getIdByName(Context context, String className, String idName){ String packageName = context.getPackageName(); try { return context.getResources().getIdentifier(idName, className, packageName); } catch (Exception e) { e.printStackTrace(); } return 0; }然后將需要的使用的資源文件單獨(dú)拿出來,接入時(shí)拷貝到主工程里就可以了。
注意資源文件命名時(shí)最好加一個前綴,防止與與接入方工程文件重名,例如:
js_download_image,js_download_xml?
?
這個方法類似網(wǎng)上流傳的使用反射獲取
IDpublic static int getIdByName(Context context, String className, String idName){ String packageName = context.getPackageName(); int id = 0; try { Class<?> cls = Class.forName(packageName + ".R$" + className); id = cls.getField(idName).getInt(cls); } catch (Exception e) { e.printStackTrace(); } return id; }不過這個方法是有問題的,因?yàn)樵谶@里用
context.getPackageName()獲取的是applicationId而R文件真正的位置是在初始化工程時(shí)建立的的
com.xx.xx為名的文件夾下
applicationId一旦修改,與文件夾名不一致,就會導(dǎo)致找不到R文件而報(bào)錯。
?
二、生成jar包
- 直接將
jar拷貝出來
def SDK_NAME = "mysdk-v1.0-release"; // SDK名稱
//Copy類型
task makeJar(type: Copy) {
//刪除存在的
delete 'build/libs/'+ SDK_NAME +'.jar'
//設(shè)置拷貝的文件目錄
from('build/intermediates/bundles/release/')
//jar包存放的文件目錄
into('build/libs/')
//include ,exclude參數(shù)來設(shè)置過濾,也可以直接寫在from()的文件路徑里
include('classes.jar')
//重命名
rename ('classes.jar', SDK_NAME+'.jar')
}
makeJar.dependsOn(build)
- 將
assets目錄打入jar包中
def SDK_NAME = "mysdk-v1.0-release" // SDK名稱
def jar = file('build/intermediates/bundles/release/classes.jar')
task makeJar(type: Jar) {
//刪除存在的
delete 'build/libs/'+ SDK_NAME +'.jar'
from zipTree(jar)
// 包含assets目錄
from fileTree(dir: 'src/main', includes: ['assets/**'])
baseName = SDK_NAME
destinationDir = file('build/libs/')
}
makeJar.dependsOn(build)
兩種方式都只需要運(yùn)行gradlew makeJar就可以生成jar包在build/libs/下。