android 生成jar包裏面包含資源文件

背景:工做中須要開發一個廣告插件,並提供給其它人使用。這裏就須要把本身的插件程序,打成jar來提供給他人引用。
可是遇到一個問題:插件程序中沒法使用資源文件。

試過如下幾種方式解決:

一、從插件程序中導出jar包
論壇上有人說導出的jar包中沒法包含Drawable等資源文件,一些圖片等數據,須要放到Assert文件中使用。
其實,關於這個問題,我作了嘗試:
首先,須要說明導出jar包含什麼文件是由你導出時選擇來決定的,好比下圖:
android <wbr>關於生成jar包的問題
若是你選擇了res文件夾,則打包出的jar文件是能夠包含res文件到。

可是包含文件並不表明可使用。若是你想固然在插件程序中使用R.drawable.XXXX等方式獲取
資源會報錯!
固然別人經過R.XX.XX也只能看到本身的資源文件,而沒法獲取jar中的資源文件。

二、獲取jar包中的文件

雖然沒法直接引用資源文件,可是若是外邊程序想獲取某個資源文件時,也是可行的。
其原理是以數據流讀取jar中指定的文件。
好比讀取Assert文件下的icon.jpg文件:
你能夠在插件中封裝一個對外的方法:
    publicstatic Drawable getAssertDrawable(Context context,StringfileName){
       try {
          InputStreaminStream=context.getAssets().open(fileName);
          return newBitmapDrawable(BitmapFactory.decodeStream(inStream));
       } catch(IOException e) {
         Log.e(LOG_TAG, "Assert中"+fileName+"不存在");
       }
       returnnull;
    }
直接使用該方法能夠獲得文件。
後來又嘗試在外部程序,直接使用context.getAssets().open(fileName)方法獲取jar中文件,
讓人喜出望外的是居然成功了。呵呵!
後來分析,外部程序編譯時,其實連同jar包中內容一塊兒混編。jar包中的Assert文件會同外部程序的Assert一塊兒
由AssertManager管理。
因此當你jar包中Assert內部文件和外部Assert中的文件有命名衝突時,編譯器會報錯的。

另外,還有人提供另一種方法來讀取諸如Drawable等文件夾下的文件。
    publicstatic Drawable getDrawableForJar(String resName,Classclass){
       InputStreaminStream=class.getResourceAsStream(resName);
       return newBitmapDrawable(BitmapFactory.decodeStream(inStream));
    }
使用class.getResourceAsStream()方法讀取,注意這裏resName是文件的相對路徑,好比jar根目錄下res/drawable/icon.png,
則調用方法爲:class.getResourceAsStream(/res/drawable/icon.png);

這裏主要是採用ClassLoader的下面幾個方法來實現: html

  public URL getResource(String name); android

  public InputStream getResourceAsStream(String name) 動畫

  public static InputStreamgetSystemResourceAsStream(String name) this

  public static URL getSystemResource(String name) url

  後兩個方法能夠看出是靜態的方法,這幾個方法均可以從Jar中讀取圖片資源,可是對與動畫的gif文件,筆者在嘗試過程當中發現,存在一些差別。 spa

  String gifName爲Gif文件在Jar中的相對路徑。 插件

  (1)使用了兩個靜態方法 code

  BufferedImageimage = ImageIO.read(ClassLoader.getSystemResourceAsStream(gifName));

  或者 htm

  Image image = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(gifName));

  這兩種方式能夠成功地讀取gif文件,可是對於gif動畫,顯示出來地是靜態的。 blog

  (2)使用其餘兩個方法

  Image image = Toolkit.getDefaultToolkit().getImage( this .getClass.getClassLoader()
.getResource(gifName));

  再這種方式下動畫能夠正常顯示了。


三、使用library方法加載資源文件

在論壇中看到帖子講述如何把工程做爲libarary,讓其餘工程添加library,編譯後會自動生成jar,而後在哪來使用。
當時看到此貼,喜出望外,因此趕忙嘗試下!

方法:選擇插件工程,右鍵選擇屬性,選擇Android,勾選下面Is Liabrary選項。
而後,選擇咱們現有的工程,右鍵屬性,選擇Android,在library下add相應的庫。你會看到,剛纔咱們設置的插件項目,就在其中。最後,點擊應用,完成。

詳細步驟:

按以下方法設置:

1. 假設要引用的android工程叫LibProject,引入到的工程叫MainProject;

2.設置LibProject,右鍵->Properties->Android,將Islibrary項選中,而後Apply;

3.設置MainProject,右鍵->->Properties->Android,在Library中,點擊Add按鈕,將LibProject工程加入,Apply便可。



你會看到咱們的工程中多出插件工程的引用,並且可使用R.XXX.XXX獲取資源文件。

覺得能夠解決了,可是發現並無生成想要的jar文件。在插件工程中,卻是有編譯的class文件,卻沒有jar包。
而咱們每每是不能像這樣把原工程給別人直接引用的。
通過屢次試驗,始終沒有生成jar,很是奇怪別人怎麼弄得。。。

另外,拿之前經過這種方式生成的jar文件看,裏面也不包含資源文件夾。。

因此最終肯定,這種方式沒法實現需求。
相關文章
相關標籤/搜索