targetSdk 28适配
升级配置
1.编译的build tool版本
build_tool_version=28.0.3
compile_sdk_version=28
min_sdk_version=16
target_sdk_version=28
2.gradle升级到5.1.1
distributionUrl=https://services.gradle.org/distributions/gradle-5.1.1-all.zip
3.升级gradle buildTools,由3.0.1升级到3.4.1(配置app bundle 至少3.4.0)
'com.android.tools.build:gradle:3.4.1'
升级遇到的问题
1. java.io.IOException: Cleartext HTTP traffic to
错误1: java.io.IOException: Cleartext HTTP traffic to 包名 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,当然这也需要服务端的支持。
2.在8.0之后前台服务使用startForegroundService()启动
错误2: 在8.0之后前台服务使用startForegroundService()启动,需要权限
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
3. android 8.0 报错StartForeground Bad Notification Error
错误3:android 8.0 报错StartForeground Bad Notification Error 解决方法
在android8.0后 需要给notification设置一个channelid
public final static String channelName="cn.george.app";
mNotificationManager.createNotificationChannel(
new NotificationChannel(channelName,
"Channel One",
NotificationManager.IMPORTANCE_HIGH));
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this,channelName)
.setContent(remoteViews)
.setSmallIcon(R.mipmap.pic);
4.Only fullscreen opaque activities can request orientation
错误4:Android 8.0.0错误:Only fullscreen opaque activities can request orientation
原因:对activity的theme设置了
<--这个属性true不能和这个Activity指定屏幕方向同时使用-->
<item name="android:windowIsTranslucent">true</item>
8.0.0源码中
if (isTranslucentOrFloating) {
throw new IllegalStateException(
"Only fullscreen opaque activities can request orientation");
}
抛出了异常,会在8.0.0手机出现闪退,在8.0.0之后的版本8.0.1做了处理。
解决办法,item改为
如果非要使用这个属性true,那就不要指定屏幕的方向
<item name="android:windowIsTranslucent">false</item>
或者
去掉
android:screenOrientation="xx"
5.android.support.v4.app.Fragment.setMenuVisibility(boolean)' on a null object reference
错误5:android.support.v4.app.Fragment.setMenuVisibility(boolean)' on a null object reference
android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(Unknown Source:23)
原因:
在api25的时候:
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment)object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
在api28的时候
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
this.setPrimaryItem((View)container, position, object);
}
发现28的时候object标记了@NoNull不能为null。则否则null异常。
所以不能传null。
Gradle build Tools升级问题
1、item下面不能有元素值,如下:
<item name="ad_holder" type="id"> 5 </item>
在buildConfig中配置res value的值
如果是第三方lib库中的
可在自己工程的ids.xml中配置一个无子元素的item
2、android.enableBuildCache=false 设置无效
gradle buildTools 2.2.3中enableBuildCache可设置不利用缓存编译
3.4.1中设置无效
2.2.3中设置过后编译,build文件夹中会出现:
/build/intermediates/bundles/default
/build/intermediates/exploded-aar
升级到3.4.1之后,以上两文件夹消失,只存在:
/build/intermediates/packaged-classes/release
引用的aar中拉取的maven仓库包都存在在~/.gradle/cache中