我的应用程序发生运行时崩溃,可能绑定到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
支持人员,等待响应。有人知道吗? 最佳答案
我已经坚持了一个星期的大部分时间,不得不在构建中禁用Dexguard,但是我终于弄清楚了。我希望这也对您有用。
问题似乎出在新的(ish)D8除糖器中,它取代了旧的DX版本。默认情况下,Android Studio 3.x中启用了D8。因此,必须正确构建项目(据我所知,this article帮助理解了这一点)。
对我有用的是从项目范围内的Gradle设置gradle.properies
删除此行:
android.enableD8.desugaring=false
我一直在忽略Gradle同步阶段输出中的以下警告:
警告:选项设置'android.enableD8.desugaring = false'是实验性的,不受支持。
我想不要忽视警告是我在这里的教训!我找不到关于为什么这导致问题发生的任何真正好的信息,但是考虑到D8是dexer,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
的属性不会误读为缺少,因此即使应为true,也默认为false。这就是为什么建议使用以下Theme
属性的建议将不起作用,将其进行变形(或去除残渣,或其中的一部分)的原因。 <item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
无论如何,如果您是子主题
Theme.AppCompat.Light.NoActionBar
,那么这些已经设置好了,您不需要这样做。我在这条路线上花了一些时间,例如here,here,here,here和here。然后出现错误是因为
!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时所期望的名称。有some advice建议手动调用它,但是最终还是行不通,因为实际上我认为还有其他问题,这只是第一个遇到问题。这就是为什么以及如何发生。该修补程序没有直接关系,因此正如我在开始时所说,请查看您的D8配置。还有机会需要更新Dexguard的配置或版本,用Dexguard版本,Android Studio版本管理Gradle版本一直是一场噩梦,这很困难。希望这对您有所帮助,并引起其他人的关注。
关于android - dexguard 8.2.16导致运行时崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52606133/