借着Google IO 2018的热度,把项目依赖升级了一下。
Android Gradle Plugin: 3.1.0
Gradle: 4.7
Kotlin: 1.2.41
compileSdkVersion: 27
buildToolsVersion: ‘27.0.3’
targetSdkVersion: 27
CompileSdkVersion升级到27之后Android Framework层一些属性和方法有了可空类型的区分,会涉及到一些业务代码的修改。
升级targetSdk 27 遇到的引起Crash的问题
1. Notification适配问题:
没有适配Android O的Notification,targetSdk在27以下只是不显示Notification,targetSdk27之后会Crash。
android.app.RemoteServiceException
Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=null pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE)
2. 透明Activity适配问题
targetSdk27 之后Android8.0上Crash,在 Android 8.1 及以上没有问题。
java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
注意! 千万不要像StackOverflow第一个答案说的那样做, 不管用!!
正确的做法就是移除
android:screenOrientation=”portrait”
不要加
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
有人分析原因:Android认为非全屏的Activity应该和他下面的Activity有一致的orientation,所以不应该设置orientation。
觉得这个最多算个warning,不应该直接抛出异常。
这个问题涉及的功能会比较多,需要仔细检查如微信回调、支付回调等一些本身没有界面的Activity。
Gradle升级之后的问题:
1. Android Gradle Plugin 3.1.0 + Gradle 4.7
默认使用D8引擎,导致dexOptions设置dex包中最大方法数失效。
暂时通过关闭D8解决,gradle.properties中设置android.enableD8=false