Android 8.0 上一个奇怪的IllegalStateException

Android 8.0 上一个奇怪的IllegalStateException

前言

API 26之后,给Activity应用Dialog主题,大部分第三方ROM都存在巨坑。

起因

公司项目在适配Android 8.0之后,爆发了一个触发率极高,而在Google Play Console上又找不到任何有效错误信息的IllegalStateException。Google Play Console统计信息如下:

java.lang.RuntimeException:
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3184)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3279)
  at android.app.ActivityThread.-wrap12 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1881)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7406)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:926)
Caused by: java.lang.IllegalStateException:
  at android.app.Activity.onCreate (Activity.java:1076)
  at android.support.v4.app.SupportActivity.onCreate (SupportActivity.java)
  at android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:15)
  at android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:36)
  at android.app.Activity.performCreate (Activity.java:7365)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1218)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3137)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3279)
  at android.app.ActivityThread.-wrap12 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1881)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7406)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:926)

以及统计到的另一个错误信息:

java.lang.RuntimeException:
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2946)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3046)
  at android.app.ActivityThread.-wrap11 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1688)
  at android.os.Handler.dispatchMessage (Handler.java:105)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6809)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)
Caused by: java.lang.IllegalStateException:
  at android.app.Activity.onCreate (Activity.java:995)
  at android.support.v4.app.SupportActivity.onCreate (SupportActivity.java)
  at android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:15)
  at android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:36)
  at android.app.Activity.performCreate (Activity.java:6998)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1230)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2899)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3046)
  at android.app.ActivityThread.-wrap11 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1688)
  at android.os.Handler.dispatchMessage (Handler.java:105)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6809)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

两份错误信息并无太大区别,但就从错误信息来看,触发该Bug的必然是项目中的Activity,而该Activity在执行其父类的代码时就已经崩溃,而自身的代码并没有执行。这找起来就棘手了,都不清楚是哪个页面引发的。于是再结合错误信息截图来看看:

2018-03-16-1.PNG
2018-03-16-2.PNG

错误仅仅发生在适配API 26的版本上,错误仅仅发生在API 26的ROM,而手头的两台设备,Nexus 5X 跟Pixel 2 XL都未触发,而Google Play Console上也没有统计到亲儿子存在该问题,出问题的基本上都是国内的ROM,尤其华为的居多。

现在所知的关键点是,targetSdkVersion在26及以上且系统API在26及以上的设备才会触发,而触发的Activity连自身的代码都没有执行。那么就只剩Activity的声明处了,先去8.0行为变更里面看了一遍,并没有对Activity声明增加新的要求。翻开AndroidManifest.xml文件,所有的Activity都检查一遍,也并没有不和谐之处,无非是设置一下label以及配置一下theme。这些信息都不足以查出触发点来时,就只能找一台可以触发的机器了,于是通过测试的同事找来一台在触发机器列表里的手机,然而系统与应用及设备均符合触发条件,可这台机器就是不触发,实在无解。

眼见着就要无从下手了,但忽然想到公司项目还接入了友盟统计,抱着侥幸的心理上去看看是否有什么蛛丝马迹。不常使用友盟查看崩溃统计主要是其C++层的报错完全统计不到(项目涉及NDK开发)而数据又不够直观。幸运的是友盟果然统计到了重要信息,除开上面的报错信息以外,其补上了Google Play Console漏掉的一部分,而这一部分非常关键:

java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
  at android.app.Activity.onCreate (Activity.java:1076)
  at android.support.v4.app.SupportActivity.onCreate (SupportActivity.java)
  at android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:15)
  at android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:36)
  at android.app.Activity.performCreate (Activity.java:7365)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1218)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3137)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3279)
  at android.app.ActivityThread.-wrap12 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1881)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7406)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:926)

问题

其实仅仅这一句话最关键:

Only fullscreen opaque activities can request orientation

只有全屏不透明的Activity可以请求方向

没错,项目里的部分Activity应用了Dialog的主题,也就是说它是非全屏且透明的Activity。然而奇怪的是,这些Dialog样式的Activity并没有设定screenOrientation属性,也就是该属性用的是默认值,于该Activity来说并没有request orientation,因此,此处个人判定,应该是第三方ROM的问题。对于Dialog样式的Activity,即便是设置了screenOrientation属性,也不应该Activity崩溃,而应该是设置的screenOrientation属性无效,更何况并没有设置screenOrientation属性,仅仅是对Activity应用了Dialog的主题。

解决

定义一个透明的Activity主题:增加android:windowIsTranslucent属性为true,并设置透明的背景。而对于非要使用对话框样式的Activity,那么就对照对话框的Theme进行设置了,此处不展开说了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,142评论 25 707
  • 对好看的脸,会很认真的看一看,所以记得比较牢。对不好看的脸,都不会仔细去看,所以看了一眼之后就记不清长相了。 记不...
    Emma_L阅读 343评论 0 3
  • 从小到大,我从来不知道什么是爱,我以为爱情就是爱,亲亲我我就是爱,被人欣赏就是爱,被人认可就是爱,被人夸奖就...
    金晶花阅读 248评论 0 0
  • 520,多么有仪式感的日子。节日不是用来证明什么,只是让对方知道,你对我的重要性,我对你的重要性。仪式感是推进情感...
    senny1978阅读 231评论 0 2
  • 用相机定格时间,记录花儿最美好的时光。图片拍摄于乌鲁木齐。 ------------------ The end ...
    荷语微光阅读 173评论 2 1