Android Marshmallow
Давайте познакомимся…
Mobile Dimension LLCСтарший Android Разработчик
Учебный центр «Jolly Droid»Основатель и преподаватель
Игорь Цеглевский
http://mobiledimension.ru
http://jollydroid.ru
Marshmallow
Permissions
Permissions
• targetSdkVersion=22– Permissions (права доступа) работают как прежде:
разрешено всё, что описано в манифесте– Пользователь может в настройках отозвать любое
из прав! • Андроид предупреждает, что это может вызвать падение
приложения, но не запрещает• При изменении списка прав приложение будет
остановлено– Если пользователь отозвал права, то
соответствующие API вернут 0 или null
Permissions
• targetSdkVersion=23– «Нормальные» права доступа даются
автоматически– «Опасные» права необходимо запросить явно,
для каждой группы– «Опасные» права пользователь может отозвать
в настройках приложения. Приложение должно всегда (каждый раз при обращении к соответствующим API) проверять наличие прав
Permissions. Steps
ActivityCompat.shouldShowRequestPermissionRationale()
ContextCompat.checkSelfPermission()
Нет
ActivityCompat.requestPermissions()
Notification-Объяснение
Работаем
Да
Нет
Да
Permissions. Steps
Permissions. Steps
grantResults[0] ==PackageManager.PERMISSION_GRANTED
Учитываем в работе или информируем пользователя
onRequestPermissionsResult()
Работаем
Нет
Да
Permissions. Interface
Permissions. Ресурсы
https://gist.github.com/tseglevskiy/cc715f36e10ad81c83b6
http://developer.android.com/intl/ru/training/permissions/requesting.html
https://newcircle.com/s/post/1737/2015/05/31/the-new-android-m-permissions-model
http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en
http://habrahabr.ru/post/269491/
ID
ID наши• WiFi MAC, Bluetooth MAC:
– всегда 02:00:00:00:00:00• Phone number (telephonyManager.getLine1Number()):
требуется:– READ_PHONE_STATE «Осуществление телефонных звонков и
управление ими» – или READ_SMS «Отправлять и просматривать SMS-
сообщения»• IMEI (telephonyManager.getDeviceId()):
– требуется READ_PHONE_STATE• Попробуйте Settings.Secure.ANDROID_ID
ID чужие
• Доступ к данным, содержащим ID окружающих устройств требует ACCESS_COARSE_LOCATION– WifiManager.getScanResults()– BluetoothDevice.ACTION_FOUND– BluetoothLeScanner.startScan()
• Note: When a device running Android initiates a background Wi-Fi or Bluetooth scan, the operation is visible to external devices as originating from a randomized MAC address.
App Standby and Doze Mode
Doze Mode & App Standby
• Doze Mode – режим, в который устройство переходит, если находится некоторое время с залоченным экраном, без движения и работающее от батарей
• App Standby – лишение ресурсов приложений, которые давно не использовались
Doze Mode. Ограничения
• AlarmManager – только setAndAllowWhileIdle(), setExactAndAllowWhileIdle() и setAlarmClock(). Остальные задерживаются до maintenance window.
• JobScheduler – все текущие задачи завершаются, все отложенные ждут maintenance window
• SyncManager – все синки завершаются• PowerManager – работают только Wake Lock-и
приложений из белого списка, остальные игнорируются• NetworkPolicyManager – для него doze mode тоже самое,
что и idle mode. Т.е. сеть есть только для приложений из белого списка
Doze Mode. Что работает
• AlarmManager – set[Exact]AndAllowWhileIdle() не чаще раз в 15 минут– setAlarmClock()
• GCM messages with high priority• Сеть и Wake Locks, если приложение в белом
списке• Все приложения получают возможность
выполнить работу в течение Maintenance window
Doze ModeMaintenance window наступит через:• 1 час• 2 часа• 4 часа• 6 часов (и далее каждые 6 часов)
Doze Mode. Отладка
• Запустить приложение• Залочить экран• adb shell dumpsys battery unplug• adb shell dumpsys deviceidle step
DeviceIdleController.java
Doze Mode. Работа
Doze Mode. Работа
White list
• Приложению из white list доступна сеть и Wake lock-и
• Пользователь может включить сам:– Настройки –> Батарея -> Экономия заряда
батареи -> Все приложения -> App -> Не экономить
– Settings -> Battery -> Battery Optimization• Можно запросить программно
White list
White list
White list. Отладка
$ adb shell dumpsys deviceidleWhitelist user apps: ru.jollydroid.dozedemo1
$ adb shell dumpsys deviceidle \whitelist +ru.jollydroid.dozedemo1
$ adb shell dumpsys deviceidle \whitelist -ru.jollydroid.dozedemo1
App Standby. Условия
Приложение может быть переведено в standby только если одновременно:• Устройство работает от батареи• Неверно следующее:– Пользователь явно запустил приложение.– Приложение имеет foreground процесс– Есть видимое уведомление (Notification),
созданное приложением.• Приложение не в белом списке
App Standby. Отладка$ adb shell dumpsys battery unplug$ adb shell am set-inactive <packageName> true
$ adb shell am set-inactive <packageName> false$ adb shell am get-inactive <packageName>
Doze Mode. Ресурсы
https://gist.github.com/tseglevskiy/dc43de20efd261cfe895
https://developer.android.com/intl/ru/training/monitoring-device-state/doze-standby.html
https://developer.android.com/intl/ru/reference/android/os/PowerManager.html#ACTION_DEVICE_IDLE_MODE_CHANGED
https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/DeviceIdleController.java
https://newcircle.com/s/post/1739/2015/06/12/diving-into-android-m-doze
http://habrahabr.ru/post/269491/
Notifications
Notifications
• Notification.setLatestEventInfo() удален. – Для обновления повторно используйте
Notification.Builder и NotificationManager.notify() c тем же id.
• adb shell dumpsys notification --noredact
• У NotificationManager появился метод StatusBarNotification[] getActiveNotifications()
Notifications. Ресурсы
• http://developer.android.com/intl/ru/reference/android/app/NotificationManager.html#getActiveNotifications()
Text Selection
Text Selection
Text Selection
Text Selection. Callback
Text Selection. Callback
Text Selection
Text Selection. Грабли
Где наши пункты??
Text Selection. Грабли
• Не всё помещается, появляется невидимый скролл• Порядок задается с помощью android:orderInCategory, родные
нумеруются 1..5• Менюшка fullscreen input mode не дополняется таким способом
(можно выключить с помощью android:imeOptions="flagNoExtractUi")
Text Selection. Ресурсы
• https://gist.github.com/tseglevskiy/87227454f9b57ea69399
• http://developer.android.com/intl/ru/about/versions/marshmallow/android-6.0-changes.html#behavior-text-selection
App Links
App Links
App Links
• https://<your host>/.well-known/assetlinks.json– Обязательно HTTPS!!
App Links. Отладка
• keytool -list -v -keystore debug.keystore \| grep SHA256
• adb shell am start -a android.intent.action.VIEW \-c android.intent.category.BROWSABLE \-d "http://<domain1>:<port>"
• adb shell dumpsys package domain-preferred-apps
App Links. Ресурсы
https://gist.github.com/tseglevskiy/5f6d7d7e81a291000782
http://developer.android.com/intl/ru/training/app-links/index.html
http://blog.hokolinks.com/android-m-app-links-implementation-drawbacks/
Auto Backup
Auto Backup
• Auto backup происходит, когда:– Устройство не используется– Находится на зарядке– Подключено к WiFi– С момента последнего бэкапа прошло более 24
часов
Auto Backup
• Не попадут файлы из каталогов– getCacheDir() – getCodeCacheDir()– getNoBackupFilesDir()
• С внешнего стораджа попадут только файлы из каталога getExternalFilesDir()
• Общий объем не более 25МБ на приложение– При превышении объема бэкап останавливается, «в
облаке» остается последнее сохраненное состояние
Auto Backup. Config
Auto Backup. Config
• domain – указание каталога, в котором искать файл– file – /data/data/<package>/files– database – /data/data/<package>/databases/– sharedpref – /data/data/<package>/shared_prefs/– external –
/storage/emulated/0/Android/data/<package>/files/– root – ссылка на /data/data/<package>/ или аналог(названия каталогов – условные, они могут меняться в зависимости от конфигурации)
Auto Backup. Config
• path – относительное имя файла– С расширением! Т.е. если
getSharedPreferences("pref1", MODE_PRIVATE), то <exclude domain="sharedpref"path="pref1.xml"/>
Auto Backup. Event
Auto Backup. Отладка
• Принудительный запуск бэкапаadb shell setprop log.tag.BackupXmlParserLogging VERBOSEadb shell bmgr runadb shell bmgr fullbackup <package>
• Восстановление из бэкапаadb shell bmgr restore <package>
• Очистка бэкапа в облакеadb shell bmgr wipe com.google.android.gms <package>
Auto Backup. Грабли
PFTBT : Error -1002 backing up ru.jollydroid.autobackupdemo1PFTBT : Transport suggested backoff=0PFTBT : Transport rejected backup of ru.jollydroid.autobackupdemo1, skippingPFTBT : Full backup completed.
Если бэкап не работает и в логе такое сообщение, возможно:- Ошибка в конфиге, в результате не найдено ни одного файла для бэкапа- Слишком много данных (больше 25М)
Auto Backup. Ресурсыhttps://gist.github.com/tseglevskiy/e71cd081c2d8ef07c0a3
http://developer.android.com/intl/ru/training/backup/autosyncapi.html
https://developer.android.com/intl/ru/reference/android/app/backup/BackupAgent.html#onRestoreFinished()
Вопросы?
Спасибо за внимание!
http://jollydroid.ruhttp://mobiledimension.ru