Как получить хэш андроид приложения?
Разбираюсь с SMS Retriever API(https://developers.google.com/identity/sms-retriever/overview). В требованиях к смс сообщению с одноразовым кодом, среди прочего, описано требование, чтобы смс приходило с подписью (подписью является хэш приложения, минимум из 11 символов). В этой же статье написано, что не рекомендуется получать хэш из приложения. Главный вопрос: как можно получить хэш приложения, и может ли он меняться в процессе разных доработок приложения в будущем, или он статический? Пока разбирался с АПИ нашел код который выдаёт хэш, но никак не выходит найти как можно получить такой хэш не через код в приложении. Код который выдаёт нужный хэш:
private static final String TAG = "AppSignatureHelper"; private static final String HASH_TYPE = "SHA-256"; public static final int NUM_HASHED_BYTES = 9; public static final int NUM_BASE64_CHAR = 11; public AppSignatureHelper(Context context) < super(context); >@RequiresApi(api = Build.VERSION_CODES.KITKAT) public ArrayList getAppSignatures() < ArrayListappCodes = new ArrayList<>(); try < // Get all package signatures for the current package String packageName = getPackageName(); PackageManager packageManager = getPackageManager(); Signature[] signatures = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures; // For each signature create a compatible hash for (Signature signature : signatures) < String hash = hash(packageName, signature.toCharsString()); if (hash != null) < appCodes.add(String.format("%s", hash)); >> > catch (PackageManager.NameNotFoundException e) < Log.e(TAG, "Unable to find package to obtain hash.", e); >return appCodes; > @RequiresApi(api = Build.VERSION_CODES.KITKAT) private static String hash(String packageName, String signature) < String appInfo = packageName + " " + signature; try < MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE); messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8)); byte[] hashSignature = messageDigest.digest(); // truncated into NUM_HASHED_BYTES hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES); // encode into Base64 String base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING | Base64.NO_WRAP); base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR); Log.e(TAG, String.format("pkg: %s -- hash: %s", packageName, base64Hash)); return base64Hash; >catch (NoSuchAlgorithmException e) < Log.e(TAG, "hash:NoSuchAlgorithm", e); >return null; >
Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 25 янв 2021 в 17:40
Как адаптировать Android-приложение под Huawei

Всем привет! Меня зовут Миша Вассер, я Head of Android в AGIMA. Мы занимаемся разработкой Digital-продуктов для больших и маленьких компаний, в том числе пилим мобильные приложения.
Не так давно — по сравнению со всей историей Android — Huawei выкатил собственную операционную систему и сказал: «Ребята, вот вам новая система, кайфуйте». Многие отнеслись к новой ОС скептически. Остальным пришлось адаптировать под нее свои Android-приложения.
Мы оказались во второй группе. К нам время от времени обращаются с просьбой помочь с адаптацией под Huawei. И мы неплохо в этом вопросе прокачались. Поэтому сейчас расскажу, что надо сделать, чтобы стало хорошо. А покажу всё это на примере крупного ретейлера, с которым мы работаем.
Что сделать, чтобы было хорошо
- Зависимости build.gradle.
Чтобы начать работать с библиотеками Huawei, первым делом добавим нужные зависимости в наш Gradle (модуля app):
dependencies
В самый верх файла добавим:
apply plugin: 'com.huawei.agconnect'
А теперь добавим в Gradle-файл проекта еще такую зависимость:
dependencies
- Добавление agconnect-services.json.
В Android с Google-сервисами мы используем файл из Firebase, который называется google-services.json. В Huawei нам потребуется такой же конфигурационный файл. Без него не получится использовать фичи, которые предоставляет вендор (например, push-уведомления, аналитика и т. д.).
Чтобы добавить этот файл, заходим в AppGalleryConnect. Затем в «Мои проекты», выбираем нужный проект, идем в «Настройки проекта» в левом боковом меню. Листаем до раздела «Данные приложения».

Теперь скачиваем файл agconnect-services и кладем его в папку App нашего проекта в Android Studio.

- Правила Proguard.
Чтобы не заобфусцировать ничего лишнего, попросим Proguard не трогать Huawei-библиотеки. Для этого добавим в proguard-rules.pro строки из документации для разработчиков:
-ignorewarnings -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.huawei.hianalytics.** -keep class com.huawei.updatesdk.** -keep class com.huawei.hms.**
- Проверим, доступны ли Google-сервисы.
Важная часть работы с Huawei — это проверка, точно ли у юзера на устройстве нет Google-сервисов. Полезно оставлять в коде возможность запустить Android-версию приложения. Причина банальна: APK из AppGallery кто-то может запостить в другое место, и юзеры скачают его на свои нехуавейные смартфоны.
Чтобы проверить, делаем вот такую Extension-функцию для контекста:
fun Context.areGoogleServicesAvailable(): Boolean
Теперь можно вызывать ее откуда угодно и строить логику платформозависимых функций, опираясь на неё.
Часто в приложении нужно определять местоположение юзера, чтобы, например, показать ближайший магазин. Для этого мы пользуемся FusedLocationClient. В Huawei больших изменений нет, надо просто импортировать HMS клиента вот так:
import com.huawei.hms.location.FusedLocationProviderClient
Тогда код получения Location клиента у нас получится вот таким:
if (context.areGoogleServicesAvailable()) < GoogleFusedLocation( com.google.android.gms.location.LocationServices.getFusedLocationProviderClient(context) ) >else
В самих классах FusedLocation для обеих платформ все стандартно — локацию юзера получаем, вешая слушатели на Success и Failure:
providerClient.lastLocation .addOnSuccessListener < //Получили location >.addOnFailureListener< //Что-то упало >
- Меняем все Google Play на AppGallery.
Почти на всех проектах пользователей нужно перевести на страницу приложения в Google Play. Так как у Huawei свой стор AppStoreConnect, пользователя лучше вести туда. Для этого меняем URI и Package в интенте.
Вот как мы открываем магазин в Android:
val uri = Uri.parse("market://details?id=" + applicationId) val intent = Intent().apply
А вот как открыть его в Huawei:
val uri = Uri.parse("appmarket://details?id=" + applicationId) val intent = Intent().apply
Дальше, уже используя написанный нами ранее Checker, можем вести пользователя в тот или иной магазин
- Меняем number на phone во всех Layout с android:inputType.
Один из хаков, который вам пригодится.
Если в Android у EditText мы проставляем android:inputtype=»number» — например, на экране ввода кода из смс при авторизации, то пользователь Huawei всё равно увидит клавиатуру QWERTY, а не клавиатуру с цифрами, как в Android. Чтобы это пофиксить, просто поменяйте inputType на “phone”.
Добавление SHA-256-ключа
Чтобы полноценно использовать SDK Huawei, нужно добавить отпечаток сертификата SHA-256 в консоль AppGalleryConnect. Если вы добавляете его в первый раз, это можно сделать по инструкции.
А я тем временем расскажу, что делать, если приложение пришло на доработку после того, как кто-то его релизил и уже прописывал свои ключи в консоли.
- Первым делом нужно узнать ваш SHA-256, который зашит в APK-шках, которые вы собираете у себя на компьютере или CI. Можно сделать несколькими способами, вот один из них:
- собираем APK;
- копируем путь до вашего APK;
- идем в консоль и вводим следующее (не забудьте вставить свой путь):
keytool -printcert -jarfile . /app-debug.apk

- консоль выведет наши ключи SHA-1 и SHA-256.
- Копируем ключ SHA-256. Он выглядит примерно так: 00:F3:61:A7:AD:6B:13:11:27:02:09:8C:F5:12:FF…… Затем идем в AppGalleryConnect.
- Теперь нужно зайти в «Мои проекты», выбрать нужный проект, открыть в левом боковом меню «Настройки проекта» и пролистать до раздела «Данные приложения».
4. Тут нажимаем «Добавить» и вводим наш полученный ранее ключ SHA-256. Теперь можем скачать файл agconnect-services.json — и всё.
А если не добавить ваш ключ в консоль? Не будут доходить пуши, не сработают In-App-Purchases, AppLinking и другие фишки AppGalleryConnect. Да и в целом нельзя будет залить приложение в стор. Поэтому не пропускайте и не игнорируйте этот момент.
Universal APK
При загрузке APK на некоторые Huawei-девайсы, в том числе и на эмулятор внутри AppGalleryConnect, важно сделать universal-сборку для всех типов процессоров. Иначе мы можем получить ошибку вроде This app is no longer compatible with your device.
Чтобы решить эту проблему, соберем универсальный APK. Добавим в Gradle (модуля app) следующие строчки:
android < . . splits < abi < enable true reset() include 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'arm64-v8a' universalApk true >> >
Теперь каждый раз при сборке APK у нас в папке build/outputs будут лежать несколько APK-файлов. Нам нужен тот, что называется app-universal-debug.apk. Смело загружайте его в эмуляторы AppGalleryConnect и отдавайте тестерам.
Push Kit и тестирование пушей
Отправка и удаление Push-токена
Зачастую крупные продукты рассылают пуши через Backend. Если вы не используете разные SDK (OneSignal, например), вам, скорее всего, нужно отдавать на свой бэк пуш-токен пользователя. Рассмотрим, как токен получить и как удалить.
В Android мы получаем пуш-токен Firebase как-то так:
suspend fun getTokenAndSendGoogle()
Huawei же тут решил немного намудрить. Когда-то пуш-токен в Huawei можно было получить синхронным запросом, но сейчас такое не прокатывает. В итоге токен надо получать в отдельном потоке. Делается это вот так:
private fun getTokenAndSendHuawei() < HmsInstanceId.getInstance(context).run < //Получаем id AppGallery приложения из конфига val appId = AGConnectServicesConfig.fromContext(context).getString("client/app_id") object : Thread() < override fun run() < try < //Получаем HMS пуш-токен по id, который достали ранее val pushToken = getToken(appId, HmsMessaging.DEFAULT_TOKEN_SCOPE) if (!pushToken.isNullOrBlank()) < //Отправляем токен на ваш сервак sendTokenToServer(pushToken) >> catch (e: ApiException) < >> >.start() > >
Используя проверку из предыдущего раздела, получаем такое условие:
supervisorScope < launch < if (getGMSAvailable()) < getTokenAndSendGoogle() >else < getTokenAndSendHuawei() >> >
С удалением токена всё так же просто. Например, при разлогине пользователя из приложения вам надо удалить токен. Получаем токен из HMS, удаляем с вашего сервера. В идеале надо провести еще одну операцию — удалить инстанс не только у вас, а ещё и из Firebase/HMS. На девайсах с гугл-сервисами делаем так:
FirebaseInstallations.getInstance().delete()
В HMS тоже никаких сложностей:
HmsInstanceId.getInstance(context).deleteAAID()
Тестирование пушей внутри эмулятора App Gallery Console
Ребята из Huawei сделали очень крутую тему. Они добавили эмулятор прямо в свою консоль. Объясняю, как протестить пуши с его помощью.
- Чтобы попасть в эмулятор, нужно зайти в «Мои проекты», выбрать нужный проект. Затем в левом меню в разделе «Качество» выбрать «Облачная отладка».
- Нажимаем и видим страницу с моделями доступных девайсов. Можно навести на каждый и либо начать отладку, если девайс свободен, либо зарезервировать симулятор на какой-то определенный тайм-слот.

- Когда мы запустим эмулятор, увидим вот такой экран:

Справа видим Logcat, список доступных APK и прочие штуки, помогающие нам в отладке.
- Устанавливаем приложение на симулятор, получаем Push-токен. Можем вывести получение токена из предыдущего раздела в логи и скопировать его.
- Теперь идем в раздел Push Kit, он находится во вкладке «Рост» в левом боковом меню. Попав на страницу Push Kit, можем нажать на кнопку «Добавить уведомление».

- Заполняем стандартные поля «Имя», «Заголовок», «Тело» и другие. Когда это готово, скроллим ниже, находим блок «Диапазон отправки». Тут нужно выбрать «Указанное устройство». Появится еще одно поле — «Токен устройства». Вставим туда токен, который мы скопировали пару пунктов назад.

- Когда вы заполнили все поля, выбрали время отправки и указали пуш-токен, можно нажимать кнопку «Отправить».
- Вернувшись в эмулятор, мы увидим пуш — вуаля! Таким образом вы сможете тестировать отображение пушей, диплинки и всё, что вам нужно в пушах.
Карты
Во многих приложениях есть географические карты. Большинство из них нуждаются в минимальном функционале — добавление маркеров, их удаление и нажатие. Если вы используете Яндекс.Карты или другую SDK, которая не гугл-сервис, скорее всего, вам ничего не придется адаптировать.
В этой части статьи постараюсь рассказать, что вам надо поменять, чтобы базовый функционал легко завелся.
Huawei снова сделал всё максимально удобно для нас. С точки зрения разработки, карты очень похожи друг на друга. Убрав лишнюю шелуху с кода, получаем следующее:
- Начнем с XML. Добавляем карту в наш Layout.
- Перейдем в наше Activity или Fragment. Затаскиваем импорты:
import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.model.BitmapDescriptorFactory import com.google.android.gms.maps.model.CameraPosition import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.MarkerOptions
import com.huawei.hms.maps.CameraUpdateFactory import com.huawei.hms.maps.HuaweiMap import com.huawei.hms.maps.model.BitmapDescriptorFactory import com.huawei.hms.maps.model.CameraPosition import com.huawei.hms.maps.model.LatLng import com.huawei.hms.maps.model.MarkerOptions
- Получаем карту и проводим махинации с ней. Для упрощения представим, что у нас все еще Kotlin Synthetics:
mapView.onCreate(null) mapView.getMapAsync < with(it) < // Устанавливаем широту и долготу val location = LatLng(latitude, longitude) // Указываем тип карты, для Google соответственно GoogleMap.MAP_TYPE_NORMAL mapType = HuaweiMap.MAP_TYPE_NORMAL // Инициализируем позицию для камеры val cameraPosition = CameraUpdateFactory.newCameraPosition( CameraPosition.fromLatLngZoom( location, 15f ) ) // Перемещаем камеру moveCamera(cameraPosition) val icon = BitmapDescriptorFactory.fromResource(R.drawable.marker) val markerOptions = MarkerOptions() .icon(icon) .position(location) // Добавляем маркер addMarker(markerOptions) setOnMapClickListener < clickListener.invoke() >> >
Applinking
Диплинки в приложениях — очень важный инструмент для маркетинга, и ваш заказчик точно их захочет. В пуше вы можете вставить такой же диплинк, какой используете на Android. Но когда вы напишете диплинк в заметках и нажмете на него, приложение не откроется.
Как исправить эту историю? На помощь приходит AppLinking.
Доверенные форматы URL
- Сначала нужно добавить «Доверенные форматы URL» в нашей консоли. Фактически это хуавеевский URL, который будет префиксом перед вашим реальным диплинком. Идем в «Мои проекты», затем выбираем проект и в левом меню находим вкладку «Рост». В ней — «Создание ссылок» или AppLinking. Нажимаем и попадаем на вкладку «Префиксы URL».

- Нажмем на кнопку «Создать префикс URL» и введем какое-нибудь доменное имя типа testapp.

3. Теперь добавим интент-фильтр в манифест нашего приложения, чтобы мы могли обработать такой линк. Делаем такое:
Теперь мы на шаг ближе к корректной обработке внешних диплинков.
Белый список URL-адресов
Наш финальный диплинк будет иметь такой вид:

Нажимаем на кнопку «Создать формат URL-адресов белого списка» и в открывшемся окне заполняем с помощью регулярного выражения [наш оригинальный диплинк].
Наш history отлично обработается, если введем такую штуку: “^testapp.link://.*$”. Нажимаем «Опубликовать».

Отлично, мы добавили наши оригинальные диплинки в белый список, осталось только их обработать в коде.
Обработка линков в коде Android-приложения
- Добавим зависимость в Gradle “implementation ‘com.huawei.agconnect:agconnect-applinking:1.8.0.300’”.
- Теперь туда, где вы обрабатываете обычный Intent (то есть обычный диплинк Android), вставим вот такой обработчик от HMS:
AGConnectAppLinking.getInstance().getAppLinking(this) .addOnSuccessListener < handleDeeplink(it.deepLink.toString()) >.addOnFailureListener
Тут все достаточно просто. У нас есть обработчик, который может отлавливать успешный линк и также ловить ошибки. Ошибки могут возникать, например, когда вы не добавили свой оригинальный диплинк в список белых URL.
Теперь наше приложение будет открывать диплинки вида в нашем телеграм-чате AGIMA Dev. У нас там активное сообщество, и мы всем рады.
P. S. А еще наши друзья из компании AFFINAGE проводят большое исследование по No- и Low-code. Если у вас есть опыт в этой сфере, пройдите опрос. Они даже бота для этого специального сделали.
- Блог компании AGIMA
- Java
- Разработка мобильных приложений
- Разработка под Android
- Kotlin
Освободи свой Android

Некоторое время назад на Хабре вышла статья замечательной девушки fur_habr о проблемах безопасности, приватности и конфиденциальности мобильных коммуникаций и о путях решения этих проблем на платформе Android.
В момент выхода этой статьи я как-то не обратил на неё внимания — тема смартфонов и Андроида мне вообще не очень интересна. Потом, уже через несколько месяцев, я вновь случайно наткнулся на эту статью, вчитался, и проникся идеями, содержащимися в ней. Действительно, почему бы не стать хозяином своему собственному смартфону?
Вашему вниманию предлагается отчёт об эксперименте, проведённым мной по мотивам инструкций из вышеозначенной статьи и о том, что из всего этого может получиться.
Предупреждения
Прочитайте очень внимательно и вдумчиво.
Предупреждение 1
В этой статье рассматривается только техническая часть проблемы и не затрагиваются концептуальные, идеологические и прочие её аспекты. Нужно вам это или нет — решать только вам самим.
Предупреждение 2
Вся информация в статье представлена исключительно в образовательных целях и если вы что-то делаете, то делаете это исключительно на свой страх и риск. Автор публикации не несёт ответственности за любые последствия ваших необдуманных действий.
Начинаем
Итак, мы прочитали статью, а затем вторую статью, прониклись идеями, заложенными в них, и готовы провести практический эксперимент по освобождению своего Андроида (на самом деле эксперимент по освобождению себя от Андроида). С чего же начать?
Кстати, вы заметили, что суть Андроида заложена в самом его названии — это Andro ID, то есть ваш универсальный (в смысле всех аспектов вашей жизни) идентификатор.
Начнём мы с выбора аппарата для экспериментов. Проблема в том, что LineageOS поддерживает очень небольшое количество устройств, причём в основном устаревших. В своей статье fur_habr рекомендует остановиться на Xiaomi Redmi 4(X), Xiaomi Redmi Note 4 или Xiaomi Mi A1. При попытке поинтересоваться у продавцов наличием в продаже этих моделей, я получил в ответ круглые глаза, заверения, что таких древностей у них нет. Интернет только подтвердил диагноз — купить новый аппарат этих моделей практически невозможно, есть какие-то сомнительные предложения (1-2 экземпляра) непонятного происхождения и не факт, что подходящих для наших частот связи. В общем, это не наш путь.
Хорошо, эти аппараты нам не подходят, можно ли найти в списке поддерживаемых LineageOS устройств что-то подходящее? После тщательного просмотра всего списка устройств я не нашёл ни одного (нового, не б/у) смартфона, который можно было бы просто купить в обычном магазине или хотя бы заказать через интернет с быстрой доставкой.
Всё, на этом эксперимент можно было завершать. Как говорится, хороша Маша, да не наша. Но меня уже охватил спортивный азарт и отказываться от Маши не хотелось, поэтому я ещё раз прошерстил список и где-то на четвёртой или пятой итерации обратил внимание на модель Motorola G7. По итогам, это практически единственный актуальный, доступный и подходящий нам аппарат из всего списка LineageOS.
Motorola G7
На тот момент мне было всё равно Motorola это или Rockola (смайл), аппарат выбирался для эксперимента и исключительно по двум критериям — он должен быть новым (зачем нам старый?), не б/у, и присутствовать в списке поддерживаемых LineageOS.

Но в случае с Motorola G7 звёзды прямо сошлись: это свежий (2019 года) аппарат, официально поставляется в Россию, поддерживается LineageOS и, как потом оказалось, он ещё и весьма приличный смартфон и при этом относительно недорого стоит.
Пара слов о цене. Motorola G7 стартовал в апреле 2019 года по цене 20 тыс. рублей, на момент написания статьи его можно свободно купить за 11 тыс. рублей, в интернете есть сообщения, что кому-то удавалось купить его по акции за 9, 8, и даже 6 тыс. рублей (что просто даром).
При этом он имеет на борту 4 ГБ оперативной и 64 ГБ встроенной памяти, NFC, отличный 2270х1080 дисплей 6.2″, лоток на две SIM карты плюс microSD, 2 камеры, сканер отпечатка пальца, USB Type-C, быструю зарядку, 9-й, т. н. «чистый» Android и много чего ещё, см. официальную страницу производителя. Как говорил один известный персонаж, да это просто праздник какой-то!
Немного о модельном ряде. В линейке Moto G7 присутствуют четыре модели: G7 Play, G7 Power, просто G7 без индекса и G7 Plus. Из всех четырёх моделей нашего внимания достойны только две последние, причём G7 Plus более интересный вариант, практически за те же деньги, что и G7. Но в нашем случае критерием выбора является присутствие смартфона в списке поддерживаемых LineageOS, а это только один вариант — Motorola G7.
Покупка и первые впечатления
Ну что ж, цена вопроса 11 тыс. рублей, не сказать что очень мало, но чего не сделаешь из любви к науке. Сказано — сделано, покупаем смартфон, распечатываем коробку — всё классно, тонкий современный смартфон, выглядит отлично, работает так, как ему и положено, никаких замечаний у меня к нему нет.
На борту так называемый «практически чистый» 9-й Android с некоторыми фирменными добавлениями и «фишками» от Моторолы. Не знаю, что подразумевали авторы термина «чистый Андроид», но по сути это зонд, принадлежащий компаниям производителям железа и софта (но никак не вам, по крайней мере до тех пор, пока у вас не будет root прав на устройстве), который отправляет каждый ваш чих на их сервера, а через трекеры, встроенные в приложения, и на десятки серверов по всему миру неустановленному кругу третьих лиц (смотри подробности в статьях fur_habr).
Да, картина, прямо скажем, удручающая. Можно ли как-то исправить это положение? Попробуем разобраться и переходим к хирургическим методам. Пациент готов. Ассистент, скальпель!
Шаг 1. Разблокировка загрузчика
Смартфон поставляется с заблокированным загрузчиком. Это означает, что вы не сможете установить на него стороннюю прошивку. Для того, чтобы установить на него LineageOS, вам нужно сначала разблокировать загрузчик.
Компания Motorola имеет специальную страницу для запросов на разблокирование её устройств. Нужно просто получить некоторые данные от вашего смартфона, отправить их производителю и в ответ он пришлёт вам код разблокировки. Как это сделать я сейчас опишу подробно.

Примечание: здесь и далее речь будет идти о Windows 7 64-bit, если у вас другая операционная система, то действия могут немного отличаться.
Прежде всего, у вас на компьютере должны быть установлены драйвера Motorola для связи через USB порт.
Также вам нужно скачать и установить Android platform-tools с adb и fastboot. Если вы будете работать не из директории platform-tools, то вам нужно добавить путь к ней в настройках Windows (Компьютер — Свойства — Дополнительные параметры системы — Переменные среды — Path).
Затем нужно активировать показ меню разработчика на телефоне (Настройки — О телефоне — Номер сборки) и несколько раз подряд тапнуть по этому пункту, пока не появится надпись, что вы стали разработчиком.
В меню разработчика (Настройки — Система — Для разработчиков) активируем «Отладку по USB», а в меню Настройки — Система — Для разработчиков — Отладка Android активируем «Android Debug Bridge (ADB)». После этого подключаем смартфон к компьютеру, запускаем окно с командной строкой (cmd) и вводим первую команду:
>adb devices
Если всё сделано правильно, то в ответ система сообщит о найденном устройстве:
List of devices attached AH418JDANZ device
Затем вводим команду перезагрузки смартфона в режим бутлоадера:
>adb reboot bootloader
Далее проверяем видит ли компьютер подсоединённое устройство в этом режиме:
>fastboot devices AH418JDANZ fastboot
Если всё нормально, то вводим команду на запрос кода для разблокировки:
>fastboot oem get_unlock_data
В ответ смартфон должен выдать что-то вроде этого:
(bootloader) 93A1958E29857298# (bootloader) 405685468A0468F59638571E31040158805403469# (bootloader) 7035F204E85348570698340A620968E34029663206# (bootloader) 54269720984560184604890000000000 OKAY [ 0.020s] Finished. Total time: 0.022s
Далее просто склеиваем эту последовательность цифр в одну строку (надписи bootloader, скобки и пробелы удаляем, знаки # оставляем) и получается такая строка:
93A1958E29857298#405685468A0468F59638571E31040158805403469#7035F204E85348570698340A620968E34029663206#54269720984560184604890000000000
На своей странице по разблокировке Motorola много раз предупреждает о последствиях разблокировки загрузчика (самое невинное из которых это потеря гарантии) — внимательно прочитайте эти предупреждения и ещё раз подумайте готовы ли вы взять на себя ответственность за возможные последствия ваших действий.
Если готовы, то смело вводим полученную последовательность и нажимаем кнопку отправки. В моём случае код разблокировки пришёл на почту практически сразу. Всё, теперь мы получили ключ от замка и всё зависит только от нас.
Фрагмент ответа из письма от сервиса разблокировки Motorola:
Bootloader Unlock Here is the unique code to unlock the bootloader of your Motorola phone. Unlock Code: 42UKUKYULUYDTRETMDFG
Далее нам нужно в меню разработчика включить функцию разрешения разблокировки загрузчика «Allow OEM Unlock» и ещё раз перезагрузить телефон. Затем подключаемся к смартфону так, как это было описано выше, и вводим команду для разблокировки загрузчика:
>fastboot oem unlock 42UKUKYULUYDTRETMDFG
Получаем ответ в котором система предупреждает, что все ваши данные будут стёрты, соответственно, если у вас есть ценная информация, то вы должны прервать процесс и скопировать её в безопасное место (а лучше сделать это заранее):
(bootloader) WARNING: This command erases all user data. (bootloader) Please re-run this command to continue. OKAY [ 0.004s] Finished. Total time: 0.006s
И ещё раз вводим ту же команду:
>fastboot oem unlock 42UKUKYULUYDTRETMDFG
И вот, наконец, сообщение об успешной разблокировке загрузчика:
(bootloader) Bootloader is unlocked! Rebooting phone OKAY [ 0.680s] Finished. Total time: 0.681s
На этом первый этап нашего эксперимента можно считать завершённым, перезагружаем смартфон и получаем сообщение о том, что загрузчик разблокирован и безопасность нашего телефона находится под угрозой (ага). Сообщение держится на экране 5 секунд и затем смартфон загружается обычным образом.
Шаг 2. Установка TWRP
Переходим ко второй части марлезонского балета. Для того, чтобы установить LineageOS на смартфон, сначала нужно установить т. н. «кастом рекавери» (custom recovery) для проведения операций по очистке разделов смартфона, загрузки файлов, самой прошивки LineageOS и прочих операций.
С TWRP тоже не всё так просто. Существует официальный сайт на котором присутствуют «официальные» сборки TWRP. Рекомендуется скачивать файлы именно с официального сайта, а не со сторонних ресурсов. Также не рекомендуется пользоваться сторонними сборками, поскольку они могут содержать в себе различные закладки.
В случае с Motorola G7 (о чудо!) существует свежее официальное TWRP, которое специально рассчитано на эту модель и устанавливается на телефон на раз-два, без каких-либо проблем. Значимость этого факта можно оценить, почитав форумы и стенания владельцев многих современных телефонов, например, популярного Samsung Galaxy A10 и всей линейки A20, A30, A40, A50… Этих моделей нет в официальном списке поддерживаемых устройств на сайте TWRP.
Переходим на страницу нашего (воистину) замечательного Motorola G7 и скачиваем последнюю на данный момент сборку TWRP twrp-3.3.1-2-river.img.
В официальной инструкции по установке LineageOS рекомендуется на компьютерах с Windows дополнительно выполнить команду
fastboot set_active a
и принудительно сделать активным слот A. По их описанию это связано с ошибкой в реализации fastboot в Windows. И вообще, прежде чем что-то делать, настоятельно рекомендую внимательно ознакомиться с официальной инструкцией на этой странице — там всё написано правильно и очень подробно. Правда на английском, но настоящего любителя мобильных коммуникаций это вряд ли остановит (здесь опять запрещённый смайл).
Ответ Motorola G7 на эту команду:
Setting current slot to 'a' (bootloader) Slot already set active OKAY [ 0.001s] Finished. Total time: 0.004s
Всё, на этом шутки закончились и любое неправильное действие может привести к окирпичиванию вашего драгоценного телефона. Далее действуем очень внимательно и аккуратно.
Вводим команду записи TWRP на устройство:
>fastboot flash boot_a twrp-3.3.1-2-river.img
Система сообщает что файл не подписан, но процесс завершён успешно.
Sending 'boot_a' (27096 KB) OKAY [ 0.725s] Writing 'boot_a' (bootloader) Image not signed or corrupt OKAY [ 0.145s] Finished. Total time: 0.878s
В оригинальной статье указывается, что можно не прописывать TWRP на устройство, а запускать его удалённо, рекомендую перед этим этапом внимательно ознакомиться с тем, что написано в оригинальной статье.
Шаг 3. Установка LineageOS
Осталось совсем немного: сделать несколько настроек в TWRP и загрузить на телефон пару файлов, один из которых и есть прошивка LineageOS. Сначала скачиваем файлы:
copy-partitions.zip
На странице официальной инструкции по инсталляции LineageOS на Motorola G7 говорится о возможных проблемах с A/B слотами на некоторых устройствах и рекомендуется перед инсталляцией прошивки LineageOS установить файл copy-partitions.zip. Скачиваем файл и проверяем его целостность с помощью MD5.
Как проверить MD5 в Windows: запускаем командой cmd окно терминала и вводим команду certutil -hashfile copy-partitions.zip MD5. Затем сравниваем полученные значения с кодом на странице загрузки.
LineageOS
Затем с официальной страницы загрузки LineageOS скачиваем файл прошивки последней версии lineage-16.0-20200109-nightly-river-signed.zip. И проверяем значение хеша SHA-256.
Как проверить хеш SHA-256 в Windows: запускаем командой cmd окно терминала и вводим команду certutil -hashfile lineage-16.0-20200108-nightly-river-signed.zip SHA256. Затем сравниваем полученные значения с кодом на странице загрузки.
AddonSU
Если вы хотите получить root права в вашей будущей системе, то можете скачать ещё AddonSU. Из списка нужно выбрать вариант arm64 addonsu-16.0-arm64-signed.zip, скачать его и затем проверить SHA-256 хеш.
Google apps
Ещё вы можете скачать для установки Google apps, но, как справедливо заметила fur_habr в своей статье, тогда вся затея с LineageOS теряет всякий смысл. Поэтому Google apps мы скачивать не будем, а за подробностями я вас отсылаю к статье и комментариям к ней.
Операции в TWRP
Запускаем прописанное на устройство TWRP:
fastboot boot twrp-3.3.1-2-river.img
Запускается интерфейс нашего «кастом рекавери» и мы можем проводить заключительные действия по инсталляции LineageOS на наш смартфон Motorola G7.

В интерфейсе TWRP выбираем кнопку «Advanced» и далее «ADB Sideload», а на компьютере в командной строке набираем:
>adb sideload copy-partitions.zip
После успешной загрузки файла система ответит:
Total xfer: 1.00x
Затем в интерфейсе TWRP выбираем кнопку «Wipe» и далее «Format Data». После завершения процесса возвращаемся в предыдущее меню. Нажимаем на кнопку «Advanced Wipe» и выбираем «System» и «Cache».
Возвращаемся в главное меню и снова выбираем кнопку «Advanced» и далее «ADB Sideload», а на компьютере в командной вводим строке:
>adb sideload lineage-16.0-20200108-nightly-river-signed.zip
и загружаем прошивку LineageOS в смартфон. Ответ при успешном выполнении операции:
Total xfer: 1.00x
Если мы хотим установить root на устройство, то далее вводим команду:
adb reboot sideload
>adb sideload addonsu-16.0-arm64-signed.zip
Total xfer: 2.08x
Вот теперь точно всё. Перезагружаем смартфон и нас встречает маленькое чудо — операционная система LineageOS.
Root
Если вы установили AddonSU, то в меню разработчика появится соответствующий пункт, в котором вы сможете выбрать режимы работы root на вашем устройстве.
LineageOS
Да… в упорстве нам не откажешь… И вот, после всех этих титанических усилий мы всё-таки добились своего — установили LineageOS на Motorola G7. И что же мы имеем в итоге?
Это всё тот же 9-й Android и внешне эта система мало чем отличается от того, что было на родной прошивке Motorola G7. Кнопки примерно на тех же местах, функции примерно те же, в общем после смены операционной системы я не испытывал никаких затруднений или неудобств в работе со смартфоном.
Что мы потеряли?
Поскольку мы не стали устанавливать Google сервисы, то мы потеряли все программы, которые зависят от этих сервисов, а также мы лишились уведомлений, которые работают через них (это касается не всех приложений, но многих). В оригинальной статье (https://habr.com/ru/post/465945/) подробно рассматривается этот вопрос и даются рекомендации по установке альтернативных программ для поддержки Google сервисов.
Мы потеряли также банковские приложения и оплату через NFC (не всегда и не во всех случаях, за подробностями снова отсылаю к оригинальной статье).
Что мы приобрели?
Мы просто вернули себе право управления своим собственным устройством и избавились ото всех (наивно думать, что ото всех, но по крайней мере от большинства) шпионских модулей. Теперь мы сами можем решать что и как должен делать наш смартфон (он ведь наш, верно?).
Немного технических подробностей. То, что мы имеем сейчас в лице LineageOS уже можно с натяжкой назвать «чистым Андроидом». Это хорошо заметно по логу фаервола. Если в родной, якобы «чистой» прошивке Motorola G7 фаервол просто раскалялся от паразитной активности приложений и сервисов Google и Motorola и десятков трекеров в приложениях, то на LineageOS внутренняя жизнь системы приобрела вменяемый характер.
Система больше не напоминает проходной двор где шарятся все кому не лень, начиная от китайских девелоперов и заканчивая индусскими программистами и маркетологами со всего мира (попутно скачивая ваши приватные данные и протоколируя каждый ваш тап по экрану). Лог фаервола почти пустой и найти в нём можно только те приложения и только по тем адресам и портам которые нужны непосредственно для их работы и которые одобрены мной, как хозяином (!) устройства.
Как это сказалось на расходе батареи и объёме платного трафика я думаю пояснять не нужно. Андроид просто перестал заниматься огромным количеством посторонних дел и растрачивать на это свои ресурсы (перестал обслуживать чужие, прямо противоречащие вашим, интересы).
Есть ли жизнь на LineageOS?
После установки LineageOS и посещения F-Droid я закрыл 95% своих потребностей в программах на Android. Есть набор стандартных «Simple» приложений (часы, калькулятор, блокнот, календарь, файловый менеджер и т. д.), есть проигрыватели аудио и видео (VLC), есть карты, читалки, есть отличный почтовый клиент (K-9), в репозитории F-Droid есть более 2000 приложений на любой вкус, есть даже версия Telegram, работающая без Google сервисов для поклонников этого мессенджера.
Для тех редких случаев когда нужная программа есть только в Google Play, можно воспользоваться альтернативными клиентами Yalp store или Aurora Store.
Телефон звонит, СМС-ки ходят, почта работает, интернет в полном объёме, доступны все сервисы при авторизации через браузер, есть свободное облако, при желании можно поставить Telegram и т. д. и т. п. В общем, на мой взгляд, LineageOS это вариант не для всех и не всегда, но во многих случаях это просто отличное решение.
Выводы
Очевидно, что для большинства «нормальных людей» которым нужно «передать файл по Ватсапу», «погонять птиц», посвайпить бесконечные ленты «друзей», установить кешбек-приложения от Спортмастера и Алиэкспресс и расплатиться на платной трассе через NFC — этот вариант не подходит.
Сама идея чистого и подконтрольного вам смартфона входит в противоречие с логикой и практикой жизни в современном обществе, где каждый продавец товаров или услуг имеет своё приложение, которое занимается сливом ваших данных, отслеживанием вашей активности и построением вашего цифрового профиля.
Что со всем этим делать предлагаю читателям решать самостоятельно.
Послесловие
В общем, я доволен проведённым экспериментом — за это время я узнал много интересного и, как гик, получил огромное удовольствие от тесного общения с классным аппаратом Motorola G7. В результате я получил «чистый» телефон, который просто приятно держать в руках, ощущая себя его хозяином и не опасаясь, что в этот момент он что-то куда-то сливает или делает фотографии.
Пока Motorola G7 остаётся полем для экспериментов и «вторым» телефоном, наряду с моим старым аппаратом, набитым всякой «шнягой» типа Google сервисов и Ватсапа и после использования которого хочется перекреститься и помыть руки (смайл).
И напоследок пара фотографий свободного Motorola G7 с установленной на нём LineageOS.
Package Manager Класс
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
[Android.Runtime.Register("android/content/pm/PackageManager", DoNotGenerateAcw=true)] public abstract class PackageManager : Java.Lang.Object
[] type PackageManager = class inherit Object
Наследование
PackageManager
Производный
Комментарии
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.
Конструкторы
Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения.
Поля
Является устаревшей.
Входные байты сертификата: входные байты представляют собой закодированный X.
Является устаревшей.
Входные байты сертификата: входные байты представляют выходные данные SHA256 закодированного X.
Является устаревшей.
Пометка параметра для #setComponentEnabledSetting(android.content.ComponentName, int, int) , чтобы указать, что вы не хотите уничтожать приложение, содержащее компонент.
Дополнительное имя поля для идентификатора пакета, ожидающего проверки.
Дополнительное имя поля для результата проверки: #VERIFICATION_ALLOW , или #VERIFICATION_REJECT .
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает выполнение действий на дополнительных дисплеях.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает мини-приложения.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : звуковой конвейер устройства имеет низкую задержку и больше подходит для звуковых приложений, чувствительных к задержкам или задержкам при входе или выходе звука.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает по крайней мере одну форму аудиовыхода, как описано в разделе 7.8 Аудиодокумента определения совместимости Android (CDD).
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет профессиональный уровень функциональности и производительности звука.
Функция и #getSystemAvailableFeatures . Устройство поддерживает автоматическое заполнение учетных данных пользователя, адресов, кредитных карт и #hasSystemFeature т. д. через интеграцию с android.service.autofill.AutofillService autofill providers .
Функция для и #hasSystemFeature : это устройство, предназначенное для #getSystemAvailableFeatures отображения пользовательского интерфейса на головном устройстве автомобиля.
Компонент для #getSystemAvailableFeatures и #hasSystemFeature : устройство может выполнять операции резервного копирования и восстановления в установленных приложениях.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство может взаимодействовать с другими устройствами через Bluetooth.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство может взаимодействовать с другими устройствами через радио Bluetooth Low Energy.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет камеру, обращенную к экрану.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет по крайней мере одну камеру, указывающую в определенном направлении, или может поддерживать подключение внешней камеры к нему.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : по крайней мере одна из камер на устройстве поддерживает android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING MOTION_TRACKING уровень возможностей.
Функция и #getSystemAvailableFeatures #hasSystemFeature : камера устройства поддерживает автофокусировку.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : по крайней мере одна из камер на устройстве поддерживает android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING manual post-processing уровень возможностей.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : по крайней мере одна из камер на устройстве поддерживает android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR manual sensor уровень возможностей.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : по крайней мере одна из камер на устройстве поддерживает android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_RAW RAW уровень возможностей.
Функция и #getSystemAvailableFeatures #hasSystemFeature : основная переддняя и задняя камеры устройства могут одновременно выполнять потоковую передачу, как описано в разделе android.hardware.camera2.CameraManager#getConcurrentCameraIds() .
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство может поддерживать подключение внешней камеры к нему.
Функция и #getSystemAvailableFeatures #hasSystemFeature : камера устройства поддерживает вспышку.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет переднюю камеру.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : по крайней мере одна из камер на устройстве поддерживает android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL full hardware уровень возможностей.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает android.R.attr#cantSaveState API.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает android.companion.CompanionDeviceManager#associate associating с устройствами через android.companion.CompanionDeviceManager .
Является устаревшей.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : API службы подключений включен на устройстве.
Функция и #getSystemAvailableFeatures #hasSystemFeature . Устройство может взаимодействовать с потребительскими устройствами IR.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает системный интерфейс для выбора и привязки служб управления устройствами, предоставляемых приложениями.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает принудительное применение политики устройств через администраторов устройств.
Функция и #getSystemAvailableFeatures #hasSystemFeature . Это устройство для Интернета вещей, которое может не иметь пользовательского интерфейса.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : это устройство поддерживает Ethernet.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает расширенный многооконный режим «изображение в рисунке».
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство имеет биометрическое оборудование для проверки подлинности лиц.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство не имеет сенсорного экрана, но поддерживает эмуляцию сенсорного ввода для основных событий.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство не имеет сенсорного экрана, но поддерживает эмуляцию сенсорного ввода для базовых событий, которые поддерживают отслеживание двух или более пальцев.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство не имеет сенсорного экрана, но поддерживает эмуляцию сенсорного ввода для базовых событий, которые поддерживают отслеживание руки пальцев (5 или более пальцев) полностью независимо.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет биометрическое оборудование для обнаружения отпечатков пальцев.
В качестве основного принципа:
Функция и #hasSystemFeature : устройство имеет все входные данные, необходимые для #getSystemAvailableFeatures того, чтобы считаться совместимым игровым контроллером, или включает совместимый игровой контроллер в коробке.
Функция для #getSystemAvailableFeatures и #hasSystemFeature(String, int) . Если эта функция поддерживается, устройство реализует хранилище ключей Android, поддерживаемое изолированной средой выполнения.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает возможности обработки датчиков высокой точности.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает начальный экран, который можно заменить сторонними приложениями.
Функция для #getSystemAvailableFeatures и #hasSystemFeature(String, int) . Если эта функция поддерживается, устройство поддерживает android.security.identity.IdentityCredentialStore реализацию в защищенном оборудовании в заданной версии компонента.
Функция для #getSystemAvailableFeatures и #hasSystemFeature(String, int) . Если эта функция поддерживается, устройство поддерживает android.security.identity.IdentityCredentialStore реализацию в защищенном оборудовании с прямым доступом в заданной версии компонента.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает добавление новых методов ввода, реализованных android.inputmethodservice.InputMethodService с помощью API.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет необходимую поддержку ядра для туннелей IPsec с поддержкой нескольких сетей.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет биометрическое оборудование для проверки подлинности радужной оболочки глаза.
Функция для #getSystemAvailableFeatures и #hasSystemFeature . Устройство имеет реализацию хранилища ключей, которая может создавать ключи аттестации для конкретных приложений.
Функция для #getSystemAvailableFeatures и #hasSystemFeature . Устройство имеет реализацию хранилища ключей, которая может принудительно применять ключ ограниченного использования на оборудовании с любым максимальным числом использования (включая число равно 1).
Функция для #getSystemAvailableFeatures и #hasSystemFeature . Устройство имеет реализацию хранилища ключей, которая может применять только ограниченный ключ использования на оборудовании с максимальным числом использования равно 1.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает пользовательский интерфейс с поддержкой отката.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает только пользовательский интерфейс с поддержкой отката.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает трансляцию и может отображать содержимое из тв-входов, реализованных с помощью android.media.tv.TvInputService API.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает живые обои.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает один или несколько методов создания отчетов о текущем расположении.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет приемник глобальной системы позиционирования и может сообщать точное расположение.
Функция и #getSystemAvailableFeatures #hasSystemFeature . Устройство может сообщать о расположении с грубой точностью с помощью сетевой системы геолокации.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает создание дополнительных пользователей и управляемых профилей с помощью DevicePolicyManager .
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство может записывать звук с помощью микрофона.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет полную реализацию android.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство может обмениваться данными с помощью Near-Field связи (NFC).
Функция для #getSystemAvailableFeatures и #hasSystemFeature . Api луча включен на устройстве.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает эмуляцию nfc-карты на основе узла.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает эмуляцию карты NFC-F на основе узла.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает эмуляцию карты NFC на основе eSE.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает эмуляцию nfc-карты на основе uicc.
Компонент для #getSystemAvailableFeatures и #hasSystemFeature(String, int) . Если эта функция поддерживается, в версии компонента указывается дата, которая, как известно, устройство передает набор тестов OpenGLES dEQP, связанный с этой датой.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает OpenGL ES Пакет расширений Android.
Функция и #getSystemAvailableFeatures #hasSystemFeature . Это устройство предназначено для использования в основном с клавиатурой, мышью или сенсорной панелью.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает многооконный режим «изображение в рисунке».
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает печать.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : метод устройства ActivityManager#isLowRamDevice() ActivityManager.isLowRamDevice() возвращает значение true.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : метод устройства ActivityManager#isLowRamDevice() ActivityManager.isLowRamDevice() возвращает значение false.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает экраны альбомной ориентации.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает экраны книжной ориентации.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет безопасную реализацию keyguard, то есть устройство поддерживает ПИН-код, шаблон и пароль, как определено в CDD Android.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает безопасное удаление пользователей.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство совместимо с моделью безопасности Android.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает акселерометр.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает акселерометр с ограниченными осями.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает некалибрированный акселерометр с ограниченными осями.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает датчик температуры окружающей среды.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает барометр (датчик давления воздуха.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает магнитометр (компас).
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает предоставление датчиков отслеживания головы с периферийных устройств через API динамических датчиков.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает гироскоп.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает гироскоп с ограниченными осями.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает некалибрированный ограниченный гироскоп осей.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство включает датчик заголовков.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает монитор частоты сердечных сокращений.
Функция и #getSystemAvailableFeatures #hasSystemFeature : Датчик частоты сердечных сокращений на этом устройстве является электрокардиограммой.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает датчик угла поворота.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает датчик освещения.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает датчик близкого взаимодействия.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает датчик относительной влажности.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство включает аппаратный счетчик шагов.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство включает в себя аппаратный детектор шагов.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает безопасные элементы на основе eSE с поддержкой Open Mobile API.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает безопасные элементы на основе SD с поддержкой Open Mobile API.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает защищенные элементы на основе UICC с поддержкой Open Mobile API.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : API SIP включен на устройстве.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает VOIP на основе SIP.
Функция для #getSystemAvailableFeatures , #hasSystemFeature(String) и #hasSystemFeature(String, int) : если эта функция поддерживается, устройство реализует хранилище ключей Android, поддерживаемое выделенным защищенным процессором, который называется StrongBox.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает API телекоммуникационных служб.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство оснащено радиотелефоном с поддержкой передачи данных.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает API телефонии для вызова службы.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет стек cdma-телефонии.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает API телефонии для службы данных.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает внедренные подписки на eUICC.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает несколько включенных профилей в eUICC.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет стек телефонии GSM.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает подключение к реализациям IMS с помощью API ImsService в телефонии.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает прием трансляции ячеек с помощью API MBMS.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает API телефонии для SMS и MMS.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает API телефонии для радиодоступа.
Функция и #getSystemAvailableFeatures #hasSystemFeature . Устройство поддерживает API телефонии для подписки.
Является устаревшей.
Функция и #hasSystemFeature : это устройство, предназначенное для #getSystemAvailableFeatures отображения пользовательского интерфейса на телевизоре.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : дисплей устройства имеет сенсорный экран.
Функция и #getSystemAvailableFeatures #hasSystemFeature : сенсорный экран устройства поддерживает мультитушку, достаточную для базового обнаружения жестов двумя пальцами.
Функция и #getSystemAvailableFeatures #hasSystemFeature : сенсорный экран устройства может отслеживать два или более пальцев полностью независимо.
Функция и #getSystemAvailableFeatures #hasSystemFeature : сенсорный экран устройства может отслеживать полную руку пальцев полностью независимо, то есть 5 или более одновременных независимых указателей.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает подключение к периферийным USB-устройствам.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает подключение к USB-устройствам в качестве узла USB.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает проверенную загрузку.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство реализует отслеживание головы, подходящее для устройства виртуальной реальности.
Является устаревшей.
Функция и #getSystemAvailableFeatures #hasSystemFeature . Устройство реализует оптимизированный режим для приложений виртуальной реальности (VR), который обрабатывает стереоскопическую отрисовку уведомлений и отключает большинство компонентов пользовательского интерфейса монокулярной системы, пока приложение виртуальной реальности имеет фокус пользователя.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство реализует оптимизированный режим для приложений виртуальной реальности (VR), который обрабатывает стереоскопическую отрисовку уведомлений, отключает большинство компонентов пользовательского интерфейса монокулярной системы, в то время как приложение виртуальной реальности имеет фокус пользователя и соответствует дополнительным требованиям CDD для обеспечения высокого качества виртуальной реальности.
Компонент для #getSystemAvailableFeatures и #hasSystemFeature(String, int) . Если эта функция поддерживается, в версии компонента указывается дата, которая, как известно, устройство передает набор тестов Vulkan dEQP, связанный с этой датой.
Функция для #getSystemAvailableFeatures и #hasSystemFeature(String, int) . Если эта функция поддерживается, реализация Vulkan на этом устройстве выполняет аппаратное ускорение, а собственный API Vulkan перечислит по крайней мере один VkPhysicalDevice , а версия компонента будет указывать, какой уровень дополнительных вычислительных функций, поддерживаемых устройством, помимо Vulkan 1.
Функция для #getSystemAvailableFeatures и #hasSystemFeature(String, int) . Если эта функция поддерживается, реализация Vulkan на этом устройстве выполняет аппаратное ускорение, а собственный API Vulkan перечислит по крайней мере один VkPhysicalDevice , а версия компонента укажет, какой уровень дополнительных аппаратных функций ограничивается.
Функция для #getSystemAvailableFeatures и #hasSystemFeature(String, int) . Если эта функция поддерживается, реализация Vulkan на этом устройстве выполняется с аппаратным ускорением, а версия функции будет указывать на самую высокую поддерживаемую VkPhysicalDeviceProperties::apiVersion физическими устройствами, поддерживающими аппаратный уровень, указанный в параметре #FEATURE_VULKAN_HARDWARE_LEVEL .
Функция и #getSystemAvailableFeatures #hasSystemFeature . Это устройство, предназначенное для отображения пользовательского интерфейса на часах.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство имеет полную реализацию android.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает Wi-Fi (802.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает Wi-Fi с поддержкой.
Функция для #getSystemAvailableFeatures и #hasSystemFeature : устройство поддерживает Wi-Fi прямую сеть.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает Wi-Fi Passpoint и все API, связанные с Passpoint, в WifiManager поддерживаются.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает Wi-Fi RTT (IEEE 802.
Функция и #getSystemAvailableFeatures #hasSystemFeature : устройство поддерживает увеличение окна.
Является устаревшей.
Флаг списка разрешений: разрешения, добавленные установщиком в список разрешений.
Является устаревшей.
Флаг списка разрешений: разрешения, добавленные системой в список разрешений.
Является устаревшей.
Флаг списка разрешений: разрешения, добавленные системой в список разрешений при обновлении с версии ОС, в которой разрешение не ограничивалось версией ОС, в которой это разрешение ограничено.
Является устаревшей.
PackageInfo flag: возвращает все атрибуты, объявленные в манифесте пакета.
Является устаревшей.
Сценарий установки, указывающий на массовую операцию с требуемым результатом полностью оптимизированного приложения.
Является устаревшей.
Сценарий установки, указывающий на массовую операцию, которая имеет минимальное влияние на работоспособность системы по сравнению с оптимизацией приложений.
Является устаревшей.
Значение, указывающее на отсутствие сведений CUJ, отключающее всю логику сценария установки.
Является устаревшей.
Сценарий установки, обеспечивающий самую быструю возможность запуска кнопки установки.
PackageInfo флаг: включите пакеты APEX, которые установлены в данный момент.
Флаг запроса: автоматически сопоставляет компоненты на основе их осведомленности о прямой загрузке и текущего состояния пользователя.
Можно использовать в качестве аргумента millisecondsToDelay для PackageManager#extendVerificationTimeout .
<application> тег уровня android.content.pm.PackageManager.Property , указывающий идентификатор ресурса XML, содержащий XML-файл возможностей мультимедиа приложения
For example: <application> <property android:name="android.
Является устаревшей.
Параметр флага для #setComponentEnabledSetting(android.content.ComponentName, int, int) указывает, что состояние ограничений пакета данного пользователя будет сериализовано на диск после обновления состояния компонента.
Является устаревшей.
Используется в качестве аргумента verificationCode для , PackageManager#verifyPendingInstall чтобы указать, что вызывающий проверяющий пакет позволяет продолжить установку.
Является устаревшей.
Используется в качестве аргумента verificationCode для, PackageManager#verifyPendingInstall чтобы указать, что вызывающая проверка пакетов не голосует за продолжение установки.
Константная для указания самого высокого установленного кода версии пакета.
Свойства
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Возвращает локализованную метку, соответствующую параметру в параметрах предоставления доступа в фоновом режиме.
Возвращает класс среды выполнения данного объекта Object .
Возвращает универсальный значок для действия, используемого, если конкретный значок не определен.
Дескриптор базового экземпляра Android.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Примечание. В ретроспективе было бы предпочтительнее использовать более инклюзивную терминологию при именовании этого API.
Возвращает значение true, если устройство обновляется, например первая загрузка после OTA.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Приложения могут запрашивать этот запрос, чтобы узнать, были ли они приостановлены.
Возвращает значение, указывающее, загружено ли устройство в безопасном режиме.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Интерфейс возврата, который предоставляет возможность установки, обновления и удаления приложений на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Возвращает из Bundle дополнительных компонентов, которые должны были быть отправлены вызывающему приложению, когда оно было приостановлено.
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.
Доверяйте любому установщику, чтобы предоставить контрольные суммы для пакета.
Не доверяйте установщику предоставлять контрольные суммы для пакета.
Методы
Добавьте новое динамическое разрешение в систему.
Как, #addPermission(PermissionInfo) но асинхронно сохраняет состояние диспетчера пакетов после возврата из вызова, позволяя ему быстрее возвращать и пакетировать серию сложений без каких-либо гарантий, что добавленное разрешение будет сохранено, если устройство перезагрузится до его записи.
Является устаревшей.
Добавьте новое сопоставление предпочтительных действий в систему.
Добавляет ограниченное разрешение в списке разрешений для приложения.
Сопоставление канонического имени пакетов с текущим именем, используемым на устройстве.
Возвращает значение true , если исходный пакет может запрашивать сведения о целевом пакете.
Проверяет, разрешено ли вызывающему пакету запрашивать установку пакета с помощью установщика пакетов.
Проверьте, предоставлено ли определенному пакету определенное разрешение.
Как и #checkSignatures(String, String) , но принимает идентификаторы пользовательского интерфейса двух пакетов для проверки.
Сравните сигнатуры двух пакетов, чтобы определить, отображается ли в обоих из них та же сигнатура.
Очищает мгновенный файл cookie приложения для вызывающего приложения.
Является устаревшей.
Удалите все сопоставления предпочтительных действий, ранее добавленные с #addPreferredActivity помощью , из системы, действия которой реализуются в заданном имени пакета.
Создает и возвращает копию этого объекта.
Сопоставляйте имена текущих пакетов, используемых на устройстве, с текущим каноническим именем этого пакета.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Указывает, равен ли какой-то другой объект этому объекту.
Позволяет пакету, прослушивающим Intent#ACTION_PACKAGE_NEEDS_VERIFICATION package verification broadcast , продлить время ожидания по умолчанию для ответа и объявить, какое действие следует выполнить после истечения времени ожидания.
Получите баннер, связанный с действием.
Получите баннер, связанный с намерением.
Получите значок, связанный с действием.
Получите значок, связанный с намерением.
Является устаревшей.
Получение всех сведений, известных нам о конкретном классе действий.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Получение логотипа, связанного с действием.
Получите логотип, связанный с намерением.
Получение всех известных групп разрешений в системе.
Получите баннер, связанный с приложением.
Получите баннер, связанный с приложением.
Возвращает параметр enabled для приложения.
Получите значок, связанный с приложением.
Получите значок, связанный с приложением.
Является устаревшей.
Получение всех известных сведений о конкретном пакете или приложении.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Возвращает метку, используемую для этого приложения.
Возвращает метку, используемую для этого приложения.
Получите логотип, связанный с приложением.
Получите логотип, связанный с приложением.
Возвращает имена пакетов, которые были изменены [например,
Возвращает включенный параметр для компонента пакета (действие, получатель, служба, поставщик).
Получение изображения из пакета.
Получите определяемую платформой группу разрешений определенного разрешения, если разрешение является разрешением, определяемым платформой.
Возвращает значение хэш-кода для объекта.
Является устаревшей.
Возвращает список всех пакетов приложений, установленных для текущего пользователя.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Возвращает список всех установленных модулей.
Является устаревшей.
Возвращает список всех пакетов, установленных для текущего пользователя.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Получение имени пакета приложения, которое установило пакет.
Извлекает сведения о том, как был установлен или обновлен пакет.
Возвращает мгновенный файл cookie приложения для этого приложения.
Получение всех сведений о конкретном классе инструментирования.
Возвращает «хорошее» намерение для запуска действия переднего плана в пакете.
Возвращает объект , IntentSender который можно использовать для запуска действия переднего плана в пакете.
Возвращает «хорошее» намерение для запуска действия Leanback переднего плана в пакете, например для реализации кнопки «открыть» при просмотре пакетов.
Возвращает все типы MIME, содержащиеся в группе MIME.
Получение сведений для определенного модуля.
Получение официального имени, связанного с uid.
Является устаревшей.
Получение общих сведений о пакете приложения, определенном в архивном файле пакета
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Возвращает массив всех идентификаторов вторичных групп POSIX, назначенных данному пакету.
Является устаревшей.
Возвращает массив всех идентификаторов вторичных групп POSIX, назначенных данному пакету.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Получение общих сведений о пакете приложения, установленном в системе.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Получение общих сведений о пакете приложения, установленном в системе.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Получение имен всех пакетов, связанных с определенным идентификатором пользователя.
Является устаревшей.
Возвращает список всех установленных пакетов, которые в настоящее время имеют любое из указанных разрешений.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Возвращает идентификатор UID, связанный с заданным именем пакета.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Получение всех известных сведений об определенной группе разрешений.
Получение всей известной информации о конкретном разрешении.
Получение определяемых платформой разрешений, принадлежащих определенной группе разрешений.
Является устаревшей.
Получение всех предпочтительных действий, ранее добавленных с #addPreferredActivity помощью , которые в настоящее время зарегистрированы в системе.
Является устаревшей.
Получение списка всех настроенных в настоящее время предпочтительных пакетов.
Возвращает свойство, определенное в заданном объявлении компонента.
Возвращает свойство, определенное в заданном объявлении компонента.
Является устаревшей.
Получение всей известной нам информации о конкретном классе поставщика содержимого.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Получение всех известных сведений о конкретном классе приемника.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Получение ресурсов, связанных с действием.
Получение ресурсов для приложения.
Получите ресурсы для приложения для предоставленной конфигурации.
Получите ресурсы, связанные с приложением.
Является устаревшей.
Получение всех известных сведений о конкретном классе службы.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Получение списка общих библиотек на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Возвращает значение, указываемое, будет ли создано действие сведений об искусственном приложении, если в приложении нет включенного действия средства запуска.
Получение списка функций, доступных в системе.
Получите список общих библиотек, доступных в системе.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Получение текста из пакета.
Получение текста из пакета.
Если целевой пользователь является управляемым профилем вызывающего пользователя или вызывающий объект сам является управляемым профилем, то возвращается копия указанного рисуемого объекта с индикатором событий, позволяющая пользователю отличить его от исходного рисуемого объекта.
Если целевой пользователь является управляемым профилем, он возвращает копию заданного значка с индикатором событий, чтобы отличить его от исходного значка.
Если целевой пользователь является управляемым профилем вызывающего пользователя или вызывающий объект сам является управляемым профилем, то возвращается копия метки с ошибками для служб специальных возможностей, таких как talkback.
Если целевой пользователь является управляемым профилем вызывающего пользователя или вызывающий объект сам является управляемым профилем, то возвращается копия метки с ошибками для служб специальных возможностей, таких как talkback.
Получает ограниченные разрешения, которые были внесены в список разрешений, и приложению разрешено предоставлять их в полной форме.
Получение XML-файла из пакета.
Выполняет поиск набора сертификатов подписи, с помощью которых пакеты для заданного пользовательского интерфейса были подписаны.
Выполняет поиск набора сертификатов подписи, с помощью которых данный пакет был подписан.
Проверьте, является ли указанное имя функции одной из доступных функций, возвращенных #getSystemAvailableFeatures() .
Проверьте, является ли указанное имя и версия функции одной из доступных функций, возвращенных #getSystemAvailableFeatures() .
Проверяет, не может ли приложение автоматически отзываться, если приложение не используется в течение длительного периода времени.
Возвращает значение, указывающее, является ли данный пакет мгновенным приложением.
Запросите, если приложение в настоящее время приостановлено.
Возвращает значение , если предоставленный рисуемый объект представляет значок действия по умолчанию, предоставленный системой.
Проверяет, были ли отозваны определенные разрешения для пакета политикой.
Вызывается сборщиком мусора для объекта , когда сборка мусора определяет, что больше нет ссылок на объект .
Пробуждает один поток, ожидающий монитора этого объекта.
Пробуждает все потоки, ожидающие на мониторе этого объекта.
Возвращает определение свойства для всех &тегов lt;activity> и <activity-alias>.
Возвращает определение свойства для всех &тегов lt;application>.
Является устаревшей.
Получение всех получателей, которые могут обрабатывать широковещательную передачу заданного намерения.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Получение сведений о поставщике содержимого.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Получение сведений о доступном коде инструментирования.
Является устаревшей.
Получение всех действий, которые могут быть выполнены для данного намерения.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Получение набора действий, которые должны быть представлены пользователю в виде аналогичных параметров.
Является устаревшей.
Получение всех поставщиков, которые могут соответствовать заданному намерению.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Получение всех служб, которые могут соответствовать заданному намерению.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Запрос всех разрешений, связанных с определенной группой.
Возвращает определение свойства для всех &тегов lt;provider>.
Возвращает определение свойства для всех &тегов lt;receiver>.
Возвращает определение свойства для всех &тегов lt;service>.
Удаляет разрешение, которое ранее было добавлено с #addPermission(PermissionInfo) помощью .
Удаляет ограниченное разрешение для приложения в списке разрешений.
Запрос контрольных сумм для пакетов APK в пакете.
Является устаревшей.
Определите наилучшее действие, выполняемое для данного намерения.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Поиск одного поставщика содержимого по его центру.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Является устаревшей.
Определите наилучшую службу для конкретного намерения.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Укажите, каким ApplicationInfo#category должно быть значение для данного пакета.
Установка включенного параметра для приложения. Этот параметр переопределяет любое включенное состояние, которое может быть задано приложением в манифесте.
Помечает приложение, не имеющее его разрешений, автоматически отзывается, когда приложение не используется в течение длительного периода времени.
Задайте включенный параметр для компонента пакета (действие, получатель, служба, поставщик).
Задайте включенные параметры для компонентов пакета, таких как действия, получатели, службы и поставщики.
Измените установщик, связанный с данным пакетом.
Задает типы MIME группы MIME.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Возвращает строковое представление объекта.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Обновления мгновенный файл cookie приложения для вызывающего приложения.
Позволяет пакету, прослушивающему , Intent#ACTION_PACKAGE_NEEDS_VERIFICATION package verification broadcast отвечать диспетчеру пакетов.
Заставляет текущий поток ожидать, пока другой поток не вызовет java.lang.Object#notify() метод или java.lang.Object#notifyAll() метод для этого объекта.
Заставляет текущий поток ожидать, пока другой поток не вызовет java.lang.Object#notify() метод или java.lang.Object#notifyAll() метод для этого объекта, или не истерегает указанное время.
Заставляет текущий поток ожидать, пока другой поток не вызовет java.lang.Object#notify() метод или java.lang.Object#notifyAll() метод для этого объекта, или какой-либо другой поток прерывает текущий поток, или истетит определенный период реального времени.
Явные реализации интерфейса
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Методы расширения
Выполняет преобразование типа, проверенного средой выполнения Android.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.
Класс для получения различных типов сведений, связанных с пакетами приложений, которые в настоящее время установлены на устройстве.