Доклад старшего Android-разработчика Mobile Dimension Игоря Цеглевского "Взгляд практика на Android 6.0 Marshmallow" на отраслевой конференции "GDG DevFest Nizhny Novgorod 2015"
2. Давайте познакомимся…
Mobile Dimension LLC
Старший Android Разработчик
Учебный центр «Jolly Droid»
Основатель и преподаватель
Igor.tseglevskiy@gmail.com
Игорь Цеглевский
http://mobiledimension.ru
http://jollydroid.ru
5. Permissions
• targetSdkVersion=22
– Permissions (права доступа) работают как прежде:
разрешено всё, что описано в манифесте
– Пользователь может в настройках отозвать любое
из прав!
• Андроид предупреждает, что это может вызвать падение
приложения, но не запрещает
• При изменении списка прав приложение будет
остановлено
– Если пользователь отозвал права, то
соответствующие API вернут 0 или null
6. Permissions
• targetSdkVersion=23
– «Нормальные» права доступа даются
автоматически
– «Опасные» права необходимо запросить явно,
для каждой группы
– «Опасные» права пользователь может отозвать
в настройках приложения. Приложение должно
всегда (каждый раз при обращении к
соответствующим API) проверять наличие прав
13. 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
14. 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.
16. Doze Mode & App Standby
• Doze Mode – режим, в который устройство
переходит, если находится некоторое время
с залоченным экраном, без движения и
работающее от батарей
• App Standby – лишение ресурсов
приложений, которые давно не
использовались
17. Doze Mode. Ограничения
• AlarmManager – только setAndAllowWhileIdle(),
setExactAndAllowWhileIdle() и setAlarmClock().
Остальные задерживаются до maintenance window.
• JobScheduler – все текущие задачи завершаются, все
отложенные ждут maintenance window
• SyncManager – все синки завершаются
• PowerManager – работают только Wake Lock-и
приложений из белого списка, остальные
игнорируются
• NetworkPolicyManager – для него doze mode тоже
самое, что и idle mode. Т.е. сеть есть только для
приложений из белого списка
18. Doze Mode. Что работает
• AlarmManager
– set[Exact]AndAllowWhileIdle() не чаще раз в 15
минут
– setAlarmClock()
• GCM messages with high priority
• Сеть и Wake Locks, если приложение в белом
списке
• Все приложения получают возможность
выполнить работу в течение Maintenance
window
24. White list
• Приложению из white list доступна сеть и
Wake lock-и
• Пользователь может включить сам:
– Настройки –> Батарея -> Экономия заряда
батареи -> Все приложения -> App -> Не
экономить
– Settings -> Battery -> Battery Optimization
• Можно запросить программно
28. App Standby. Условия
Приложение может быть переведено в
standby только если одновременно:
• Устройство работает от батареи
• Неверно следующее:
– Пользователь явно запустил приложение.
– Приложение имеет foreground процесс
– Есть видимое уведомление (Notification),
созданное приложением.
• Приложение не в белом списке
29. 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>
32. Notifications
• Notification.setLatestEventInfo() удален.
– Для обновления повторно используйте
Notification.Builder и NotificationManager.notify() c
тем же id.
• adb shell dumpsys notification --noredact
• У NotificationManager появился метод
StatusBarNotification[] getActiveNotifications()
41. Text Selection. Грабли
• Не всё помещается, появляется невидимый скролл
• Порядок задается с помощью android:orderInCategory,
родные нумеруются 1..5
• Менюшка fullscreen input mode не дополняется таким
способом (можно выключить с помощью
android:imeOptions="flagNoExtractUi")
49. Auto Backup
• Auto backup происходит, когда:
– Устройство не используется
– Находится на зарядке
– Подключено к WiFi
– С момента последнего бэкапа прошло более 24
часов
50. Auto Backup
• Не попадут файлы из каталогов
– getCacheDir()
– getCodeCacheDir()
– getNoBackupFilesDir()
• С внешнего стораджа попадут только файлы
из каталога getExternalFilesDir()
• Общий объем не более 25МБ на приложение
– При превышении объема бэкап останавливается,
«в облаке» остается последнее сохраненное
состояние
52. 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>/ или аналог
(названия каталогов – условные, они могут меняться
в зависимости от конфигурации)
53. Auto Backup. Config
• path – относительное имя файла
– С расширением! Т.е. если
getSharedPreferences("pref1", MODE_PRIVATE),
то
<exclude domain="sharedpref"
path="pref1.xml"/>
55. 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>
56. Auto Backup. Грабли
PFTBT : Error -1002 backing up ru.jollydroid.autobackupdemo1
PFTBT : Transport suggested backoff=0
PFTBT : Transport rejected backup of ru.jollydroid.autobackupdemo1, skipping
PFTBT : Full backup completed.
Если бэкап не работает и в логе такое сообщение, возможно:
- Ошибка в конфиге, в результате не найдено ни одного файла для бэкапа
- Слишком много данных (больше 25М)