Оптимизации должны также удалить #ожидание() звонки
Когда 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;
}