Оптимизации должны также удалить #ожидание() звонки


Когда Proguard оптимизирует мое приложение, это означает, что все вызовы Object#wait() удаляются.

Таким образом, каждый поток, который должен пассивно ждать (до уведомления), теперь активно ждет (100% загрузка процессора).

Когда оптимизация завершается с помощью -dontoptimize, все в порядке.

Если мне нужна оптимизация для удаления некоторого метода с -assumenosideeffects, я ищу, что не так.
Можно ли сохранить все вызовы Object#wait() для оптимизации (удаляется)?

Есть ли какое-нибудь другое решение?

Правка 1: Например, этот код:


@Override
public void run() {
    isRunning = true;
    try {
        while (isRunning) {
            if (parent.isActivate) {
                parent.updateDriveButtons();
                synchronized (this) {
                    wait(1000);
                }
            }
            else {
                synchronized (this) {
                    // Wait for that the page is activated.
                    Utils.wait(this);
                }
            }
        }
    }
    catch (Throwable e) {
        e.printStackTrace();
    }
    finally {
        isRunning = false;
    }
}

Заменяется этим кодом (после декомпиляции оптимизированного кода): wait() был удален, и только синхронизация видна с monitorenter; ... monitorexit;


 public final void run()
  {
    this.isRunning = true;
    try {
      while (this.isRunning) {
        if (this.parent.isShowing()) {
          ...
          monitorenter;
          monitorexit; continue;
        }

        monitorenter;

        monitorexit;
      }return;
    } catch (Throwable localThrowable) {
      Object Ljava/lang/Object;;
      return;
    } finally {
      this.isRunning = false; } throw localObject1;
  }
1 2

1 ответ:

Похоже, вы задаете параметры -assumenosideeffects, которые также соответствуют Object#wait(). Затем ProGuard с радостью удаляет эти вызовы для вас. Вероятно, вам не следует добавлять параметры -assumenosideeffects помимо тех, которые описаны в руководстве ProGuard.