我使用applicationVariants.dex.dependsOn任务在代码转换为dex文件之前做了一些额外的工作,并且在
android gradle插件1.3之前它运行良好.但是从1.4开始,dex任务被禁止访问并且会显示这样的错误提示:
好.我需要使用新的Transform API而不是dex任务.但问题是关于Transform API的文档真的很少.我能找到的是谷歌官方文件here,但它似乎不是很容易理解.
所以我试着写一个自定义变换,我真的不知道我是不对的:
public class MyTransform extends Transform {
@Override
public String getName() {
return "MyTransformImpl";
}
@Override
public Set getInputTypes() {
Set set = new HashSet();
set.add(QualifiedContent.DefaultContentType.CLASSES);
return set;
}
@Override
public Set getScopes() {
Set set = new HashSet();
set.add(QualifiedContent.Scope.PROJECT);
return set;
}
@Override
public boolean isIncremental() {
return false;
}
}
这是一个空的自定义变换.我没有添加转换逻辑,但这不是问题.
然后我使用gradle文件中记录的api注册了这个Transform:
def transform = new MyTransform()
project.android.registerTransform(transform)
他们执行汇编任务时,我的自定义转换似乎有效.我可以从执行任务列表中看到它:
最后apk文件生成成功,一切似乎都正确.但是当我安装apk并启动应用程序时,它崩溃了.有这样的错误:
那真是怪了.引发了ClassNotFoundException,我的MainActivity丢失了.它怎么可能!然后我重新编译我的apk文件,看到jd-gui中的来源,我完全糊涂了.
我的代码都丢失了.仅保留支持库中的类.但实际上我的代码.class文件存在于app / build / intermediates / classes /目录中.如果我在gradle中注释掉注册行:
// project.android.registerTransform(transform)
一切顺利.所以我想我写了一个错误的自定义转换,但我真的不知道如何编写正确的转换.
有人可以帮忙吗?真诚的谢谢.