android marshmallow (13.11.2015)
TRANSCRIPT
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
• Попробуйте deviceId = Settings.Secure.getString(getContentResolver(), 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 deviceidle
Whitelist 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 VERBOSE
adb shell bmgr run
adb 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