Приложение Android не может установить

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

Не удалось запустить приложение напрямую от имени пользователя root. Попробуйте отключить прямой запуск в настройках.

ВНИМАНИЕ: компоновщик: app_process имеет текстовые релокации. Это напрасная трата памяти и угроза безопасности. Пожалуйста, исправьте.
pkg: /storage/sdcard/AppProjects/MyProgram/bin/MyProgram.apk
Ошибка [INSTALL_FAILED_DEXOPT]
выход с 0

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


person intrepidis    schedule 28.06.2015    source источник


Ответы (2)


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

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

объявления метода состоят из шести компонентов по порядку:

1. Модификаторы — такие как общедоступные, приватные и другие, о которых вы узнаете позже.

2. Тип возвращаемого значения — тип данных значения, возвращаемого методом, или void, если метод не возвращает значение.

3. Имя метода — правила для имен полей применяются и к именам методов, но соглашение немного отличается.

4. Список параметров в скобках — список входных параметров, разделенных запятыми, которым предшествуют их типы данных, заключенные в круглые скобки (). Если параметры отсутствуют, необходимо использовать пустые скобки.

  1. Список исключений — обсудим позже.
  2. Тело метода, заключенное в фигурные скобки — здесь идет код метода, включая объявление локальных переменных.

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

person Coder55    schedule 28.06.2015
comment
Это правильно, но почему компилятор не обнаруживает эту проблему? Как я уже говорил, он успешно скомпилирован, но не установлен. - person intrepidis; 29.06.2015

Я нашел, в чем проблема. Это было в каком-то коде, который выглядел очень похоже на это:

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

person intrepidis    schedule 28.06.2015