如何正確打出帶資源文件的jar包

一、資源文件的使用

首先是如何使用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用戶,這個方法是不可取的。

這里提供兩種解決方案:

  1. 將資源文件放到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;
    
        }
    

    ?

  2. 使用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)上流傳的使用反射獲取ID

    public 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

  1. 直接將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)
  
  1. 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/下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,363評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,659評論 19 139
  • 不支持上傳文件,所以就復(fù)制過來了。作者信息什么的都沒刪。對前端基本屬于一竅不通,所以沒有任何修改,反正用著沒問題就...
    全棧在路上閱讀 2,071評論 0 2
  • 雨水打濕了我的心 我的眼 臉 ……
    一個人的世界閱讀 292評論 0 1
  • 方法一,不凈觀禪修法(十不凈,三十二身分),修成就之后女性在和尚眼里變成一具骷髏,一副臭皮囊,避之唯恐不及。 方法...
    好孩子1125閱讀 472評論 0 0

友情鏈接更多精彩內(nèi)容