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