Следующая новость
Предыдущая новость

Android: безопасность Android 12 и принцип работы корутин

02.03.2021 12:42

Содержание статьи

  • Почитать
  • Security-новшества Android 12
  • Разработчику
  • Полезные функции-расширения
  • Вредные функции-расширения
  • Лучший способ сбора данных из Flow
  • Как работают корутины
  • Библиотеки

Се­год­ня в выпус­ке: security-нов­шес­тва Android 12, полез­ные и вред­ные фун­кции‑рас­ширения, советы по работе с Flow, луч­шее объ­ясне­ние прин­ципа работы корутин. А так­же под­борка биб­лиотек для прог­раммис­тов.

Почитать

Security-новшества Android 12

First preview of Android 12 — анонс Android 12, самая инте­рес­ная часть которо­го — новые механиз­мы обес­печения безопас­ности.

  • Ужес­точение пра­вил рас­шарива­ния cookie в WebView. Вслед за Chromium WebView теперь исполь­зует более жес­ткие пра­вила рас­шарива­ния куков с атри­бутом SameSite. В час­тнос­ти, все куки с атри­бутом SameSite=None обя­заны иметь атри­бут Secure и пересы­лать­ся по HTTPS, а ссыл­ки меж­ду HTTP- и HTTPS-вер­сиями сай­та теперь счи­тают­ся cross-site-рек­веста­ми.
  • Ог­раниче­ние дос­тупа к MAC-адре­су. Android 11 огра­ничил дос­туп при­ложе­ний к MAC-адре­су устрой­ства, толь­ко если при­ложе­ние име­ет targetSdkVersion 30, в Android 12 огра­ниче­ние рас­простра­няет­ся на все при­ложе­ния.
  • Не­экспор­тиру­емые ком­понен­ты по умол­чанию. Для при­ложе­ний, соб­ранных для Android 12 (targetSdkVersion 31), все ком­понен­ты (активнос­ти, про­вай­деры, сер­висы) теперь авто­мати­чес­ки помеча­ются как неэк­спор­тиру­емые. Поведе­ние мож­но изме­нить с помощью атри­бута android:exported=true. Этот атри­бут обя­зате­лен для всех интент‑филь­тров при­ложе­ния (ина­че при­ложе­ние прос­то не уста­новит­ся на Android 12).
  • Бе­зопас­ность PendingIntent. При­ложе­ния, собира­емые с targetSdkVersion 31, теперь обя­заны помечать все PendingIntent как изме­няемый или неиз­меня­емый (PendingIntent.FLAG_MUTABLE, PendingIntent.FLAG_IMMUTABLE). PendingIntent исполь­зует­ся в Android, что­бы поз­волить сис­теме или сто­рон­ним при­ложе­ниям передать интент от име­ни дру­гого при­ложе­ния.
  • Борь­ба с овер­леями. Android 12 зап­реща­ет нажимать эле­мен­ты интерфей­са сквозь неп­розрач­ные овер­леи (окна, показы­ваемые поверх всех при­ложе­ний) за нес­коль­кими исклю­чени­ями: окна ассистен­тов, помощ­ников для людей с огра­ничен­ными воз­можнос­тями и экранных кла­виатур.
  • Зап­рет на запуск foreground-сер­висов в фоне. При­ложе­ния, соб­ранные с targetSdkVersion 31, не смо­гут запус­кать foreground-сер­висы в фоне.
  • Зап­рет на зак­рытие сис­темных диало­гов. Интент ACTION_CLOSE_SYSTEM_DIALOGS объ­явлен уста­рев­шим и боль­ше не работа­ет.

Разработчику

Полезные функции-расширения

5 Kotlin Extensions To Make Your Android Code More Expressive — оче­ред­ная статья о том, как сде­лать код на Kotlin вырази­тель­нее с помощью фун­кций‑рас­ширений.

  1. Фун­кции для показа и скры­тия эле­мен­тов интерфей­са:

    fun View.show(){ this.visibility = View.VISIBLE}fun View.hide() { this.visibility = View.INVISIBLE}fun View.remove(){ this.visibility = View.GONE}

  2. Фун­кции валида­ции строк:

    fun String?.valid(): Boolean = this != null && !this.equals("null", true) && this.trim().isNotEmpty()fun String.isValidEmail(): Boolean = this.isNotEmpty() && Patterns.EMAIL_ADDRESS.matcher(this).matches()fun String.formatPhoneNumber(context: Context, region: String): String? { val phoneNumberKit = PhoneNumberUtil.createInstance(context) val number = phoneNumberKit.parse(this, region) if (!phoneNumberKit.isValidNumber(number)) return null return phoneNumberKit.format(number, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)

  3. Фун­кции для работы с бан­дла­ми:

    inline fun <reified T: Any> Activity.getValue(lable: String, defaultvalue: T? = null) = lazy{ val value = intent?.extras?.get(lable) if (value is T) value else defaultvalue}inline fun <reified T: Any> Activity.getValueNonNull(lable: String, defaultvalue: T? = null) = lazy{ val value = intent?.extras?.get(lable) requireNotNull((if (value is T) value else defaultvalue)){lable}}inline fun <reified T: Any> Fragment.getValue(lable: String, defaultvalue: T? = null) = lazy { val value = arguments?.get(lable) if (value is T) value else defaultvalue}inline fun <reified T: Any> Fragment.getValueNonNull(lable: String, defaultvalue: T? = null) = lazy { val value = arguments?.get(lable) requireNotNull(if (value is T) value else defaultvalue) { lable }}

  4. Фун­кции для извле­чения ресур­сов:

    fun Int.asColor() = ContextCompat.getColor(ApplicationCalss.instance, this)fun Int.asDrawable() = ContextCompat.getDrawable(MavrikApplication.instance, this)

  5. По­каз диало­гов и сооб­щений:

    fun Context.showAlertDialog(positiveButtonLable: String = getString(R.string.okay), title: String = getString(R.string.app_name), message: String, actionOnPositveButton: () -> Unit) { val builder = AlertDialog.Builder(this) .setTitle(title) .setMessage(message) .setCancelable(false) .setPositiveButton(positiveButtonLable) { dialog, id -> dialog.cancel() actionOnPositveButton() } val alert = builder.create() alert?.show()}fun Context.showShotToast(message: String){ Toast.makeText(this, message, Toast.LENGTH_SHORT).show()}fun Context.showLongToast(message: String){ Toast.makeText(this, message, Toast.LENGTH_LONG).show()}fun View.showShotSnackbar(message: String){ Snackbar.make(this, message, Snackbar.LENGTH_SHORT).show()}fun View.showLongSnackbar(message: String){ Snackbar.make(this, message, Snackbar.LENGTH_LONG).show()}fun View.snackBarWithAction(message: String, actionlable: String, block: () -> Unit){ Snackbar.make(this, message, Snackbar.LENGTH_LONG) .setAction(actionlable) { block() }}

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

1 год

9300 р.

1 месяц

870 р.

Я уже участник «Xakep.ru»

Источник

Последние новости