Android targetSDK升级到28,gradle升级4.6遇到的问题

  最近看友盟上app使用的设备统计,Android8.1以上的用户超过60%,于是想把targetSDK直接从26改成28,这样就可以更好地适配8.1的用户。但是遇到了如下一些问题,以及最终黑白灰名单的问题无法确认完全搞定,于是放弃掉,还是保留在targetSDK=26,等待新系统Q出来以及P的用户增多稳定后,再一起切换成29吧。

遇到的问题:
1.修改如下android编译参数:

compileSdkVersion = 28
buildToolsVersion = "28.0.3"
targetSdkVersion = 28
supportVersion = "28.0.0"

并修改gradle插件版本成:

classpath 'com.android.tools.build:gradle:3.2.0'

gradle的版本修改成4.6, sync后,编译出现如下错误:
Android targetSDK升级到28,gradle升级4.6遇到的问题_第1张图片

解决方法: 对着代码看,有一段我是这么写的:

variant.mergedFlavor.versionCode = gitBuildCode()

上面的代码,在Gradle4.6就不支持,不能直接修改,所以不能直接这么用,应该改成这样:

def versionCode = gitBuildCode()

2.Http明文网络加载被限制,报错“Cleartext HTTP traffic to xxx not permitted”,之前可以正常显示的Http图片,以及webview打开报错了。
出异常的系统版本是 O(8.1) P 和 Q, 在 O(8.0)及以下的机型,都可以正常显示。

解决方法: 由于APP里面还有部分接口数据没完全转成https,所以不能用网上一些说的过滤指定域名的方法,需要一个类似通配符,允许所有的http流量,所以是选择了AndroidManifest.xml里的application标签里,加上:

android:usesCleartextTraffic="true"

3.用google工具veridex来静态检测黑白灰名单,但是三个问题:
(1)我明显写入的黑名单方法,工具却没有检测出来,如下图:
Android targetSDK升级到28,gradle升级4.6遇到的问题_第2张图片
Android targetSDK升级到28,gradle升级4.6遇到的问题_第3张图片

但是APP运行时候,logcat会报错,提示是黑名单方法:
在这里插入图片描述

(2)veridex工具这段时间也在不断地更新,检测结果已经没有网上文章说的那种dark-grey或者light-grey了,都只是greylist,我不好区分哪些greylist以后是会被禁止使用:
Android targetSDK升级到28,gradle升级4.6遇到的问题_第4张图片

(3)当targetSDK为不同参数时候,分别运行如下3种测试代码,会有不同的表现:

// 直接在浅灰名单中找的接口
public void testLightGreyList() {
    ReflectUtils.getMethod(TelephonyManager.class, "isMultiSimEnabled");
}

// 直接在深灰名单中找的接口
@TargetApi(Build.VERSION_CODES.M)
public void testDarkGreyList() {
    ReflectUtils.getField(CarrierConfigManager.class, "KEY_ALWAYS_PLAY_REMOTE_HOLD_TONE_BOOL");
}

// 直接在黑名单中找的接口
public void testBlackList() {
    try {
        ReflectUtils.getMethod(ReflectUtils.getClass("android.net.util.IpUtils"), "ipChecksum", ByteBuffer.class, int.class);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

具体的这三种表现如下表格:

targetSDK 系统版本 blacklist dark-grey light-grey
28 P或Q 报错NoSuchFieldException 报错NoSuchFieldException 正常访问
28 低于P 报错NoSuchFieldException 报错NoSuchFieldException 正常访问
低于28 P或Q 报错NoSuchFieldException 正常访问 正常访问
低于28 低于P 报错ClassNotFoundException 报错NoSuchFieldException 正常访问

鉴于如上第二、第三小点的问题,让我迟疑不决,不知道是否还有其他第三方SDK方法,灰黑名单会变动,导致后面的系统会把他们api禁止掉,希望有人帮忙解答下?

4.不把targetSDK设成28,将其设置成27,也是有一个奇葩的问题如下,虽然有一些比较绕的解决方法,但是感觉实现不优雅。
Android targetSDK升级到28,gradle升级4.6遇到的问题_第5张图片

综上第三、第四大点的问题,我又讲targetSDK改回26了…

参考:
https://blog.csdn.net/qq_38900441/article/details/84308348 “Webpage not available err_cleartext_not_permitted”
https://zhuanlan.zhihu.com/p/32190223 “Only fullscreen activities can request orientation?一个搞笑的坑!”

原创文章,欢迎转载,转载请注明:ifish.site

作者:JaydenZhou

你可能感兴趣的:(Android模块)