2013-06-03 56 views
4

我有一個已經在使用JavaSE的自定義字符集。保持'META-INF/services'文件在apk中

我的CharsetProvider的類是在文件java.nio.charset.spi.CharsetProvider中指定的,該文件位於META-INF/services中,並且所有內容都正常加載並按預期工作。

但是現在我在android上也使用了lib,但charset並沒有在Android-App中加載。

如何整合我的字符集,以便在Android應用程序中使用它?

Charset.forName("MyCS"); 

目前,我正在做一個解決方法是這樣的:

public static String decode(String encoding, byte[] buffer, int offset, int length) { 
    String result = ""; 
    try { 
     result = new String(buffer, offset, length, encoding); 
    } catch (UnsupportedEncodingException ex) { 
     MyCharsetProvider provider = new MyCharsetProvider(); 
     Charset cs = provider.charsetForName(encoding); 
     if (cs == null) { 
      Logger.getLogger(Converters.class.getName()).log(
        Level.SEVERE,null,ex); 
      result = new String(buffer, offset, length); 
     } else { 
      result = cs.decode(ByteBuffer.wrap(buffer, offset, length)).toString(); 
     } 
    } 
    return result; 
} 

其中一期工程,但似乎效果不佳給我,因爲每次我嘗試這樣的解碼與我自己的字符集,異常將被拋出並創建一個CharsetProvider對象。

創建當然可以通過單例模式來減少。但問題是避免直接使用MyCharsetProvider。

編輯:

由於META-INF/services/java.nio.charset.spi.CharsetProvider缺少的APK我雖然也許proguard的刪除。然後我在proguard.cfg中嘗試了以下選項:

-adaptresourcefilenames **.CharsetProvider 
-adaptresourcefilecontents **.CharsetProvider 

但是問題仍然存在。所以我怎麼能從META-INF/services這些文件到我的apk自動使用螞蟻(netbeans)?

回答

3

ANT

我用以下解決方案現在:

我創建與跟隨着目標的custom_rules.xml在META-INF /服務,將文件複製到未對齊和未簽名的apk。

<target name="-post-package" depends="-custom-copy" /> 

<target name="-copy-custom"> 
    <zip destfile="${out.packaged.file}" 
     update="true" 
     basedir="${source.absolute.dir}" 
     includes="${custom.copy}" /> 
</target> 

而在ant.properties我增加了行

custom.copy=META-INF/services/** 

現在我只需要相關的文件從庫複製到我自己的項目的META-INF /服務文件夾將其列入apk。這使我可以完全控制ServiceLoader加載哪些類。

注: 目前我只負載包括在外部Java-SE-罐子這種方式實現。如果實現處於android-project中,則可能必須配置混淆。


ECLIPSE-PLUGIN

使用Eclipse的插件,還有像螞蟻沒有解決方法。問題是ExportHelper(第405行),它只消除META-INF文件夾中的所有內容。


Android的工作室/搖籃

根據這一Bug您可以在您的主項目定義META-INF -directory,這將被打包成apk文件。 META-INF - 庫文件夾被排除在外,所以你不得不指定你想在你自己的項目中使用的實現(我認爲這是它的意圖)。

+0

任何解決方法可以在不切換到Ant的情況下複製它? – Singagirl

+0

@DmitriyR您使用哪種構建系統?我認爲這不會是eclipse-plugin的一個很好的解決方法。 – AlexS

+0

我使用Eclipse,所以最後我設法導出了未簽名的.apk文件,然後編寫了一個腳本,添加了apk的簽名和ziplaligning路徑。不方便但有效。主要問題是我無法直接從Eclipse將其部署到模擬器。 – Singagirl