invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)

背景

客户需要接入我们的SDK(aar包,java 8),客户本身的工程是java 7,所以客户需要将工程升级支持java 8。一般来说只需要在app级的build.gradle增加以下配置即可:

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

可是客户工程庞大,gradle配置复杂,增加java 8配置后编译时出现了标题上的错误。

分析

仔细分析用户的build.gradle文件,发现用到了Retrolambda插件。

retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.3.0'

Retrolambda 是一个 Java 类库,在 Java 5、6、7 上实现 Java 8 的 Lambda 表达式的功能。了解到这个是客户在将工程升级到java 8时额外添加的(后面了解到是为了处理一个跟java 8无关的编译错误)。

在自己的demo工程上模拟了一遍用户的编译环境,发现去掉Retrolambda可以编译通过,保留的话则会报类似标题上的编译错误。

后续

遇到这个问题时,想到过三种处理思路:
1.将我们的sdk降级到java 7(删除掉代码里所有java 8的feature),这种方案改动极大,但是可以让我们的sdk的兼容性变得更好;
2.不改sdk的代码,修改打包方式,在生成的aar包中抹去所有java 8的feature,使得我们的sdk可以兼容客户java 7的工程(研究了下没有发现方案);
3.协助/说服客户将工程升级到java 8。
最终选择了第三个方案。

你可能感兴趣的:(invalid opcode ba (invokedynamic requires --min-sdk-version >= 26))