gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:56:55 32 4
gpt4 key购买 nike

我有一个已经在 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

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

最佳答案

Ant

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

我创建了一个带有以下目标的 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-jars 中的实现。如果实现在 android 项目中,则可能必须配置混淆。


ECLIPSE-插件

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


Android-Studio/GRADLE

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

关于android - 将 'META-INF/services' - 文件保留在 apk 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16898409/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com