在apk中保留'META-INF / services'文件

时间:2013-06-03 13:52:35

标签: android meta-inf serviceloader

我有一个已经在JavaSE上工作的自定义字符集。

我的CharsetProvider的类在文件java.nio.charset.spi.CharsetProvider中指定,该文件位于META-INF/services中,所有内容都正常加载并按预期工作。

但是现在我在android上也使用了lib,但是在Android-App中没有加载charset。

如何整合我的字符集,以便在Android-App中按预期使用?

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-Object。

单身模式可以减少课程的创建。但问题是要避免完全直接使用MyCharsetProvider。

编辑:

由于apk中缺少META-INF/services/java.nio.charset.spi.CharsetProvider,我可能会将proguard删除。然后我在proguard.cfg中尝试了以下选项:

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

但问题仍然存在。那么如何使用ant(netbeans)自动将这些文件从META-INF/services导入到我的apk中?

1 个答案:

答案 0 :(得分:3)

<强> ANT

我现在正在使用以下解决方案:

我创建了一个带有followin目标的custom_rules.xml,用于将META-INF / services中的文件复制到未对齐和未签名的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 / services文件夹中,以将它们包含在apk中。这使我可以完全控制ServiceLoader要加载哪些类。

<强> 注: 目前我只以这种方式加载外部Java-SE-jar中包含的实现。如果实现在android项目中,则可能必须配置模糊处理。


<强> ECLIPSE-PLUGIN

使用eclipse-plugin,没有像ANT那样的解决方法。问题是ExportHelper(第405行),它只会META-INF个文件夹中的所有内容。


<强> Android的工作室/摇篮

根据这个Bug,您可以在主项目中定义一个META-INF目录,这将被打包到您的apk中。 META-INF - 库的文件夹被排除在外,因此您必须指定要在自己的项目中使用的实现(我认为这是它的意图)。