相关疑难解决方法(0)

注释处理器生成的资源未打包到APK

我有自定义注释处理器生成工厂类和META-INF/services/factory.interface.class资源.

注释处理器用于库项目,所有生成的文件都正确打包到AAR中.

当我在应用程序项目中使用注释处理器时,库作为依赖项添加,只有库META-INF/services/factory.interface.class中的类存在APK/META-INF/services/factory.interface.class

经过一番调查,我意识到MergeJavaResourcesTransform在android-gradle-plugin-1.5.0(和2.0.0-alpha3)中寻找合并所有exploded-aars,jars和intermediates/sourceFolderJavaResources

有没有办法合并META-INFintermediates/classes(这是从哪里注释处理器资源文件获得创建),或使注释处理器创建的文件sourceFolderJavaResources

到目前为止,我发现的唯一解决方法是添加CopyTask应用程序的buildscript

android.applicationVariants.all { variant ->
  def variantName = variant.name
  def variantNameCapitalized = variantName.capitalize()
  def copyMetaInf = tasks.create "copyMetaInf$variantNameCapitalized", Copy
  copyMetaInf.from project.fileTree(javaCompile.destinationDir)
  copyMetaInf.include "META-INF/**"
  copyMetaInf.into "build/intermediates/sourceFolderJavaResources/$variantName"
  tasks.findByName("transformResourcesWithMergeJavaResFor$variantNameCapitalized").dependsOn copyMetaInf
}
Run Code Online (Sandbox Code Playgroud)

但我不打算强制编译库,用户除了添加依赖项之外还做更多的事情.

android annotations meta-inf gradle

15
推荐指数
1
解决办法
877
查看次数

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

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

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

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

如何集成我的charset,以便在Android-App中使用它?

Charset.forName("MyCS");
Run Code Online (Sandbox Code Playgroud)

目前我正在做一个像这样的解决方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

哪个有效,但对我来说似乎无效,因为每次我尝试使用自己的字符集进行解码时,都会抛出异常并创建一个CharsetProvider-Object.

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

编辑:

由于META-INF/services/java.nio.charset.spi.CharsetProvider …

android meta-inf serviceloader

5
推荐指数
1
解决办法
2865
查看次数

标签 统计

android ×2

meta-inf ×2

annotations ×1

gradle ×1

serviceloader ×1