145 lines
7.9 KiB
XML
145 lines
7.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||
xmlns:tools="http://schemas.android.com/tools">
|
||
|
||
<uses-permission android:name="android.permission.INTERNET" />
|
||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
|
||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
|
||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||
<!-- Shizuku v12+: BinderSender проверяет requestedPermissions на наличие
|
||
этого permission (см. moe.shizuku.server.BinderSender.sendBinder).
|
||
Старое moe.shizuku.permission.SHIZUKU (Shizuku v11) больше не работает. -->
|
||
<uses-permission android:name="moe.shizuku.manager.permission.API_V23" />
|
||
|
||
<uses-feature
|
||
android:glEsVersion="0x00020000"
|
||
android:required="true" />
|
||
<uses-feature
|
||
android:name="android.hardware.type.embedded"
|
||
android:required="true" />
|
||
|
||
<!-- Android 11+ package visibility:
|
||
- Shizuku API выполняет context.bindService на сервис внутри пакета
|
||
moe.shizuku.privileged.api; без явного queries bindService возвращает false
|
||
и binder к нам никогда не приедет.
|
||
- queryIntentActivities(MAIN+LAUNCHER) без intent-queries возвращает только
|
||
системные/RayNeo приложения; для всех сторонних (free.zona и т.п.)
|
||
нужен явный <intent> с ACTION_MAIN + CATEGORY_LAUNCHER. -->
|
||
<queries>
|
||
<package android:name="moe.shizuku.privileged.api" />
|
||
<intent>
|
||
<action android:name="rikka.shizuku.intent.action.REQUEST_BINDER" />
|
||
</intent>
|
||
<intent>
|
||
<action android:name="android.intent.action.MAIN" />
|
||
<category android:name="android.intent.category.LAUNCHER" />
|
||
</intent>
|
||
</queries>
|
||
|
||
<application
|
||
android:name=".GlassesVmApp"
|
||
android:label="@string/app_name"
|
||
android:allowBackup="false"
|
||
android:theme="@style/Theme.RayNeoVm"
|
||
android:supportsRtl="true"
|
||
tools:targetApi="36">
|
||
|
||
<!-- MainActivity — заодно HOME-кандидат: на этих очках BOOT_COMPLETED
|
||
ненадёжен, а домашний экран система поднимает всегда.
|
||
Дефолтным его не назначаем — это делается отдельно
|
||
(`cmd package set-home-activity`), по явной команде. -->
|
||
<activity
|
||
android:name=".MainActivity"
|
||
android:exported="true"
|
||
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|density|keyboardHidden|navigation|mcc|mnc"
|
||
android:launchMode="singleTask"
|
||
android:stateNotNeeded="true"
|
||
android:clearTaskOnLaunch="true"
|
||
android:theme="@style/Theme.RayNeoVm">
|
||
<intent-filter>
|
||
<action android:name="android.intent.action.MAIN" />
|
||
<category android:name="android.intent.category.LAUNCHER" />
|
||
</intent-filter>
|
||
<intent-filter>
|
||
<action android:name="android.intent.action.MAIN" />
|
||
<category android:name="android.intent.category.HOME" />
|
||
<category android:name="android.intent.category.DEFAULT" />
|
||
</intent-filter>
|
||
</activity>
|
||
|
||
<!-- Foreground service: WebSocket server + mDNS + захват аудио (задача #2) -->
|
||
<service
|
||
android:name=".VmService"
|
||
android:exported="false"
|
||
android:foregroundServiceType="mediaPlayback|mediaProjection" />
|
||
|
||
<!-- Пассивный Accessibility-сервис (задача #5): живучесть процесса +
|
||
легальный запуск Activity из фона. Ничего не читает и не инжектит.
|
||
Активируется вручную: Настройки → Специальные возможности → RayNeo VM. -->
|
||
<service
|
||
android:name=".VmAccessibilityService"
|
||
android:exported="true"
|
||
android:label="@string/app_name"
|
||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
||
<intent-filter>
|
||
<action android:name="android.accessibilityservice.AccessibilityService" />
|
||
</intent-filter>
|
||
<meta-data
|
||
android:name="android.accessibilityservice"
|
||
android:resource="@xml/vm_accessibility_service" />
|
||
</service>
|
||
|
||
<!-- 4.1: системный IME-заглушка. Нулевой UI; назначается дефолтным через Shizuku
|
||
(settings put secure default_input_method). Обратно НЕ возвращаем. -->
|
||
<service
|
||
android:name=".VmNoopImeService"
|
||
android:exported="true"
|
||
android:label="@string/app_name">
|
||
<intent-filter>
|
||
<action android:name="android.view.InputMethod" />
|
||
</intent-filter>
|
||
<meta-data
|
||
android:name="android.view.im"
|
||
android:resource="@xml/vm_noop_ime_method" />
|
||
</service>
|
||
|
||
<!-- VmShizukuService НЕ объявляется здесь как <service> — это Shizuku UserService,
|
||
который ServiceStarter создаёт через reflection в отдельном isolated-процессе.
|
||
Если объявить — Shizuku-сервер не сможет привести класс к IBinder
|
||
(ClassCastException в moe.shizuku.starter.ServiceStarter). -->
|
||
|
||
<!-- Shizuku v12+ требует ShizukuProvider в манифесте — он сам вытаскивает binder
|
||
через ContentProvider IPC и инициализирует Shizuku-клиент. Без него binder не придёт.
|
||
permission=INTERACT_ACROSS_USERS_FULL защищает провайдер от обычных приложений. -->
|
||
<provider
|
||
android:name="rikka.shizuku.ShizukuProvider"
|
||
android:authorities="${applicationId}.shizuku"
|
||
android:multiprocess="false"
|
||
android:enabled="true"
|
||
android:exported="true"
|
||
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
|
||
|
||
<!-- Отладочный приёмник (защищён DUMP): тестовый тон для проверки аудио-тракта. -->
|
||
<receiver
|
||
android:name=".debug.GlassesDebugReceiver"
|
||
android:exported="true"
|
||
android:permission="android.permission.DUMP">
|
||
<intent-filter>
|
||
<action android:name="pw.binom.rayneovm.glasses.DEBUG_TEST_TONE" />
|
||
<action android:name="pw.binom.rayneovm.glasses.DEBUG_AUDIO_PIPE" />
|
||
<action android:name="pw.binom.rayneovm.glasses.DEBUG_AUDIO_PHONE" />
|
||
<action android:name="pw.binom.rayneovm.glasses.DEBUG_AUDIO_STOP" />
|
||
<action android:name="pw.binom.rayneovm.glasses.DEBUG_STOP_TONE" />
|
||
</intent-filter>
|
||
</receiver>
|
||
|
||
<meta-data android:name="com.rayneo.mercury.app" android:value="true" />
|
||
</application>
|
||
</manifest>
|