Android应用无法安装

时间:2015-06-28 22:15:36

标签: java android generics dex

在AIDE for Android中开发应用时,我遇到了这个错误。该应用程序将成功编译但不会安装,报告此错误:

  

无法以root身份直接运行应用。考虑在设置中禁用直接运行。

     

警告:链接器:app_process具有文本重定位。这会浪费内存并且存在安全风险。请修理。
  pkg:/storage/sdcard/AppProjects/MyProgram/bin/MyProgram.apk
   失败[INSTALL_FAILED_DEXOPT]
  退出0

我研究了可能导致这种情况的原因,并且主要遇到了诸如"证书错误等原因,尝试重新签署包裹"和#34;在清单中设置两次权限"和其他东西,没有一个有效。

2 个答案:

答案 0 :(得分:1)

您的问题:Java认为您使用相同的签名定义两个方法。

Java方法签名定义:here

  

方法声明有六个组件,依次为:

     

1.修改者 - 例如公共,私人和其他您将在稍后了解的内容。

     

2.返回类型 - 方法返回的值的数据类型,如果方法未返回值,则返回void。

     

3.方法名称 - 字段名称的规则也适用于方法名称,但约定略有不同。

     

4.括号中的参数列表 - 以逗号分隔的输入参数列表,以其数据类型开头,括在括号中,()。   如果没有参数,则必须使用空括号。

     
      
  1. 一个例外列表 - 稍后讨论。
  2.   
  3. 括在括号之间的方法体 - 方法的代码,包括局部变量的声明,就在这里。
  4.   

如上所示,泛型类的规范不是java方法签名的一部分。因此,java会检测两个具有相同签名的add方法。

答案 1 :(得分:0)

我发现问题所在。在某些代码中看起来非常像这样:

public class Builder<T extends Base> {
    private final List<Def1> subDefs1 = new ArrayList<>();
    private final List<Def2> subDefs2 = new ArrayList<>();

    public Builder<T> add(final Collection<Def1> ds) {
        subDefs1.addAll(ds);
        return this;
    }

    public Builder<T> add(final Collection<Def2> ds) {
        subDefs2.addAll(ds);
        return this;
    }
}

interface Base {}

final class Def1 implements Base {}

final class Def2 implements Base {}

我有这些add方法,它们都采用某种Collection。这个问题必须与Java的平淡无奇的泛型和dexing过程有关,我猜......