美文网首页9.0Bugs程序编码
targetSdkVersion升级到28一些修改的地方

targetSdkVersion升级到28一些修改的地方

作者: 申国骏 | 来源:发表于2018-07-18 20:09 被阅读799次

    前言

    Google Play应用市场对于应用的targetSdkVersion有了更为严格的要求。从 2018 年 8 月 1 日起,所有向 Google Play 首次提交的新应用都必须针对 Android 8.0 (API 等级 26) 开发; 2018 年 11 月 1 日起,所有 Google Play 的现有应用更新同样必须针对 Android 8.0。

    以下记录了我们升级targetSdkVersion的坑以及解决办法,希望对各位开发者有帮助。

    错误1. java.lang.IllegalStateException: Not allowed to start service Intent {}: app is in background uid UidRecord{}

    原因分析

    从Android8.0开始,系统会对后台执行进行限制。初步判断由于我们应用在Application的onCreate过程中使用了IntentService来后台初始化一些任务,这个时候被系统认为是应用还处于后台,从而报出了java.lang.IllegalStateException错误。

    解决办法

    解决后台服务的限制,首先想到的办法是将服务变成前台服,随即我们又遇到了另一个问题,见错误2

    错误2. android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{}

    原因分析

    见Android8.0行为变更。新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。

    解决办法

    在后台服务启动执行执行之后,通过Service.startForeground()方法传入notification变成前台服务。需要注意的是从Android8.0开始,Notification必须制定Channel才可以正常弹出通知,如果创建Notification Channels详见这里

    由于我们的初衷是在启动程序的过程中后台进行一些初始化,这种前台给用户带来感知的效果并不是我们所希望的,因此我们考虑可以采用另一个后台执行任务的方法。这里官方推荐使用JobScheduler。由于我们引入了ktx以及WorkManager,这里我们采用了OneTimeWorkRequest来实现。具体实现如下:

    class InitWorker : Worker(){
        override fun doWork(): Result {
            // 把耗时的启动任务放在这里
    
            return Result.SUCCESS
        }
    }
    

    然后在Applicaiton的onCreate中调用

    val initWork = OneTimeWorkRequestBuilder<InitWorker>().build()
    WorkManager.getInstance().enqueue(initWork)
    

    来执行后台初始化工作

    错误3. java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion; Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion"

    原因分析

    Android P Developer Preview的bug

    解决办法

    在AndroidManifest.xml文件中<Application>标签里面加入

    <uses-library android:name="org.apache.http.legacy" android:required="false"/>
    

    错误4. java.io.IOException: Cleartext HTTP traffic to dict.youdao.com not permitted

    原因分析

    从Android 6.0开始引入了对Https的推荐支持,与以往不同,Android P的系统上面默认所有Http的请求都被阻止了。

    <application android:usesCleartextTraffic=["true" | "false"]>
    

    原本这个属性的默认值从true改变为false

    解决办法

    解决的办法简单来说可以通过在AnroidManifest.xml中的application显示设置

    <application android:usesCleartextTraffic="true">
    

    更为根本的解决办法是修改应用程序中Http的请求为Https,当然这也需要服务端的支持。

    相关文章

      网友评论

      • 1dfc940e8c1c:感谢分享。
        今天改这个遇到坑了。Unity5.3.6f,加了26之后,可选的目标级别最高还是25,
        直接选了0,
        打包的时候报错。请问有哪些地方要跟着改
      • 有点健忘:收藏下,万一以后适配碰到好改

      本文标题:targetSdkVersion升级到28一些修改的地方

      本文链接:https://www.haomeiwen.com/subject/bruapftx.html