From ede7d165a4b93da8117546b792c5282b968e26d2 Mon Sep 17 00:00:00 2001 From: huker Date: Wed, 7 Oct 2026 00:46:54 +0300 Subject: [PATCH] =?UTF-8?q?init=20comm=D0=B8=D1=82=D1=8C=D1=8C=D0=B8=D1=8C?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 16 +++ README-RU.md | 114 +++++++++++++++ README.md | 113 +++++++++++++++ module/action.sh | 40 ++++++ module/customize.sh | 12 ++ module/esimd-manual.sh | 57 ++++++++ module/esimd.sh | 132 ++++++++++++++++++ module/module.prop | 6 + module/post-fs-data.sh | 37 +++++ .../android.hardware.telephony.satellite.xml | 4 + module/product/overlay/EuiccSlotsFix.apk | Bin 0 -> 8528 bytes module/service.sh | 10 ++ 12 files changed, 541 insertions(+) create mode 100644 .gitignore create mode 100644 README-RU.md create mode 100644 README.md create mode 100644 module/action.sh create mode 100644 module/customize.sh create mode 100644 module/esimd-manual.sh create mode 100644 module/esimd.sh create mode 100644 module/module.prop create mode 100644 module/post-fs-data.sh create mode 100644 module/product/etc/permissions/android.hardware.telephony.satellite.xml create mode 100644 module/product/overlay/EuiccSlotsFix.apk create mode 100644 module/service.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b1c1c0f --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# Build artifacts / release archives +*.zip +*.apk +!module/**/*.apk + +# OS / editor junk +.DS_Store +Thumbs.db +*~ +.idea/ +.vscode/ +*.swp + +# Logs / temp +*.log +*.tmp diff --git a/README-RU.md b/README-RU.md new file mode 100644 index 0000000..3429362 --- /dev/null +++ b/README-RU.md @@ -0,0 +1,114 @@ +# eSIM Slots Fix — OnePlus 15R (macan) + +Сделано с ебучим квеном 3.8 максим. + +Полноценная поддержка eSIM для **OnePlus 15R (macan / CPH2767)** на портах LineageOS (Android 16). + +--- + +## Проблема + +Порты AOSP для OnePlus 15R поставляются с неработающей eSIM, хотя железо (чип eUICC) и вендорные HAL Oplus полностью присутствуют: + +1. **В настройках нет страницы eSIM.** AOSP `EuiccManager` включает интерфейс встроенной SIM, только если слот объявлен как несъёмный eUICC. Стоковая прошивка Oplus передаёт это в рантайме; порты AOSP — нет. +2. **Чип eUICC не получает питание при загрузке.** На ColorOS/OxygenOS проприетарные сервисы Oplus выполняют последовательность включения (`setUimPower` / `setEsimStatus` / `setEsimGpio`) через вендорный HAL eSIM. В портах AOSP этих сервисов нет, и чип остаётся выключенным. +3. **RIL не считает слот 1 eUICC-слотом.** Qualcomm RIL ждёт специфичную для Oplus конфигурацию `SET_SIM_TYPE` после загрузки; без неё модем игнорирует встроенный слот. + +## Что делает модуль + +| Компонент | Файл | Назначение | +|---|---|---| +| RRO-оверлей | `product/overlay/EuiccSlotsFix.apk` | Переопределяет `config_non_removable_euicc_slots` в `[1]`, чтобы Настройки и EuiccManager показали eSIM | +| Демон активации | `esimd.sh` | Питает eUICC во время бутанимации и ведёт всю последовательность активации RIL | +| Ручной цикл | `esimd-manual.sh` | Одноразовая активация с живым прогрессом | +| Кнопка в KSU | `action.sh` | Кнопка действия модуля в KernelSU Manager: статус + ручная активация | +| Watchdog | `service.sh` | Перезапускает демон, если он умер | +| Хук загрузки | `post-fs-data.sh` | Монтирует RRO-оверлей (tmpfs) и рано запускает демон | + +### Фазы демона + +- **Фаза A (бутанимация):** ждёт появления `vendor.oplus.hardware.esim.IOplusEsim/default`, затем подаёт питание на eUICC через HAL Oplus. Чип жив ещё до окончания загрузки Android — тот же тайминг, что на стоке. +- **Фаза B (радио поднялось):** ждёт сервис `phone`, даёт RIL до 60 с самостоятельно обнаружить eUICC. Если не обнаружен — до 6 попыток активации: `SET_SIM_TYPE [1,1]` → рестарт qcrild → ожидание ресинка RIL (`Received GET_SIM_TYPE_INFO`) → `SET_SIM_TYPE [1,2]` → ожидание определения карты. +- **Фаза C (постоянный монитор):** каждые 30 с проверяет наличие eSIM. Два подряд сбоя — автоматическая реактивация. eSIM восстанавливается без участия пользователя. + +## Технические детали + +### Последовательность питания eUICC (вендорные HAL Oplus) + +``` +vendor.oplus.hardware.esim.IOplusEsim/default + tx 1 = getEsimGpio + tx 3 = setEsimGpio(1) + tx 5 = setUimPower(0|1) + +vendor.oplus.hardware.subsys_interface.subsys_radio.ISubsysRadio/slot1 + tx 289 = setEsimStatus(91, 1) + +Порядок: setUimPower(0) -> setEsimStatus(91,1) -> setEsimGpio(1) -> setUimPower(1) +Контрольное чтение GPIO должно вернуть 00000001 +``` + +### SET_SIM_TYPE (транзакция 175 ITelephony) + +``` +service call phone 175 \ + i32 2 i32 1 i32 0 i32 0 i32 0 i32 1 i32 1 i32 0 i32 1 i32 1 i32 + +T = 1 только физические слоты (сбрасывает RIL) +T = 2 физический + eUICC (финальная конфигурация) +``` + +Порядок `[1,1] → рестарт qcrild → [1,2]` обязателен: модем применяет тип +eUICC-слота только после чистой реинициализации RIL. + +### Маркеры успеха + +- radio logcat: `Received GET_SIM_TYPE_INFO` (RIL ресинкнулся) +- radio logcat: `[1] recv card status:3` (карта eUICC отвечает) +- `dumpsys isub`: активная подписка с `simSlotIndex=1 portIndex=0 isEmbedded=1` + +## Требования + +- OnePlus 15R (macan, CPH2767), порт LineageOS на Android 16 +- KernelSU (проверено на KSU 3.3.0 с SUSfs) +- Вендорный образ Oplus с рабочими HAL `esim` и `subsys_radio` +- Хотя бы один eSIM-профиль, загруженный в eUICC (проверено с MTS BY; переключение профилей MTS BY ⇄ Roamless работает) + +> Примечание: в KernelSU 3.x нет magic mount, поэтому RRO разворачивается +> tmpfs-биндом поверх `/product/overlay` в `post-fs-data.sh`, а не папкой `system/`. + +## Использование + +- **Автоматически:** делать ничего не нужно. eUICC запитывается во время бутанимации, eSIM регистрируется через ~20–30 с после загрузки. +- **Вручную:** KernelSU → Модули → *eSIM Slots Fix* → кнопка действия. Показывает текущий статус, выполняет полный цикл активации с живым прогрессом, выводит результат и последние строки лога. + +## Логи + +- `/data/adb/euicc_daemon.log` — активность демона, ручные циклы, события монитора (автообрезка на 256 КБ) +- `/data/adb/esimd.pid` — PID демона + +## Ограничения + +- В устройстве **один чип eUICC**: одновременно активен только один eSIM-профиль. Одновременные два eSIM (MEP) не поддерживаются конфигурацией модема — поведение такое же, как на стоковой прошивке. +- Физическая nano-SIM + eSIM работают одновременно (DSDS, 2 активные подписки). +- Дополнительные bundled-правки, не связанные с eSIM: флаг поддержки спутниковой телефонии и override idle-таймера SurfaceFlinger (анти-мерцание для LTPO-панелей). + +## Структура проекта + +``` +EuiccSlotsFix/ +├── README.md английский readme +├── README-RU.md этот файл +└── module/ + ├── module.prop + ├── customize.sh + ├── post-fs-data.sh + ├── service.sh + ├── action.sh + ├── esimd.sh + ├── esimd-manual.sh + └── product/ + ├── overlay/EuiccSlotsFix.apk + └── etc/permissions/android.hardware.telephony.satellite.xml +``` + diff --git a/README.md b/README.md new file mode 100644 index 0000000..a343776 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +# eSIM Slots Fix — OnePlus 15R (macan) + +Built with Qwen3.8 Max!1!1!1!11 + +Full eSIM support for **OnePlus 15R (macan / CPH2767)** running LineageOS-based Android 16 ports. + +--- + +## The Problem + +AOSP-based ports for OnePlus 15R ship without working eSIM, even though the hardware (eUICC chip) and Oplus vendor HALs are fully present: + +1. **Settings does not show the eSIM page.** AOSP `EuiccManager` only enables the embedded SIM UI when a slot is reported as a non-removable eUICC. The Oplus stock framework injects this at runtime; AOSP ports do not. +2. **The eUICC chip is never powered on at boot.** On ColorOS/OxygenOS, proprietary Oplus framework services run the power-up sequence (`setUimPower` / `setEsimStatus` / `setEsimGpio`) through the vendor eSIM HAL. Those services do not exist on AOSP ports, so the chip stays dead. +3. **The RIL does not treat slot 1 as an eUICC.** Qualcomm RIL expects an Oplus-specific `SET_SIM_TYPE` configuration push after boot; without it the modem ignores the embedded slot. + +## What This Module Does + +| Component | File | Purpose | +|---|---|---| +| RRO overlay | `product/overlay/EuiccSlotsFix.apk` | Overrides `config_non_removable_euicc_slots` to `[1]` so Settings and EuiccManager expose the eSIM UI | +| Activation daemon | `esimd.sh` | Powers the eUICC during boot animation and drives the full RIL activation sequence | +| Manual cycle | `esimd-manual.sh` | One-shot activation with live progress output | +| KSU action button | `action.sh` | Module action in KernelSU Manager: status + manual activation | +| Watchdog | `service.sh` | Respawns the daemon if it dies | +| Boot hook | `post-fs-data.sh` | Mounts the RRO overlay (tmpfs) and starts the daemon early | + +### Daemon phases + +- **Phase A (boot animation):** waits for `vendor.oplus.hardware.esim.IOplusEsim/default`, then powers the eUICC via the Oplus HAL power sequence. The chip is alive before Android finishes booting — the same timing as stock firmware. +- **Phase B (radio up):** waits for the `phone` service, gives the RIL up to 60 s to detect the eUICC on its own. If not detected, runs up to 6 activation attempts: `SET_SIM_TYPE [1,1]` → qcrild restart → wait for RIL re-sync (`Received GET_SIM_TYPE_INFO`) → `SET_SIM_TYPE [1,2]` → wait for card detection. +- **Phase C (runtime monitor):** checks eSIM presence every 30 s forever. Two consecutive failures trigger automatic re-activation. The eSIM comes back without user interaction. + +## Technical Details + +### eUICC power sequence (Oplus vendor HALs) + +``` +vendor.oplus.hardware.esim.IOplusEsim/default + tx 1 = getEsimGpio + tx 3 = setEsimGpio(1) + tx 5 = setUimPower(0|1) + +vendor.oplus.hardware.subsys_interface.subsys_radio.ISubsysRadio/slot1 + tx 289 = setEsimStatus(91, 1) + +Order: setUimPower(0) -> setEsimStatus(91,1) -> setEsimGpio(1) -> setUimPower(1) +GPIO readback must return 00000001 +``` + +### SET_SIM_TYPE (ITelephony transaction 175) + +``` +service call phone 175 \ + i32 2 i32 1 i32 0 i32 0 i32 0 i32 1 i32 1 i32 0 i32 1 i32 1 i32 + +T = 1 physical-only slot map (forces RIL reset) +T = 2 physical + eUICC (final configuration) +``` + +The `[1,1] → qcrild restart → [1,2]` order is required: the modem applies the +eUICC slot type only after a clean RIL re-initialization. + +### Success markers + +- radio logcat: `Received GET_SIM_TYPE_INFO` (RIL re-synced) +- radio logcat: `[1] recv card status:3` (eUICC card responding) +- `dumpsys isub`: active subscription with `simSlotIndex=1 portIndex=0 isEmbedded=1` + +## Requirements + +- OnePlus 15R (macan, CPH2767), LineageOS-based Android 16 port +- KernelSU (tested on KSU 3.3.0 with SUSfs) +- Oplus vendor image with working `esim` and `subsys_radio` HALs +- At least one eSIM profile downloaded to the eUICC (tested with MTS BY; profile switching MTS BY ⇄ Roamless works) + +> Note: KernelSU 3.x has no magic mount, so the RRO is deployed with a tmpfs +> bind over `/product/overlay` in `post-fs-data.sh` instead of a `system/` dir. + +## Usage + +- **Automatic:** nothing to do. eUICC powers during boot animation, eSIM registers ~20–30 s after boot. +- **Manual:** KernelSU → Modules → *eSIM Slots Fix* → action button. Shows current status, runs the full activation cycle with live progress, prints the result and recent log lines. + +## Logs + +- `/data/adb/euicc_daemon.log` — daemon activity, manual cycles, monitor events (auto-truncated at 256 KB) +- `/data/adb/esimd.pid` — daemon PID + +## Limitations + +- The device has a **single eUICC chip**: only one eSIM profile can be active at a time. Simultaneous dual-eSIM (MEP) is not supported by the modem configuration — same behavior as stock firmware. +- Physical nano-SIM + eSIM work simultaneously (DSDS, 2 active subscriptions). +- Bundled extras unrelated to eSIM: satellite telephony feature flag and a SurfaceFlinger idle-timer override (anti-flicker for LTPO panels). + +## Project Layout + +``` +EuiccSlotsFix/ +├── README.md this file +├── README-RU.md Russian readme +└── module/ + ├── module.prop + ├── customize.sh + ├── post-fs-data.sh + ├── service.sh + ├── action.sh + ├── esimd.sh + ├── esimd-manual.sh + └── product/ + ├── overlay/EuiccSlotsFix.apk + └── etc/permissions/android.hardware.telephony.satellite.xml +``` diff --git a/module/action.sh b/module/action.sh new file mode 100644 index 0000000..132ebf7 --- /dev/null +++ b/module/action.sh @@ -0,0 +1,40 @@ +#!/system/bin/sh +LOG=/data/adb/euicc_daemon.log +ESIM_SVC="vendor.oplus.hardware.esim.IOplusEsim/default" + +gpio_st() { + service call "$ESIM_SVC" 1 2>/dev/null | grep -oE '[0-9a-f]{8} [0-9a-f]{8}' | head -1 | awk '{print $2}' +} + +status() { + G=$(gpio_st) + D=$(dumpsys isub 2>/dev/null | grep -c 'simSlotIndex=1 portIndex=0 isEmbedded=1') + N=$(dumpsys isub 2>/dev/null | grep 'simSlotIndex=1 ' | grep -oE 'displayName=[^ ]+' | head -1) + if [ "$G" = "00000001" ]; then + echo "eUICC power : ON" + else + echo "eUICC power : OFF ($G)" + fi + if [ "${D:-0}" -ge 1 ]; then + echo "eSIM in slot: YES $N" + else + echo "eSIM in slot: NO" + fi +} + +echo "=== eSIM Fix ===" +status +echo +echo "Running activation cycle (~1-2 min)..." +echo +sh /data/adb/modules/euicc_slots_fix/esimd-manual.sh +echo +echo "=== Result ===" +status +echo +echo "Log:" +tail -8 "$LOG" 2>/dev/null + +if [[ -z "$MMRL" ]] && ([[ -n "$KSU" ]] || [[ -n "$APATCH" ]]); then + sleep 10 +fi diff --git a/module/customize.sh b/module/customize.sh new file mode 100644 index 0000000..1bb6033 --- /dev/null +++ b/module/customize.sh @@ -0,0 +1,12 @@ +ui_print "- eSIM Slots Fix v1.1" +ui_print "- by huker667" +ui_print "- OnePlus 15R (macan), LineageOS-based Android 16" + +set_perm_recursive "$MODPATH" 0 0 0755 0644 +set_perm "$MODPATH/post-fs-data.sh" 0 0 0755 +set_perm "$MODPATH/service.sh" 0 0 0755 +set_perm "$MODPATH/action.sh" 0 0 0755 +set_perm "$MODPATH/esimd.sh" 0 0 0755 +set_perm "$MODPATH/esimd-manual.sh" 0 0 0755 + +ui_print "- Done. Reboot to activate." diff --git a/module/esimd-manual.sh b/module/esimd-manual.sh new file mode 100644 index 0000000..fa6a9f8 --- /dev/null +++ b/module/esimd-manual.sh @@ -0,0 +1,57 @@ +#!/system/bin/sh +ESIM_SVC="vendor.oplus.hardware.esim.IOplusEsim/default" +SUB_SVC="vendor.oplus.hardware.subsys_interface.subsys_radio.ISubsysRadio/slot1" +LOG=/data/adb/euicc_daemon.log +M1="i32 2 i32 1 i32 0 i32 0 i32 0 i32 1 i32 1 i32 0 i32 1 i32 1 i32 1" +M2="i32 2 i32 1 i32 0 i32 0 i32 0 i32 1 i32 1 i32 0 i32 1 i32 1 i32 2" + +log() { + echo "$(date '+%F %T') [manual] $*" >> "$LOG" + echo "$*" +} + +gpio_state() { + service call "$ESIM_SVC" 1 2>/dev/null | grep -oE '[0-9a-f]{8} [0-9a-f]{8}' | head -1 | awk '{print $2}' +} + +detected() { + dumpsys isub 2>/dev/null | grep -c 'simSlotIndex=1 portIndex=0 isEmbedded=1' +} + +log "=== manual cycle start ===" + +service call "$ESIM_SVC" 5 i32 0 >/dev/null 2>&1 +service call "$SUB_SVC" 289 i32 91 i32 1 >/dev/null 2>&1 +service call "$ESIM_SVC" 3 i32 1 >/dev/null 2>&1 +service call "$ESIM_SVC" 5 i32 1 >/dev/null 2>&1 +sleep 1 +log "gpio=$(gpio_state)" + +logcat -c -b radio 2>/dev/null +service call phone 175 $M1 >/dev/null 2>&1 +sleep 2 +log "SET_SIM_TYPE[1,1] sent, restarting qcrild..." +setprop ctl.restart vendor.qcrild +setprop ctl.restart vendor.qcrild2 +t=0 +while [ $t -lt 40 ]; do + n=$(logcat -d -b radio 2>/dev/null | grep -c "Received GET_SIM_TYPE_INFO") + [ "${n:-0}" -ge 1 ] 2>/dev/null && break + sleep 1 + t=$((t+1)) +done +log "ril sync after ${t}s" +service call phone 175 $M2 >/dev/null 2>&1 +log "SET_SIM_TYPE[1,2] sent, waiting for eSIM detection..." + +p=0 +while [ $p -lt 15 ]; do + sleep 3 + p=$((p+1)) + d=$(detected) + [ "${d:-0}" -ge 1 ] 2>/dev/null && break +done +log "=== manual cycle done: detect=$(detected) ($((p * 3))s) ===" + +pgrep -f esimd.sh >/dev/null 2>&1 || setsid /system/bin/sh /data/adb/modules/euicc_slots_fix/esimd.sh >/dev/null 2>&1 > "$LOG"; } + +if [ -f "$LOG" ] && [ "$(wc -c < "$LOG" 2>/dev/null)" -gt 262144 ]; then + tail -c 65536 "$LOG" > "$LOG.tmp" && mv "$LOG.tmp" "$LOG" +fi + +gpio_state() { + service call "$ESIM_SVC" 1 2>/dev/null | grep -oE '[0-9a-f]{8} [0-9a-f]{8}' | head -1 | awk '{print $2}' +} + +gpio_on() { + service call "$ESIM_SVC" 5 i32 0 >/dev/null 2>&1 + service call "$SUB_SVC" 289 i32 91 i32 1 >/dev/null 2>&1 + service call "$ESIM_SVC" 3 i32 1 >/dev/null 2>&1 + service call "$ESIM_SVC" 5 i32 1 >/dev/null 2>&1 +} + +esim_detected() { + dumpsys isub 2>/dev/null | grep -c 'simSlotIndex=1 portIndex=0 isEmbedded=1' +} + +card_up() { + logcat -d -b radio 2>/dev/null | grep -cF "[1] recv card status:3" +} + +echo $$ > /data/adb/esimd.pid +log "=== esimd started pid=$$ ===" + +i=0 +while [ $i -lt 600 ]; do + service check "$ESIM_SVC" 2>/dev/null | grep -q ': found' && break + sleep 0.5 + i=$((i+1)) +done +log "phaseA: esim HAL ready after ~$((i/2))s" + +G=$(gpio_state) +if [ "$G" != "00000001" ]; then + j=0 + while [ $j -lt 10 ]; do + gpio_on + sleep 1 + G=$(gpio_state) + [ "$G" = "00000001" ] && break + j=$((j+1)) + done + log "phaseA: gpio powered, state=$G tries=$((j+1))" +else + log "phaseA: gpio already ON" +fi + +i=0 +while [ $i -lt 300 ]; do + service check phone 2>/dev/null | grep -q ': found' && break + sleep 1 + i=$((i+1)) +done +log "phaseB: phone service after ~${i}s" + +w=0 +while [ $w -lt 60 ]; do + [ "$(esim_detected)" -ge 1 ] 2>/dev/null && break + sleep 3 + w=$((w+3)) +done + +attempt=0 +while [ $attempt -lt 6 ]; do + D=$(esim_detected) + if [ "${D:-0}" -ge 1 ] 2>/dev/null; then + log "phaseB: eSIM UP (attempt $attempt, detect=$D card=$(card_up))" + break + fi + attempt=$((attempt+1)) + log "phaseB: attempt $attempt (detect=$D card=$(card_up))" + + G=$(gpio_state) + if [ "$G" != "00000001" ]; then + gpio_on + sleep 1 + fi + + logcat -c -b radio 2>/dev/null + service call phone 175 $M1 >/dev/null 2>&1 + sleep 2 + setprop ctl.restart vendor.qcrild + setprop ctl.restart vendor.qcrild2 + t=0 + while [ $t -lt 40 ]; do + n=$(logcat -d -b radio 2>/dev/null | grep -c "Received GET_SIM_TYPE_INFO") + [ "${n:-0}" -ge 1 ] 2>/dev/null && break + sleep 1 + t=$((t+1)) + done + service call phone 175 $M2 >/dev/null 2>&1 + p=0 + while [ $p -lt 12 ]; do + sleep 3 + p=$((p+1)) + [ "$(card_up)" -ge 1 ] 2>/dev/null && break + done +done +log "phaseB: done, detect=$(esim_detected) card=$(card_up)" + +fails=0 +while true; do + sleep 30 + if [ "$(esim_detected)" -ge 1 ] 2>/dev/null; then + fails=0 + else + fails=$((fails+1)) + log "monitor: eSIM not detected (fails=$fails)" + if [ $fails -ge 2 ]; then + log "monitor: reactivating" + gpio_on + sleep 1 + service call phone 175 $M1 >/dev/null 2>&1 + sleep 2 + setprop ctl.restart vendor.qcrild + sleep 10 + service call phone 175 $M2 >/dev/null 2>&1 + fails=0 + fi + fi +done diff --git a/module/module.prop b/module/module.prop new file mode 100644 index 0000000..f65ea32 --- /dev/null +++ b/module/module.prop @@ -0,0 +1,6 @@ +id=euicc_slots_fix +name=eSIM Slots Fix +version=v1.1 +versionCode=2 +author=huker667 +description=Full eSIM support for OnePlus 15R (macan) on LineageOS-based Android 16 ports. RRO for eUICC slot visibility, early boot activation daemon with auto-recovery, manual activation action button. diff --git a/module/post-fs-data.sh b/module/post-fs-data.sh new file mode 100644 index 0000000..bf90607 --- /dev/null +++ b/module/post-fs-data.sh @@ -0,0 +1,37 @@ +#!/system/bin/sh +MODDIR=${0%/*} + +TMP=/dev/euicc_overlay_tmp +SRC=/product/overlay +if [ -f "$MODDIR/product/overlay/EuiccSlotsFix.apk" ]; then + rm -rf "$TMP" 2>/dev/null + mkdir -p "$TMP" + cp -a "$SRC/." "$TMP/" 2>/dev/null + cp -a "$MODDIR/product/overlay/EuiccSlotsFix.apk" "$TMP/" 2>/dev/null + mount -t tmpfs -o mode=755 tmpfs "$SRC" + cp -a "$TMP/." "$SRC/" 2>/dev/null + chown -R root:root "$SRC" + chmod 755 "$SRC" + restorecon -R "$SRC" 2>/dev/null + rm -rf "$TMP" +fi + +PTMP=/dev/perm_tmp +PERM=/product/etc/permissions +if [ -f "$MODDIR/product/etc/permissions/android.hardware.telephony.satellite.xml" ]; then + rm -rf "$PTMP" 2>/dev/null + mkdir -p "$PTMP" + cp -a "$PERM/." "$PTMP/" 2>/dev/null + cp -a "$MODDIR/product/etc/permissions/android.hardware.telephony.satellite.xml" "$PTMP/" 2>/dev/null + mount -t tmpfs -o mode=755 tmpfs "$PERM" + cp -a "$PTMP/." "$PERM/" 2>/dev/null + chown -R root:root "$PERM" + chmod 755 "$PERM" + chmod 644 "$PERM"/*.xml 2>/dev/null + restorecon -R "$PERM" 2>/dev/null + rm -rf "$PTMP" +fi + +/data/adb/ksu/bin/resetprop ro.surface_flinger.set_idle_timer_ms 3000 + +setsid /system/bin/sh "$MODDIR/esimd.sh" >/dev/null 2>&1 + + + diff --git a/module/product/overlay/EuiccSlotsFix.apk b/module/product/overlay/EuiccSlotsFix.apk new file mode 100644 index 0000000000000000000000000000000000000000..d902bd24e3ffc7a49febb7ab12606faff81497f8 GIT binary patch literal 8528 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 literal 0 HcmV?d00001 diff --git a/module/service.sh b/module/service.sh new file mode 100644 index 0000000..a79769d --- /dev/null +++ b/module/service.sh @@ -0,0 +1,10 @@ +#!/system/bin/sh +until [ "$(getprop sys.boot_completed)" = "1" ]; do sleep 2; done +sleep 5 +while true; do + if ! pgrep -f esimd.sh >/dev/null 2>&1; then + echo "$(date) esimd not running, respawning" >> /data/adb/euicc_daemon.log + setsid /system/bin/sh /data/adb/modules/euicc_slots_fix/esimd.sh >/dev/null 2>&1