Сбои во время выполнения с dexguard 8.2.16

У меня сбой во время выполнения в нашем приложении, вероятно, связанный с Dexguard запутыванием. У приложения нет проблем в режиме отладки и выпуска без обфускации, однако, как только я создаю подписанный apk, я получаю этот сбой во время выполнения:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{it.package.name/it.package.name.login.SignInActivity}: java.lang.IllegalArgumentException: AppCompat does not support the current theme features: { windowActionBar: false, windowActionBarOverlay: false, android:windowIsFloating: false, windowActionModeOverlay: false, windowNoTitle: false }
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2815)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1614)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:171)
        at android.app.ActivityThread.main(ActivityThread.java:6649)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
     Caused by: java.lang.IllegalArgumentException: AppCompat does not support the current theme features: { windowActionBar: false, windowActionBarOverlay: false, android:windowIsFloating: false, windowActionModeOverlay: false, windowNoTitle: false }
        at o.ﭥ.ʿ(:469)
        at o.ﭥ.ʽॱ(:323)
        at o.ﭥ.ˋ(:284)
        at o.ᵈ.setContentView(:139)
        at it.package.name.login.SignInActivity.onCreate(:61)

Строка 61 — это простая инструкция setContentView.

Вот мой файл styles.xml:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@android:color/transparent</item>
        <item name="colorPrimaryDark">@color/colorPrimaryGrey</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorHint">@color/hintColor</item>
        <item name="android:fontFamily">@font/montserrat_regular</item>
        <item name="android:background">@android:color/transparent</item>
    </style>

    <style name="AppThemeTranslucent" parent="AppTheme">
        <!-- Customize your theme here. -->
        <item name="android:background">@null</item>
    </style>

    <style name="DialogFragmentStyle" parent="Base.Theme.AppCompat.Light.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsFloating">false</item>
    </style>

    <style name="RegistrationTheme" parent="AppTheme">
        <item name="android:windowBackground">@color/registrationBackgroundColor</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDarkGreen</item>
        <item name="colorAccent">@color/colorPrimary</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:textColorSecondary">@color/colorPrimary</item>
    </style>

    <style name="RegistrationTitle" parent="RegistrationTheme">
        <item name="android:textSize">@dimen/registration_title_font_size</item>
        <item name="android:textColor">@color/registrationTitleTextColor</item>
        <item name="android:textStyle">bold</item>
    </style>

    <style name="PopupTitle" parent="RegistrationTitle">
        <item name="android:textSize">@dimen/popup_title_font_size</item>
    </style>

    <style name="PermissionButton" parent="Base.Widget.AppCompat.Button.Borderless">
        <item name="android:height">56dp</item>
        <item name="android:textColor">@color/registrationTitleTextColor</item>
        <item name="android:textSize">14sp</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:padding">0dp</item>
    </style>

    <style name="PopupSubtitle" parent="RegistrationAbstract">
        <item name="android:textSize">@dimen/popup_subtitle_font_size</item>
    </style>

    <style name="RegistrationAbstract" parent="RegistrationTheme">
        <item name="android:textSize">@dimen/registration_abstract_font_size</item>
        <item name="android:textColor">@color/registrationTitleTextColor</item>
        <item name="android:lineSpacingExtra">@dimen/registration_abstract_spacing_extra</item>
    </style>

    <style name="RegistrationEditText" parent="RegistrationTheme">
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">@color/colorPrimary</item>
        <item name="android:background">@android:color/white</item>
        <item name="android:paddingStart">@dimen/activity_horizontal_margin</item>
        <item name="android:paddingEnd">@dimen/activity_horizontal_margin</item>
        <item name="android:paddingTop">@dimen/base_padding</item>
        <item name="android:paddingBottom">@dimen/base_padding</item>
        <item name="android:minHeight">@dimen/edit_text_min_height</item>
    </style>

    <style name="FabStyle" parent="RegistrationTheme">
        <item name="colorAccent">@android:color/white</item>
    </style>

    <style name="AndroidImageSlider_Magnifier_Oval_Green">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:gravity">center</item>
        <item name="android:paddingLeft">5dp</item>
        <item name="android:paddingRight">5dp</item>
        <item name="shape">oval</item>
        <item name="padding_left">6dp</item>
        <item name="padding_right">6dp</item>
        <item name="padding_top">4dp</item>
        <item name="padding_bottom">4dp</item>

        <item name="selected_color">@color/green</item>
        <item name="unselected_color">#95D8B9</item>
        <item name="selected_width">10dp</item>
        <item name="selected_height">10dp</item>
        <item name="unselected_width">10dp</item>
        <item name="unselected_height">10dp</item>
    </style>

    <style name="CustomToggleButton" parent="Widget.AppCompat.Button">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:background">@null</item>
        <item name="android:minHeight">0dp</item>
        <item name="android:minWidth">0dp</item>
        <item name="android:padding">10dp</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textOff">@string/SignIn_HidePassword_Button</item>
        <item name="android:textOn">@string/SignIn_ShowPassword_Button</item>
    </style>

    <style name="ThemeOverlay.AppCompat.navTheme">
        <!-- Color of text and icon when SELECTED -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <!-- Background color when SELECTED -->
        <item name="colorControlHighlight">@android:color/transparent</item>
    </style>

    <style name="DefaultCardLayout">
        <item name="android:background">@color/white</item>
        <item name="android:paddingStart">13dp</item>
        <item name="android:paddingEnd">13dp</item>
        <item name="android:paddingTop">22dp</item>
        <item name="android:paddingBottom">22dp</item>
    </style>

    <style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
        <!--<item name="tabMaxWidth">@dimen/tab_max_width</item>-->
        <item name="tabIndicatorColor">@color/colorPrimary</item>
        <item name="tabIndicatorHeight">2dp</item>
        <item name="tabPaddingStart">12dp</item>
        <item name="tabPaddingEnd">12dp</item>
        <item name="tabBackground">?attr/selectableItemBackground</item>
        <item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item>
        <item name="tabSelectedTextColor">?android:textColorPrimary</item>
    </style>

    <style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">?android:textColorSecondary</item>
        <item name="textAllCaps">false</item>
    </style>

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

    <!-- Splash Screen theme. -->
    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_background</item>
    </style>

    <style name="GreenText" parent="AppTheme">
        <item name="android:textColor">@color/green</item>
        <item name="android:textStyle">bold</item>
    </style>

    <style name="DarkGreenText" parent="AppTheme">
        <item name="android:textColor">@color/zehus_dark_green</item>
        <item name="android:textStyle">bold</item>
    </style>

    <style name="CheckboxStyle" parent="Widget.AppCompat.CompoundButton.CheckBox">
        <item name="android:button">@drawable/custom_checkbox</item>
    </style>

    <style name="StartRentalStyle" parent="Widget.AppCompat.Button.Colored">
        <item name="colorControlNormal">@color/green</item>
        <item name="android:textColor">@color/white</item>
    </style>

    <style name="GreenTint" parent="ThemeOverlay.AppCompat.Dark">
        <!-- customize colorButtonNormal for the disable color -->
        <!-- customize colorAccent for the enabled color -->
        <item name="colorButtonNormal">@color/zehus_dark_green_disabled</item>
        <item name="colorAccent">@color/zehus_dark_green</item>
        <item name="textColor">@color/white</item>
        <item name="textAllCaps">false</item>
    </style>

    <style name="BookedTint" parent="Widget.AppCompat.Button.Colored">
        <item name="colorControlNormal">@color/base_orange</item>
        <item name="textColor">@color/white</item>
        <item name="textAllCaps">false</item>
    </style>


    <style name="WhiteTint" parent="Widget.AppCompat.Button.Colored">
        <item name="colorControlNormal">@color/white</item>
        <item name="textAllCaps">false</item>
    </style>

</resources>

Здесь есть styles.xml (v21)

<resources>

    <style name="StartRentalStyle" parent="Base.Widget.AppCompat.Button">
        <item name="android:backgroundTint">@color/green</item>
        <item name="android:textColor">@color/white</item>
    </style>

    <style name="AppThemeTranslucent" parent="AppTheme">
        <!-- Customize your theme here. -->
        <item name="android:navigationBarColor">@android:color/transparent</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:background">@null</item>
    </style>
</resources>

Я уже написал в поддержку DexGuard, жду ответа. Кто-нибудь знает?


person Nicola Gallazzi    schedule 02.10.2018    source источник
comment
У вас есть SignInActivity ? Какие есть стили для этого?   -  person ʍѳђઽ૯ท    schedule 02.10.2018
comment
SignInActivity наследует AppTheme и расширяет AppCompatActivity. Вылетает сразу после onCreate на setContentView   -  person Nicola Gallazzi    schedule 02.10.2018
comment
Вы не пробовали установить отдельные стили для LoginActivity и родителя: parent="Theme.AppCompat.Light.NoActionBar" или выполнить чистую перестройку проекта?   -  person ʍѳђઽ૯ท    schedule 02.10.2018
comment
Моя активность называется SignInActivity, к сожалению, я не думаю, что проблема связана с этой конкретной активностью, все приложение наследует эту тему, и я не хочу создавать другую тему, которая мне не нужна.   -  person Nicola Gallazzi    schedule 02.10.2018


Ответы (1)


Я застрял на этом большую часть недели, и мне пришлось отключить Dexguard в сборках, но я наконец-то понял это. Я надеюсь, что это сработает и для вас.

Проблема, по-видимому, заключается в новой версии D8 desugar-er, которая заменила старую версию DX. D8 включен по умолчанию в Android Studio 3.x. Таким образом, необходимо правильно собрать проект (насколько я понимаю, эта статья помогло это понять).

Что сработало для меня, так это удаление этой строки из gradle.properies, настроек Gradle для всего проекта:

android.enableD8.desugaring=false

Я игнорировал следующее предупреждение из вывода фазы синхронизации Gradle:

ПРЕДУПРЕЖДЕНИЕ. Параметр «android.enableD8.desugaring=false» является экспериментальным и не поддерживается.

Я думаю, не игнорируйте предупреждения, вот мой урок! Я не смог найти никакой действительно хорошей информации о том, почему это вызывает проблему, но имеет смысл, что это будет в этой области, учитывая, что D8 является dexer, и Dexguard, конечно, также влияет на dexing.

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

Для действий AppCompatActivity setContentView(...) обрабатывается конкретным классом AppCompatDelegateImpl, который реализует setContentView. При первой настройке будет createSubDecor() устанавливаться Window корень 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, не будет работать, dexing (или desugaring, или какая-то часть этого) испортит его.

    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>

В любом случае, если вы используете подтемы 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... это сложно. Надеюсь, это поможет вам и заинтересует других.

person r3flss ExlUtr    schedule 10.08.2019