Android Transform: Installation did not succeed.

756 阅读1分钟

The application could not be installed: INSTALL_FAILED_INVALID_APK

背景: 最近在做无痕埋点相关的技术,在创建transform类后使用时出现“” 错误。

原因: 由于对transform原理不是很了解,只是简单的创建一个transform,就直接使用。 具体代码如下:

public class TestTransform extends Transform {

    @Override
    public String getName() {
        return "FanhiTest";
    }

    @Override
    public Set<QualifiedContent.ContentType> getInputTypes() {
        return TransformManager.CONTENT_CLASS;
    }

    @Override
    public Set<? super QualifiedContent.Scope> getScopes() {
        return TransformManager.SCOPE_FULL_PROJECT;
    }

    @Override
    public boolean isIncremental() {
        return false;
    }
}

问题分析: 刚开始很懵,不知道原因是什么。先判断使用语言对不对,由于本人使用的是java语言。官方文档中说明只要是java虚拟机可以识别的语言都可以使用,确定原因不是。 然后从log分析,发现是代码缺失,但是如上所示代码只是简单的继承,没有多余的代码。再深入的思考一下,没写其他的代码是不是就是问题呢?通过查看网上的demo,发现在transform中有很多代码其中比较重要的是拷贝文件的代码。如下将代码拷贝加上,结果立马跑通了。

解决方案: 正确的代码应该在transform函数中添加拷贝文件的代码,具体代码如下:

    @Override
    public void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
        super.transform(transformInvocation);
        Collection<TransformInput> inputs = transformInvocation.getInputs();
        TransformOutputProvider outputProvider = transformInvocation.getOutputProvider();
        for(TransformInput input : inputs) {
            for(JarInput jarInput : input.getJarInputs()) {
                File dest = outputProvider.getContentLocation(
                        jarInput.getFile().getAbsolutePath(),
                        jarInput.getContentTypes(),
                        jarInput.getScopes(),
                        Format.JAR);

                FileUtils.copyFile(jarInput.getFile(), dest);
            }
            for(DirectoryInput directoryInput : input.getDirectoryInputs()) {
                File dest = outputProvider.getContentLocation(directoryInput.getName(),
                        directoryInput.getContentTypes(), directoryInput.getScopes(),
                        Format.DIRECTORY);
              FileUtils.copyDirectory(directoryInput.getFile(), dest);
            }
        }
    }

结论: 在使用新技术前还是要了解一些新技术的原理,至少要读一遍介绍和接入文档。不然一个小问题就会卡很久。既浪费了时间,又很打击信心。能解决问题才是关键。