Сбой во время выполнения с 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
поддержка, ожидая ответа. У кого-нибудь есть подсказка?
0 ответов
Я застрял на этом большую часть недели, и мне пришлось отключить 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
корень 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... это сложно. Надеюсь, это поможет вам и представляет интерес для других.