5

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

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

但是现在我也在 android 上使用 lib,但是字符集没有加载到 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-Object。

当然可以通过单例模式减少创建。但问题是要完全避免直接使用 MyCharsetProvider。

编辑 :

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

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

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

4

1 回答 1

3

蚂蚁

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

我创建了一个带有以下目标的 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-project 中,则可能必须配置混淆。


ECLIPSE-插件

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


安卓工作室/GRADLE

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

于 2013-06-12T12:58:47.660 回答