Android5.0和Android6.0适配

gradle配置项

  1. compileSdkVersion
    用哪个 Android SDK 版本编译你的应用。因此我们强烈推荐总是使用最新的 SDK 进行编译。在现有代码上使用新的编译检查可以获得很多好处,避免新弃用的 API ,并且为使用新的 API 做好准备。
  2. minSdkVersion
    是应用可以运行的最低要求,也是各大Android应用商店用来判断用户设备是否可以安装某个应用的标志之一
  3. targetSdkVersion
    targetSdkVersion 是 Android 提供向前兼容的主要依据
targetSdkVersion < 平台的API级别 向前兼容举个栗子:targetSdkVersion==23(6.0),当前设备Android版本7.0,运行程序时用6.0那一套接口。接口:API接口
targetSdkVersion = 平台的API级别 不启用兼容性
targetSdkVersion > 平台的API级别 举个栗子:targetSdkVersion==23(6.0),当前设备Android版本是 5.0 ,运行程序 用的是5.0那套接口。设备根本到不了6.0

是不是意味着targetSdkVersion越低越好?

  1. 使用低版本API的其中一个不足,显示的效果比较OUT,提供的可用的接口或类比较少
  2. 高版本API会针对低版本存在的问题进行改进和完善,摈弃一下不用的类或接口,新增一些方法或属性,如果你使用的方法是在某个API被另一个方法代替的话,你可能就得在代码中区分APP是运行在哪个版本的Android系统
  3. 应用平台对targetSdkVersion有要求

minSdkVersion <= targetSdkVersion <= compileSdkVersion

andorid 5.0 新特性

  1. Material Design
  2. 支持64位ART虚拟机。
  3. Overview 多任务视窗。
  4. RecyclerView
  5. 卡片CardView
  6. Palette是一个可以从图片(Bitmap)中提取颜色的帮助类,可以使UI更加美观,根据图片动态的显示相应的颜色

android 5.0适配

  1. 启动服务,不支持隐式调用的问题
    解决方案

    1. 使用action调用,必须指定包名启动(判断当前当前系统版本)
    2. ComponentName 传入包名和类名,必须是完整类名路径。
  2. android5.0 getRunningTasks 和getRunningAppProcesses(仅返回当前应用包名)失效
    解决方案

    1. 第一种办法,用 UsageStatsManager,需要权限,且只针对系统应用有效,而且要打开设置页面。
    2. 第二种,不需要权限,外国的一个开源项目:https://github.com/jaredrummler/AndroidProcesses(Android7.0后不生效)
  3. backgroundTint属性只能在5.0以上的api中调用
    解决方案

    1. 我们可以新建一个values-v21文件夹,这个里面声明的属性会在api21以上的机器上优先于values文件夹中执行
  4. Android API 21(5.0)引入了一个Drawable的子类VectorDrawable
    解决方案(https://www.jianshu.com/p/0972a0d290e9

    1. minSdkVersion<21:如果想要渲染矢量图的话必须在app模块的build.gralde文件里添加一行代码:

       defaultConfig {
       	vectorDrawables.useSupportLibrary = true
       }
      
    2. 在Application或者Activity上加上AppCompateDelegate开启CompatVectorFromResources支持

    3. Button,TextView,应用矢量图,保险的是先把矢量图转为selector,然后selector代替矢量图使用

  5. Android5.0上 WebView中Http和Https混合问题
    解决方案

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    }
    
  6. WebView cookie 存储问题

     public static void syncCookie(String url, String key) {
         CookieManager cookieManager = CookieManager.getInstance();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             cookieManager.removeSessionCookies(null);
             cookieManager.flush();
         } else {
             cookieManager.removeSessionCookie();
             CookieSyncManager.getInstance().sync();
         }
         cookieManager.setAcceptCookie(true);
         cookieManager.setCookie(url, key);
     }
    
  7. JobScheduler和JobService是安卓在api 21中增加的接口(保活),功能更强的闹钟


Android 6.0 适配及新特性

  1. 运行时权限,请务必在运行时检查和请求权限

    1. Normal Premission:普通权限

    2. Dangerous Permission/Group: 危险权限/组

      android.permission.READ_CALENDAR允许程序读取用户日历数据
      android.permission.WRITE_CALENDAR允许一个程序写入但不读取用户日历数据
      android.permission.CAMERA,允许访问摄像头进行拍照
      android.permission.READ_CONTACTS允许程序读取用户联系人数据
      android.permission.WRITE_CONTACTS允许程序写入但不读取用户联系人数据
      android.permission.GET_ACCOUNTS访问一个帐户列表在Accounts Service中
      android.permission.ACCESS_FINE_LOCATION允许一个程序访问精良位置(如GPS)
      android.permission.ACCESS_COARSE_LOCATION允许一个程序访问CellID或WiFi热点来获取粗略的位置
      android.permission.RECORD_AUDIO允许程序录制音频
      android.permission.CALL_PHONE允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认
      android.permission.READ_PHONE_STATE 访问电话状态
      android.permission.READ_CALL_LOG  查看电话日志
      android.permission.WRITE_CALL_LOG写入电话日志
      android.permission.ADD_VOICEMAIL  允许应用程序添加系统中的语音邮件
      android.permission.USE_SIP  允许程序使用SIP视频服务
      android.permission.PROCESS_OUTGOING_CALLS   允许应用程序监视、修改、忽略拨出的电话
      android.permission.BODY_SENSORS  允许该应用存取监测您身体状况的传感器所收集的数据,例如您的心率
      android.permission.SEND_SMS允许程序发送SMS短信
      android.permission.RECEIVE_SMS允许程序监控一个将收到短信息,记录或处理
      android.permission.READ_SMS允许程序读取短信息
      android.permission.RECEIVE_WAP_PUSH允许程序监控将收到WAP PUSH信息
      android.permission.RECEIVE_MMS允许一个程序监控将收到MMS彩信,记录或处理
      android.permission.WRITE_EXTERNAL_STORAGE   允许程序写入外部存储,如SD卡上写文件
      android.permission.READ_EXTERNAL_STORAGE   访问您设备上的照片、媒体内容和文件

  2. 取消支持 Apache HTTP
    解决方案:
    android {
    useLibrary 'org.apache.http.legacy'
    }

  3. BoringSSL
    请勿链接到并非 NDK API 组成部分的加密库,如 libcrypto.so 和 libssl.so

  4. 硬件标识符访问权

    1. WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法现在会返回常量值 02:00:00:00:00:00。
    2. 现在想访问硬件标识,如:WiFi和蓝牙,必须要有 ACCESS_FINE_LOCATION或者ACCESS_COARSE_LOCATION权限
      WifiManager.getScanResults()
      BluetoothDevice.ACTION_FOUND
      BluetoothLeScanner.startScan()
  5. AudioManager类 不再支持直接设置音量或将特定音频流静音

    1. setStreamSolo() 方法已弃用,您应该改为调用 requestAudioFocus() 方法。
    2. setStreamMute() 方法也已弃用,请改为调用 adjustStreamVolume() 方法并传入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE
  6. 相机服务变更

    1. 相机服务中共享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式
  7. dlopen failed: "has text relocations"

    1. 解决方案一:将targetSdkVersion 修改为<23
    2. 解决方案二: https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide 通过scanelf / objdump定位存在TEXTREL问题的文件, 以及关键代码在文件中的偏移量, 然后根据偏移量对应的特征 (函数名 / hard code的绝对地址等), 定位到代码所在.
    3. 在mk脚本中, 对LOCAL_CFLAGS, 增加-fPIC参数
  8. 电源管理
    在原有的电源管理的基础上加入了两种新的状态:

    1. App Standby—应用待机状态
    2. Doze 系统休眠状态
  9. 规范化App Link (应用程序链接)

  10. 指纹识别(统一API)

Android5.0和Android6.0适配

全文结束