Привет всем разработчикам под Android!
Мне повезло стать Google Developer Expert Android в России, и поэтому я вдвойне переживаю, что не все из вас подготовились к релизу заранее. Сейчас мы с вами постараемся запрыгнуть на уплывающий пароход с зефирками.
Вы можете не читать, а просто посмотреть мой доклад на прошедшем DroidCon.
Но специально для тех, кто любит читать хабр больше чем смотреть youtube — добро пожаловать под кат. Там мы пройдемся по чеклисту действий, которые каждый обязательно должен сделать в своем приложении, а потом посмотрим на новые возможности для разработчиков в sdk 23.
Важное замечание
Всё нижесказанное относится только к приложениям с targetSdk = 23 и выше! Как будут вести себя приложения с более старыми sdk на зефирке готов обсудить в комментариях.
Doze Mode, App Standby и Runtime Permissions
К сожалению длина статьи не смогла вместить эти три важнейших изменения в Android Marshmallow. Пожалуйста, прочтите о них в отдельной статье.
Autobackup
Теперь Android приложения каждую ночь, пока девайс на зарядке, будут сливать в пользовательский Drive все настройки. Вернее, те которые мы разрешим.
Зачем?
Пользователь при покупке нового сразу восстанавливает из Google Play не только все приложения, но и их настройки.
Чем плохо для нас?
В облако и на новые девайсы улетают из shared preferences данные аккаунтов и ключи GCM (пуши перестают работать). Нужно это предотвратить!
По дефолту бэкапятся все папки нашего приложения и все SharedPreferences.
Не сохраняются лишь:
— пути на SD карте, не находящиеся в android/data/…
— getCacheDir()
— getCodeCacheDir()
— getNoBackupFilesDir()
Последняя папочка специально для этого как раз и создана.
Чтобы предотвратить часть файлов от бекапа пишем вот такую xml, где перечисляем все данные, которые не желаем пускать в бекап:
<android:fullBackupContent="@xml/mybackupscheme"><full-backup-content> <exclude domain= ["file" | "database" | "sharedpref"| "external" | "root"] path="string”> </full-backup-content>
Чтобы определить наоборот лишь те файлы, которые хотим пустить в облако:
<android:fullBackupContent="@xml/mybackupscheme"><full-backup-content> <include domain= ["file" | "database" | "sharedpref"| "external" | "root"] path="string”> </full-backup-content>
Если в бекап таки ушли ненужные для восстановления данные, мы можем сделать вот такую хитрость:
В классе наследнике Application переопределить метод onRestoreFinished() и в нем удалить нежелательно восстановленные записи.
! Уберите из бекапа ключи Google Cloud Messages !
Подробнее: developer.android.com/intl/ru/training/backup/autosyncapi.html
Пример: developer.android.com/intl/ru/samples/AutoBackupForApps/index.html
Deprecated
Если вы еще используете Apache Http client и напрочь отказываетесь перейти на современные аналоги, например, OkHttp, то вам срочно нужно добавить в build.gradle:
android { useLibrary 'org.apache.http.legacy' }
Теперь из sdk выпилили OpenSSL: libcrypto.so и libssl.so заменены на BoringSSL.
Если вы вдруг не знали до сегодняшнего дня о Notification.Builder, а использовали для содания нотификаций notification.setLatestEventInfo(), хватит, он удален. Прочитайте хотя бы мою статью, а лучше официальные доки, как правильно создавать и обновлять уведомления.
Adoptable storage
Теперь пользователь может отформатировать sd-карточку, превратив ее в почти внутреннее шифрованное хранилище. И тем самым у него появится переносить приложения на нее. Чем это грозит для нас?
Если мы не используем в приложении стандартные методы и константы для получения путей (getFilesDir(), getCacheDir() и т.д.), а хардкодим пути к внутреннему хранилищу, то после перемещения файлов на карту точка монтирования сменится, и все наши старательно прописанные пути перестанут быть валидными.
Подробнее: developer.android.com/intl/ru/about/versions/marshmallow/android-6.0.html#adoptable-storage
Небольшие, но важные дополнения
Доступ к мак адресам устройств в округе теперь возможен только при сканировании методами WifiManager.getScanResults() BluetoothLeScanner.startScan() и при запрошенных пермишенах ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION. А вот методы WifiInfo.getMacAddress() и BluetoothAdapter.getAddress() вернут всегда пустышку 02:00:00:00:00:00. это сделано в целях повышения секьюрности пользователя. Жаль не все обновятся на marshmallow, да и кастомные прошивки вряд ли сохранят это ограничение.
Из Android Keystore provider выкинули поддержку DSA-шифрования
Теперь состояния WifiConfiguration объектов наши приложения могут менять только, если они сами их создали.
У камеры хорошие изменения по работе с доступом к сервису. Если приложение ушло в фон, а другое приложение наоборот вышло на первый план, то ему отдастся приоритет, а первое лишится сервиса. А еще, теперь можно использовать из разных приложений одновременно доступ к разным камерам устройства.
Изменения в ART
- Теперь корректно реализована обработка прав на newInstance().
- Динамический линкер теперь понимает различия между soname библиотеки и ее путем, а еще появился поиск по soname.
- Починили флаг dlopen(3) RTLD_LOCAL.
Новые возможности Android
С обязательными изменениями в нашем приложении покончено. Перейдем к основным фичам, которые нам предоставляет новый SDK.
App Linking
Многие разработчики встраивают в свои приложения фильтры url-схем, чтобы пользователю было предложено открыть определенный url с помощью приложения. Теперь появилась возможность лишить возможности других разработчиков обрабатывать url вашего сайта. Допустим если вы делаете банкинг, то точно не хотите, чтобы другие приложения, кроме приложения-клиента вашего банка могли открываться по нажатию пользователем на ссылку.
в манифесте нужно добавить вот такого вида фильтр:
<intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="www.android.com" /> <data android:scheme="https" android:host="www.android.com" /> </intent-filter>
И положить JSON на свой сайт (https://www.domain1.com/.well-known/assetlinks.json), вставив sha256 из кейстора, которым подписано приложение.
[{ "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "com.example", "sha256_cert_fingerprints": ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"] } }]
Единственное, о чем стоит помнить: если ваше приложение не будет установлено, то выскочит диалог «открыть с помощью» и приложение злоумышленника сможет открыться.
Подробнее: developer.android.com/intl/ru/training/app-links/index.html
Fingerprint API
Наконец-то в Android появилась нативная поддержка сенсоров отпечатков пальцев. Теперь с помощью класса android.hardware.fingerprint.FingerprintManager проверяем наличие в устройстве сенсора isHardwareDetected(), запрашиваем разрешение USE_FINGERPRINT, и если у пользователя есть откатанные пальчики hasEnrolledFingerprints(), показываем стандартный диалог авторизации по отпечатку authentificate()
Подробнее: www.youtube.com/watch?t=1&v=VOn7VrTRlA4
Пример: developer.android.com/intl/ru/samples/FingerprintDialog/index.html
Confirm Credentials
Теперь у нас есть возможность перепроверить, что сейчас устройство в руках у его владельца, показав экран разблокировки перед важным действием в приложении, например, при попытке открыть папку "/отдых в Адлере 2007/"
Подробнее: github.com/googlesamples/androidConfirmCredential/blob/master
Application/src/main/java/com/example/android/confirmcredential/MainActivity.java
Пример: developer.android.com/intl/ru/samples/ConfirmCredential/index.html
Text Selection
Теперь контекстное меню для действий с выделенным текстом появляется непосредственно рядом с кареткой, для добавления своих действий мы так же можем воспользоваться меню, описанным в menu.xml, и добавить его с помощью метода startActionMode(Callback, ActionMode.TYPE_FLOATING).
Direct share
Важным дополнением в Marshmallow является возможность добавлять одному приложению до восьми различных объектов в стандартный диалог шаринга:
Главное не захламить диалог бесполезными вариантами шаринга. Старайтесь не злоупотреблять.
Подробнее: developer.android.com/intl/ru/about/versions/marshmallow/android-6.0.html#direct-share
Пример: developer.android.com/intl/ru/samples/DirectShare/index.html
Voice Interaction
Важная, но не так подробно освещенная фишка, в отличии от «Now on tap» . Наше приложение, будучи запущенным из Google Now может вести диалог с пользователем с помощью класса android.app.VoiceInteractor.
Подробнее: developers.google.com/voice-actions/interaction/voice-interactions.
На этом список не заканчивается. Более мелкие нововведения можно прочитать тут.
Обязательно пройдитесь по всем пунктам выше. Проверьте autobackup, doze mode и запросите все пермишены. На все вопросы буду рад ответить в комментариях.
ссылка на оригинал статьи http://habrahabr.ru/post/269471/
Добавить комментарий