【发布时间】:2016-04-12 08:21:28
【问题描述】:
在将代码转换为dex文件之前,我使用applicationVariants.dex.dependsOn任务做了一些额外的工作,并且在android gradle plugin 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<QualifiedContent.ContentType> getInputTypes() {
Set<QualifiedContent.ContentType> set = new HashSet<QualifiedContent.ContentType>();
set.add(QualifiedContent.DefaultContentType.CLASSES);
return set;
}
@Override
public Set<QualifiedContent.Scope> getScopes() {
Set<QualifiedContent.Scope> set = new HashSet<QualifiedContent.Scope>();
set.add(QualifiedContent.Scope.PROJECT);
return set;
}
@Override
public boolean isIncremental() {
return false;
}
}
这是一个空的自定义转换。我没有添加转换逻辑,但这不是问题。 然后我使用我的 gradle 文件中记录的 api 注册了这个 Transform:
def transform = new MyTransform()
project.android.registerTransform(transform)
当我执行 assemble 任务时,我的自定义转换似乎有效。从执行任务列表中可以看到:
最后apk文件生成成功,一切正常。但是当我安装 apk 并启动应用程序时,它崩溃了。出现这样的错误:
这很奇怪。引发了 ClassNotFoundException,而我的 MainActivity 不见了。怎么可能!然后我重新编译了我的apk文件并在jd-gui中查看了源代码,我完全糊涂了。
我的代码都不见了。只保留支持库中的类。但实际上我的代码 .class 文件存在于 app/build/intermediates/classes/ 目录中。如果我在 gradle 中注释掉注册行:
// project.android.registerTransform(transform)
一切顺利。所以我想我写了一个错误的自定义转换,但我真的不知道如何写一个正确的。
有人可以帮忙吗?衷心感谢。
【问题讨论】:
-
您好 Tony,您能否在 GitHub 上提供一个用于 Transform API 的示例应用程序?
标签: android gradle transform gradle-plugin