2015-06-28 2 views
1

При разработке приложения в AIDE для Android я столкнулся с этой ошибкой. Приложение компилируется успешно, но не установить, сообщение об этой ошибке:Приложение для Android не может установить

Could not run the App directly as root. Consider disabling direct running in the settings.

WARNING: linker: app_process has text relocations. This is wasting memory and is a security risk. Please fix.
pkg: /storage/sdcard/AppProjects/MyProgram/bin/MyProgram.apk
Failure [INSTALL_FAILED_DEXOPT]
exit with 0

Я исследовал, что может привести к этому, и в основном попадался причин, как «ошибка сертификата, попробуйте отставку пакет» и «установив разрешение в два раза манифест "и другие вещи, ни одна из которых не сработала.

ответ

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, я думаю ...

1

Ваша проблема: Java думает, что вы определяете два метода с одной и той же сигнатурой.

Java определение метода подписи: https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

method declarations have six components, in order:

1.Modifiers—such as public, private, and others you will learn about later.

2.The return type—the data type of the value returned by the method, or void if the method does not return a value.

3.The method name—the rules for field names apply to method names as well, but the convention is a little different.

4.The parameter list in parenthesis—a comma-delimited list of input parameters, preceded by their data types, enclosed by parentheses,(). If there are no parameters, you must use empty parentheses.

  1. An exception list—to be discussed later.
  2. The method body, enclosed between braces—the method's code, including the declaration of local variables, goes here.

Как вы можете видеть выше, спецификация общих классов не является частью метода ява подписи. Поэтому java обнаруживает два дополнительных метода с одной и той же сигнатурой.

+0

Это правильно, но почему компилятор не обнаружил эту проблему? Как я уже упоминал, он скомпилирован успешно, но не установлен. –