android - build.gradle中的registerTransform之后缺少base.apk代码

标签 android gradle kotlin transform

github address

registerTransform(TestTransForm())

class TestTransForm : Transform() {
override fun getName(): String {
    return "test"
}

override fun getInputTypes(): MutableSet<QualifiedContent.ContentType> {
    return mutableSetOf(QualifiedContent.DefaultContentType.CLASSES)
}

override fun isIncremental(): Boolean {
    return false
}

override fun getScopes(): MutableSet<in QualifiedContent.Scope> {
    return TransformManager.SCOPE_FULL_PROJECT
}

override fun transform(transformInvocation: TransformInvocation?) {
}}

我只是尝试一个空的Transform,也不起作用。我检查输出中的.class文件,该.class文件实际上已按预期更改。但是在安装apk时出错,日志:
Failed to commit install session 1402092649 with command cmd package install-commit 1402092649. Error: INSTALL_FAILED_INVALID_APK: Package couldn't be installed in /data/app/com.haku.aaa-3aSlvL5yaZujUqYNmZlzgQ==: Package /data/app/com.haku.aaa-3aSlvL5yaZujUqYNmZlzgQ==/base.apk code is missing

然后我尝试了一些示例,例如Example,它很好用。我以为Gradle和Gradle工具的版本是原因,但在更改工具版本和包装器版本后仍然报告错误。

Gradle工具版本:3.1.4
包装器版本:gradle-5.1

最佳答案

您必须负责使用transform方法将输入写入输出中,

@Override
void transform(
        @NonNull TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
    def inputs = transformInvocation.inputs
    def outputProvider = transformInvocation.outputProvider
    inputs.each { TransformInput input ->
        input.directoryInputs.each {DirectoryInput dirInput ->
            println("transform DirectoryInput:" + directoryInput.getFile().absolutePath);

            //do your work here,modify classes in the dirInput.

            //Make sure to copy every input to output,no matter modified or not.
            File dest = outputProvider.getContentLocation(directoryInput.getName(),
                    directoryInput.getContentTypes(), directoryInput.getScopes(), Format.DIRECTORY);
            println("transform DirectoryOutput:" + dest.getAbsolutePath());
            FileUtils.copyDirectory(directoryInput.getFile(), dest);
        }
        input.jarInputs.each{ JarInput jarInput ->
            println("transform jarInput:" + jarInput.getFile().absolutePath);
            String destName = jarInput.getName();

            //Do your work here,modify the jarInput.

            //Make sure to copy every input to output,no matter modified or not.
            File dest = outputProvider.getContentLocation(destName,
                    jarInput.getContentTypes(), jarInput.getScopes(), Format.JAR);
            println("transform jarOutput:" + dest.getAbsolutePath());
            FileUtils.copyFile(jarInput.getFile(), dest);
        }

    }
}

样例代码snipet很时髦,您可以轻松转换成kotlin。

阅读document以获取详细说明。

关于android - build.gradle中的registerTransform之后缺少base.apk代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54157884/

相关文章:

android - android ListView 的虚拟大小?

android - API>25 中的前台服务在应用程序运行(可见)时是否强制通知

由于加号登录版本,Maven 无法解决依赖关系

android - Koin 的生命周期范围与 Activity 范围。他们是一样的吗?

java - Kotlin 中的 getDeclaredMethod?

java - 对 Java 和 Kotlin 友好的 Kotlin 监听器

java - 使用异步改造调用在模型中执行附加逻辑

Robotium 项目的 Gradle 构建和执行(多模块)

具有特定结构的 gradle init 项目

android - 2人安卓游戏,客户端除了手机还用什么?