Я застрял на этом большую часть недели, и мне пришлось отключить Dexguard на билдах, но я наконец понял это.Я надеюсь, что это работает и для вас.
Проблема, по-видимому, в новом (ish) D8 desugar-er, который заменил старую версию DX.D8 включен по умолчанию в Android Studio 3.x.Таким образом, требуется правильно построить проект (насколько я понимаю, эта статья помогла понять это).
Для меня сработало удаление этой строки из gradle.properies
,настройки Gradle для всего проекта:
android.enableD8.desugaring=false
Я игнорировал следующее предупреждение из вывода фазы синхронизации Gradle:
ПРЕДУПРЕЖДЕНИЕ: настройка параметра 'android.enableD8.desugaring =false 'является экспериментальным и не поддерживается.
Я думаю, не игнорируйте предупреждения - мой урок здесь!Я не смог найти действительно хорошей информации о том, почему это приводит к возникновению проблемы, но имеет смысл, что это произойдет в этой области, учитывая, что D8 является дексером, и Dexguard, конечно, также влияет на дексинг.
Я хотел бы также поделиться с вами информацией о причине аварии на уровне поверхности, поскольку это может быть полезно знать, и я, безусловно, рад, что я внимательно посмотрел на нее.
Для AppCompatActivity
действий,setContentView(...)
обрабатывается AppCompatDelegateImpl
конкретным классом, который реализует setContentView
.При первой настройке будет createSubDecor()
для установки Window
root ViewGroup
.
Неудачный случай, который мы оба испытали, состоит в том, что последнее условие здесь не выполняется:
private ViewGroup createSubDecor() {
TypedArray a = mContext.obtainStyledAttributes(R.styleable.AppCompatTheme);
if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {
a.recycle();
throw new IllegalStateException(
"You need to use a Theme.AppCompat theme (or descendant) with this activity.");
}
if (a.getBoolean(R.styleable.AppCompatTheme_windowNoTitle, false)) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
} else ...
Таким образом, атрибут для windowNoTitle
не читается неправильно как отсутствующий, и поэтому по умолчанию имеет значение false, даже если он должен быть истинным.Вот почему совет, говорящий об использовании следующих атрибутов Theme
, не будет работать, дексинг (или десагеринг, или какая-то его часть) испортит его.
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
В любом случае, если вы не согласныTheming Theme.AppCompat.Light.NoActionBar
, тогда они уже установлены, и вам не нужно это делать.Я потерял некоторое время, идя по этому маршруту, например, здесь , здесь , здесь , здесь и здесь .
Ошибка возникает из-за отсутствия условия условия по умолчанию, если !mWindowNoTitle && !(mIsFloating || mHasActionBar)
, как вы можете видеть в этой упрощенной версии кода, которая надувает subDecor
ViewGroup
:
if (!mWindowNoTitle) {
if (mIsFloating) {
subDecor = ...
} else if (mHasActionBar) {
subDecor = ...
}
// else, nothing! subDecor remains null, problem case
} else {
if (mOverlayActionMode) {
subDecor = ...
} else {
subDecor = ...
}
}
if (subDecor == null) {
throw new IllegalArgumentException(
"AppCompat does not support the current theme features: { "
+ ....);
}
Так что в основном нам нужно mWindowNoTitle
, чтобы быть правдой.Между прочим, он здесь на самом деле не установлен, он установлен requestWindowFeature(Window.FEATURE_NO_TITLE)
, что и называется, если атрибут windowNoTitle
установлен в true, как и ожидалось.Существует некоторый совет , предлагающий вызывать его вручную, но в конечном итоге это не работает, так как на самом деле я думаю, что другие проблемы, это всего лишь первое, что получает удар.
Так что этопочему и как это происходит.Исправление не имеет прямого отношения, поэтому, как я сказал в начале, посмотрите на конфигурацию D8.Также есть шанс, что вам нужно обновить конфигурацию или версию Dexguard, это был кошмар, управляющий версиями Gradle с версиями Dexguard, версиями Android Studio ... это сложно.Надеюсь, это поможет вам и будет интересно другим.