← Назад к вопросам

Что такое запрещенные API?

2.0 Middle🔥 142 комментариев
#Android компоненты#Архитектура и паттерны

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое запрещенные API (Restricted API)?

Запрещенные API — это методы, классы или интерфейсы в Android SDK (или других платформах), использование которых в публичных приложениях явно ограничено или запрещено Google. Эти API часто предоставляют доступ к системным функциям, которые могут нарушать безопасность, стабильность системы, конфиденциальность пользователя или политики магазина приложений.

Почему существуют запрещенные API?

Основные причины:

  • Безопасность системы: Предотвращение несанкционированного доступа к системным процессам, данным других приложений или низкоуровневым функциям ОС.
  • Конфиденциальность пользователя: Защита личной информации (например, списка контактов, SMS, истории звонков) от злоупотреблений.
  • Стабильность платформы: Исключение использования API, которые могут привести к сбоям системы, чрезмерному потреблению ресурсов или ухудшению пользовательского опыта.
  • Согласованность экосистемы: Обеспечение того, чтобы все приложения следовали единым правилам и политикам (например, Google Play).

Примеры запрещенных API в Android

  1. Телефонные API (android.telephony):
    *   `TelephonyManager.getAllCellInfo()` — для доступа к детальной информации о сотовых вышках (требуются привилегированные разрешения).
    *   Методы для скрытого набора номера или перехвата звонков.

  1. SMS/MMS API (android.telephony.SmsManager):
    *   Отправка SMS/MMS без явного согласия пользователя (вне Whitelist'а приложений для SMS).

  1. Системные API с пометкой @hide в AOSP:
    *   Эти API присутствуют в исходном коде Android (AOSP), но не являются частью публичного SDK. Они могут меняться или исчезать в любом обновлении.
```java
// Пример: PowerManager.goToSleep() — системный метод для перевода устройства в спящий режим.
// Он помечен как @hide и недоступен в обычном SDK.
// Попытка использовать через рефлексию приведет к проблемам.
try {
    Method goToSleep = powerManager.getClass().getMethod("goToSleep", long.class);
    goToSleep.invoke(powerManager, SystemClock.uptimeMillis());
} catch (Exception e) {
    // Вызовет ошибку на большинстве устройств
}
```

4. Непубличные API через рефлексию:

    *   Использование Java Reflection или JNI для вызова скрытых методов.
```java
// Плохая практика: попытка получить скрытое поле через рефлексию
try {
    Field hiddenField = TextView.class.getDeclaredField("mCursorDrawableRes");
    hiddenField.setAccessible(true);
    int value = (int) hiddenField.get(textView);
} catch (Exception e) {
    // Ненадежно и может сломаться в будущих версиях Android
}
```

Как Google контролирует использование запрещенных API?

  • Проверка Google Play: При загрузке приложения в Google Play используется статический анализ (вертикальная проверка). Система сканирует APK/AAB на наличие вызовов запрещенных API. Если они обнаружены, приложение может быть отклонено или удалено из магазина.
  • API-уровни (API Levels): Многие системные API требуют подписи приложения или флага signature/privileged в манифесте, которые недоступны обычным разработчикам.
  • Политики Google Play: Явно запрещают использование API для скрытого сбора данных, вмешательства в работу других приложений и т.д.

Что делать разработчику?

  1. Используйте только публичные API из официальной документации Android.
  2. Проверяйте приложение с помощью lint или инструментов типа veridex для обнаружения потенциальных проблем.
  3. Ищите легальные альтернативы. Например, вместо скрытого API для управления энергопотреблением используйте PowerManager.WakeLock или JobScheduler.
  4. Для системных/предустановленных приложений (прошивки) некоторые API доступны, но их использование требует специальной подписи и согласования с производителем устройства.

Итог: Использование запрещенных API — прямой путь к блокировке приложения в Google Play, его нестабильной работе на разных устройствах и версиях Android, а также к потенциальным уязвимостям. Всегда придерживайтесь публичного SDK и рекомендуемых практик разработки.