Skip to content

Comments

fix(xsmscode): add Android 16 (SDK 36) PermissionManagerService hook#70

Merged
magisk317 merged 3 commits intomagisk317:devfrom
bcrtvkcs:dev
Feb 19, 2026
Merged

fix(xsmscode): add Android 16 (SDK 36) PermissionManagerService hook#70
magisk317 merged 3 commits intomagisk317:devfrom
bcrtvkcs:dev

Conversation

@bcrtvkcs
Copy link

@bcrtvkcs bcrtvkcs commented Feb 18, 2026

PermissionManagerServiceImpl was removed in Android 16 QPR2. The implementation was merged into PermissionManagerService which now extends IPermissionManager.Stub directly. This caused ClassNotFoundException in XSmsCode's PermissionManagerServiceHook34.

Changes:

  • New PermissionManagerServiceHook36.kt: hooks onSystemReady() and onPackageInstalled() to grant permissions via grantRuntimePermission() with the new persistentDeviceId parameter
  • Updated PermissionGranterHook.kt: routes SDK 36+ to the new hook

Summary by Sourcery

为 Android 16(SDK 36)添加专用的权限管理器 Hook,并将新设备路由到该 Hook,以保持自动授予权限的行为。

Bug 修复:

  • 通过用基于 PermissionManagerService 的 Hook 替换已被移除的 PermissionManagerServiceImpl Hook,防止在 Android 16+ 上出现 ClassNotFoundException

增强功能:

  • 通过 Hook PermissionManagerService 的生命周期方法,在 Android 16+ 上为目标应用授予权限,涵盖开机阶段和安装后的两种场景。
Original summary in English

Summary by Sourcery

Add a dedicated permission manager hook for Android 16 (SDK 36) and route new devices to it to maintain automatic permission granting.

Bug Fixes:

  • Prevent ClassNotFoundException on Android 16+ by replacing the removed PermissionManagerServiceImpl hook with a PermissionManagerService-based hook.

Enhancements:

  • Grant target app permissions on Android 16+ by hooking PermissionManagerService lifecycle methods for both boot-time and post-install scenarios.

@sourcery-ai
Copy link

sourcery-ai bot commented Feb 18, 2026

Reviewer's Guide

为 Android 16(SDK 36+)新增一个 PermissionManagerService hook 实现,并将权限授予分发器接入该实现;在框架移除 PermissionManagerServiceImpl 之后,仍能确保在运行时正确授予权限。

Android 16 中通过 PermissionManagerServiceHook36 在安装应用时授予权限的时序图

sequenceDiagram
    participant SystemServer
    participant PermissionManagerService as PMS
    participant XposedFramework as Xposed
    participant PermissionManagerServiceHook36 as Hook36
    participant PackageManagerInternal as PMInt
    participant App

    SystemServer->>PMS: onPackageInstalled(AndroidPackage pkg, ... , int userId)
    PMS->>Xposed: invoke hooked onPackageInstalled
    Xposed->>Hook36: after(param)
    Hook36->>Hook36: afterOnPackageInstalled(param)
    Hook36->>Hook36: resolve packageName from pkg
    Hook36->>Hook36: lookup permissions from PACKAGE_PERMISSIONS
    alt userId == USER_ALL
        Hook36->>PMS: get mPackageManagerInt
        PMS-->>Hook36: PMInt
        Hook36->>PMInt: getUsers(true)
        PMInt-->>Hook36: IntArray userIds
    else specific user
        Hook36->>Hook36: create IntArray with userId
    end
    loop for each userId and permission
        Hook36->>PMS: get mPermissionManagerServiceImpl
        PMS-->>Hook36: impl or PMS
        Hook36->>impl: grantRuntimePermission(packageName, permission, PERSISTENT_DEVICE_ID_DEFAULT, userId)
        impl-->>Hook36: result or exception
    end
    Hook36-->>Xposed: after hook completes
    PMS-->>SystemServer: onPackageInstalled returns
Loading

Android 16 中通过 onSystemReady hook 在开机阶段授予权限的时序图

sequenceDiagram
    participant SystemServer
    participant PermissionManagerService as PMS
    participant XposedFramework as Xposed
    participant PermissionManagerServiceHook36 as Hook36
    participant PackageManagerInternal as PMInt

    SystemServer->>PMS: onSystemReady()
    PMS->>Xposed: invoke hooked onSystemReady
    Xposed->>Hook36: after(param)
    Hook36->>Hook36: grantAllTargetPermissions(pms)
    Hook36->>PMS: get mPackageManagerInt
    PMS-->>Hook36: PMInt
    Hook36->>PMInt: getUsers(true)
    PMInt-->>Hook36: IntArray userIds (or failure -> default 0)
    loop for each (packageName, permissions) in PACKAGE_PERMISSIONS
        loop for each userId
            loop for each permission
                Hook36->>PMS: get mPermissionManagerServiceImpl
                PMS-->>Hook36: impl or PMS
                Hook36->>impl: grantRuntimePermission(packageName, permission, PERSISTENT_DEVICE_ID_DEFAULT, userId)
                impl-->>Hook36: result or exception
            end
        end
    end
    Hook36-->>Xposed: after hook completes
    PMS-->>SystemServer: onSystemReady returns
Loading

新增 Android 16 PermissionManagerServiceHook36 以及更新后 PermissionGranterHook 的类图

classDiagram
    class BaseHook
    class BaseSubHook{
        -ClassLoader mClassLoader
        +startHook()
    }
    class MethodHookWrapper{
        +before(param)
        +after(param)
    }

    class PermissionGranterHook{
        +startHook()
    }

    class PermissionManagerServiceHook34{
        +PermissionManagerServiceHook34(classLoader)
        +startHook()
    }

    class PermissionManagerServiceHook36{
        -ClassLoader mClassLoader
        +PermissionManagerServiceHook36(classLoader)
        +startHook()
        -hookOnSystemReady()
        -hookOnPackageInstalled()
        -grantAllTargetPermissions(pms)
        -afterOnPackageInstalled(param)
        -grantPermissionsForPackage(pms, packageName, permissions, userId)
        -getAllUserIds(pms)
        <<companion>>
        -CLASS_PMS : String
        -CLASS_ANDROID_PACKAGE : String
        -PERSISTENT_DEVICE_ID_DEFAULT : String
    }

    BaseHook <|-- PermissionGranterHook
    BaseSubHook <|-- PermissionManagerServiceHook34
    BaseSubHook <|-- PermissionManagerServiceHook36

    PermissionManagerServiceHook36 ..> MethodHookWrapper : uses

    class AndroidBuild{
        +SDK_INT : Int
    }

    PermissionGranterHook ..> PermissionManagerServiceHook34 : creates
    PermissionGranterHook ..> PermissionManagerServiceHook36 : creates
    PermissionGranterHook ..> AndroidBuild : reads_SDK_INT
Loading

File-Level Changes

Change Details Files
将 SDK 36+ 设备从中心权限授予入口路由到新的 PermissionManagerService hook 实现。
  • PermissionGranterHook 中扩展 SDK 版本分发逻辑,在现有 UPSIDE_DOWN_CAKE 处理之前先检查 SDK_INT >= 36
  • 对于 SDK 36+,实例化并启动新的 PermissionManagerServiceHook36,而不是复用 Android 14+ 的 hook。
app/src/main/java/com/tianma/xsmscode/xp/hook/permission/PermissionGranterHook.kt
引入 PermissionManagerServiceHook36,对 Android 16 的 PermissionManagerService 生命周期事件进行 hook,并通过新的 grantRuntimePermission 方法签名授予运行时权限。
  • PermissionManagerServiceHook36 定义为一个 BaseSubHook,在 PermissionManagerService 上 hook onSystemReadyonPackageInstalled
  • 实现 onSystemReady hook,遍历已配置的 PACKAGE_PERMISSIONS,通过 mPermissionManagerServiceImpl(若可用)调用 grantRuntimePermission 为所有用户授予权限。
  • 实现 onPackageInstalled hook,用于检测目标包的安装/更新,解析受影响的用户 ID(包括 USER_ALL),并按配置授予对应权限。
  • 将权限授予逻辑适配到 Android 16 的 grantRuntimePermission(packageName, permName, persistentDeviceId, userId) 方法签名,并使用硬编码的 persistentDeviceId 默认值。
  • 通过 mPackageManagerInt.getUsers(true) 使用 PackageManagerInternal 获取所有用户 ID,如果发现失败则回退到用户 0。
  • 在反射查找和权限授予周围添加防御性日志和异常处理,以避免在 API 或字段缺失时导致崩溃。
app/src/main/java/com/tianma/xsmscode/xp/hook/permission/PermissionManagerServiceHook36.kt

Tips and commands

Interacting with Sourcery

  • 触发新的代码审查: 在 Pull Request 中评论 @sourcery-ai review
  • 继续讨论: 直接回复 Sourcery 的审查评论。
  • 从审查评论生成 GitHub Issue: 回复 Sourcery 的审查评论,请求创建 issue。你也可以在审查评论下回复 @sourcery-ai issue 来从该评论创建 issue。
  • 生成 Pull Request 标题: 在 Pull Request 标题的任意位置写上 @sourcery-ai 即可随时生成标题。你也可以在 Pull Request 中评论 @sourcery-ai title 来(重新)生成标题。
  • 生成 Pull Request 摘要: 在 Pull Request 正文的任意位置写上 @sourcery-ai summary,即可在该位置生成 PR 摘要。你也可以在 Pull Request 中评论 @sourcery-ai summary 来(重新)生成摘要。
  • 生成审查指南: 在 Pull Request 中评论 @sourcery-ai guide,即可在任意时间(重新)生成审查指南。
  • 一次性解决所有 Sourcery 评论: 在 Pull Request 中评论 @sourcery-ai resolve 来将所有 Sourcery 评论标记为已解决。如果你已经处理完所有评论且不想再看到它们,这会非常有用。
  • 撤销所有 Sourcery 审查: 在 Pull Request 中评论 @sourcery-ai dismiss,以撤销所有现有的 Sourcery 审查。若你希望从一次全新的审查开始,这尤其有用——别忘了随后再评论 @sourcery-ai review 来触发新的审查!

Customizing Your Experience

访问你的 dashboard 以:

  • 启用或禁用诸如 Sourcery 生成的 Pull Request 摘要、审查指南等审查功能。
  • 更改审查语言。
  • 添加、移除或编辑自定义审查指令。
  • 调整其他审查相关设置。

Getting Help

Original review guide in English

Reviewer's Guide

Adds a new PermissionManagerService hook implementation for Android 16 (SDK 36+) and wires the permission granter dispatcher to use it, ensuring runtime permissions are granted correctly after framework changes removed PermissionManagerServiceImpl.

Sequence diagram for Android 16 package install permission granting via PermissionManagerServiceHook36

sequenceDiagram
    participant SystemServer
    participant PermissionManagerService as PMS
    participant XposedFramework as Xposed
    participant PermissionManagerServiceHook36 as Hook36
    participant PackageManagerInternal as PMInt
    participant App

    SystemServer->>PMS: onPackageInstalled(AndroidPackage pkg, ... , int userId)
    PMS->>Xposed: invoke hooked onPackageInstalled
    Xposed->>Hook36: after(param)
    Hook36->>Hook36: afterOnPackageInstalled(param)
    Hook36->>Hook36: resolve packageName from pkg
    Hook36->>Hook36: lookup permissions from PACKAGE_PERMISSIONS
    alt userId == USER_ALL
        Hook36->>PMS: get mPackageManagerInt
        PMS-->>Hook36: PMInt
        Hook36->>PMInt: getUsers(true)
        PMInt-->>Hook36: IntArray userIds
    else specific user
        Hook36->>Hook36: create IntArray with userId
    end
    loop for each userId and permission
        Hook36->>PMS: get mPermissionManagerServiceImpl
        PMS-->>Hook36: impl or PMS
        Hook36->>impl: grantRuntimePermission(packageName, permission, PERSISTENT_DEVICE_ID_DEFAULT, userId)
        impl-->>Hook36: result or exception
    end
    Hook36-->>Xposed: after hook completes
    PMS-->>SystemServer: onPackageInstalled returns
Loading

Sequence diagram for Android 16 boot-time permission granting via onSystemReady hook

sequenceDiagram
    participant SystemServer
    participant PermissionManagerService as PMS
    participant XposedFramework as Xposed
    participant PermissionManagerServiceHook36 as Hook36
    participant PackageManagerInternal as PMInt

    SystemServer->>PMS: onSystemReady()
    PMS->>Xposed: invoke hooked onSystemReady
    Xposed->>Hook36: after(param)
    Hook36->>Hook36: grantAllTargetPermissions(pms)
    Hook36->>PMS: get mPackageManagerInt
    PMS-->>Hook36: PMInt
    Hook36->>PMInt: getUsers(true)
    PMInt-->>Hook36: IntArray userIds (or failure -> default 0)
    loop for each (packageName, permissions) in PACKAGE_PERMISSIONS
        loop for each userId
            loop for each permission
                Hook36->>PMS: get mPermissionManagerServiceImpl
                PMS-->>Hook36: impl or PMS
                Hook36->>impl: grantRuntimePermission(packageName, permission, PERSISTENT_DEVICE_ID_DEFAULT, userId)
                impl-->>Hook36: result or exception
            end
        end
    end
    Hook36-->>Xposed: after hook completes
    PMS-->>SystemServer: onSystemReady returns
Loading

Class diagram for new Android 16 PermissionManagerServiceHook36 and updated PermissionGranterHook

classDiagram
    class BaseHook
    class BaseSubHook{
        -ClassLoader mClassLoader
        +startHook()
    }
    class MethodHookWrapper{
        +before(param)
        +after(param)
    }

    class PermissionGranterHook{
        +startHook()
    }

    class PermissionManagerServiceHook34{
        +PermissionManagerServiceHook34(classLoader)
        +startHook()
    }

    class PermissionManagerServiceHook36{
        -ClassLoader mClassLoader
        +PermissionManagerServiceHook36(classLoader)
        +startHook()
        -hookOnSystemReady()
        -hookOnPackageInstalled()
        -grantAllTargetPermissions(pms)
        -afterOnPackageInstalled(param)
        -grantPermissionsForPackage(pms, packageName, permissions, userId)
        -getAllUserIds(pms)
        <<companion>>
        -CLASS_PMS : String
        -CLASS_ANDROID_PACKAGE : String
        -PERSISTENT_DEVICE_ID_DEFAULT : String
    }

    BaseHook <|-- PermissionGranterHook
    BaseSubHook <|-- PermissionManagerServiceHook34
    BaseSubHook <|-- PermissionManagerServiceHook36

    PermissionManagerServiceHook36 ..> MethodHookWrapper : uses

    class AndroidBuild{
        +SDK_INT : Int
    }

    PermissionGranterHook ..> PermissionManagerServiceHook34 : creates
    PermissionGranterHook ..> PermissionManagerServiceHook36 : creates
    PermissionGranterHook ..> AndroidBuild : reads_SDK_INT
Loading

File-Level Changes

Change Details Files
Route SDK 36+ devices to a new PermissionManagerService hook implementation from the central permission granter entrypoint.
  • Extend the SDK version dispatch in PermissionGranterHook to check for SDK_INT >= 36 before existing UPSIDE_DOWN_CAKE handling.
  • Instantiate and start the new PermissionManagerServiceHook36 for SDK 36+ instead of reusing the Android 14+ hook.
app/src/main/java/com/tianma/xsmscode/xp/hook/permission/PermissionGranterHook.kt
Introduce PermissionManagerServiceHook36 to hook Android 16 PermissionManagerService lifecycle events and grant runtime permissions using the new grantRuntimePermission signature.
  • Define PermissionManagerServiceHook36 as a BaseSubHook that hooks onSystemReady and onPackageInstalled on PermissionManagerService.
  • Implement onSystemReady hook to iterate through configured PACKAGE_PERMISSIONS and grant them for all users using grantRuntimePermission via mPermissionManagerServiceImpl when available.
  • Implement onPackageInstalled hook to detect installations/updates of target packages, resolve affected user IDs (including USER_ALL), and grant configured permissions accordingly.
  • Adapt permission granting to the Android 16 grantRuntimePermission(packageName, permName, persistentDeviceId, userId) signature using a hard-coded persistentDeviceId default value.
  • Use PackageManagerInternal via mPackageManagerInt.getUsers(true) to resolve all user IDs, with fallbacks to user 0 if discovery fails.
  • Add defensive logging and exception handling around reflection lookups and permission grants to avoid crashing when APIs or fields are missing.
app/src/main/java/com/tianma/xsmscode/xp/hook/permission/PermissionManagerServiceHook36.kt

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - 我发现了两个问题,并提供了一些整体层面的反馈:

  • afterOnPackageInstalled 钩子依赖 param.args[3] 一定是 rawUserId,这对方法签名的变更非常脆弱;建议更稳健地定位 userId 参数(例如,通过方法参数的类型/长度,或匹配已知重载)来避免在后续平台更新中出现索引错误。
  • getAllUserIds 假设 mPackageManagerInt.getUsers(true) 返回的是 IntArray,但在较新的 PackageManagerInternal 中通常返回的是用户对象;相比直接强转为 IntArray 并在失败时静默地回退到用户 0,更安全的做法是处理包含用户结构的 List/数组并从中提取 ID。
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The `afterOnPackageInstalled` hook relies on `param.args[3]` being the `rawUserId`, which is brittle against signature changes; consider locating the userId argument more defensively (e.g., by using the method’s parameter types/length or matching known overloads) to avoid mis-indexing on future platform updates.
- `getAllUserIds` assumes `mPackageManagerInt.getUsers(true)` returns an `IntArray`, but modern `PackageManagerInternal` typically returns user objects; it may be safer to handle `List`/array of user structures and extract their IDs rather than hard-casting to `IntArray` and silently falling back to user 0.

## Individual Comments

### Comment 1
<location> `app/src/main/java/com/tianma/xsmscode/xp/hook/permission/PermissionManagerServiceHook36.kt:35` </location>
<code_context>
+ */
+class PermissionManagerServiceHook36(classLoader: ClassLoader) : BaseSubHook(classLoader) {
+
+    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+    override fun startHook() {
+        try {
</code_context>

<issue_to_address>
**suggestion:** The @RequiresApi annotation doesn’t match the stated Android 16+/API 36 behavior.

The class targets Android 16+/API 36, but `@RequiresApi(Build.VERSION_CODES.TIRAMISU)` is API 33, which is misleading for tools and readers. Since the logic relies on reflection, the annotation isn’t strictly needed; consider removing it for now or updating it once an API 36 constant exists.

Suggested implementation:

```
class PermissionManagerServiceHook36(classLoader: ClassLoader) : BaseSubHook(classLoader) {

    override fun startHook() {

```

You may also want to remove the now-unused import for `androidx.annotation.RequiresApi` (and possibly `android.os.Build`) at the top of the file if they are only used here, to keep imports clean and avoid warnings.
</issue_to_address>

### Comment 2
<location> `app/src/main/java/com/tianma/xsmscode/xp/hook/permission/PermissionManagerServiceHook36.kt:129` </location>
<code_context>
+
+        val permissions = PACKAGE_PERMISSIONS[packageName] ?: return
+        // param.args[3] = rawUserId
+        val rawUserId = param.args[3] as Int
+        val pms = param.thisObject
+
</code_context>

<issue_to_address>
**issue (bug_risk):** Accessing param.args[3] assumes a stable onPackageInstalled signature and may be brittle.

This assumes `onPackageInstalled` will always have `package` at index 0 and `rawUserId` at index 3 with the same types. If the framework signature changes, this could become a `ClassCastException` or `ArrayIndexOutOfBoundsException`. Consider validating `args.size` and the type of `args[3]`, and logging a warning or safely returning when the layout doesn’t match.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
Original comment in English

Hey - I've found 2 issues, and left some high level feedback:

  • The afterOnPackageInstalled hook relies on param.args[3] being the rawUserId, which is brittle against signature changes; consider locating the userId argument more defensively (e.g., by using the method’s parameter types/length or matching known overloads) to avoid mis-indexing on future platform updates.
  • getAllUserIds assumes mPackageManagerInt.getUsers(true) returns an IntArray, but modern PackageManagerInternal typically returns user objects; it may be safer to handle List/array of user structures and extract their IDs rather than hard-casting to IntArray and silently falling back to user 0.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The `afterOnPackageInstalled` hook relies on `param.args[3]` being the `rawUserId`, which is brittle against signature changes; consider locating the userId argument more defensively (e.g., by using the method’s parameter types/length or matching known overloads) to avoid mis-indexing on future platform updates.
- `getAllUserIds` assumes `mPackageManagerInt.getUsers(true)` returns an `IntArray`, but modern `PackageManagerInternal` typically returns user objects; it may be safer to handle `List`/array of user structures and extract their IDs rather than hard-casting to `IntArray` and silently falling back to user 0.

## Individual Comments

### Comment 1
<location> `app/src/main/java/com/tianma/xsmscode/xp/hook/permission/PermissionManagerServiceHook36.kt:35` </location>
<code_context>
+ */
+class PermissionManagerServiceHook36(classLoader: ClassLoader) : BaseSubHook(classLoader) {
+
+    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+    override fun startHook() {
+        try {
</code_context>

<issue_to_address>
**suggestion:** The @RequiresApi annotation doesn’t match the stated Android 16+/API 36 behavior.

The class targets Android 16+/API 36, but `@RequiresApi(Build.VERSION_CODES.TIRAMISU)` is API 33, which is misleading for tools and readers. Since the logic relies on reflection, the annotation isn’t strictly needed; consider removing it for now or updating it once an API 36 constant exists.

Suggested implementation:

```
class PermissionManagerServiceHook36(classLoader: ClassLoader) : BaseSubHook(classLoader) {

    override fun startHook() {

```

You may also want to remove the now-unused import for `androidx.annotation.RequiresApi` (and possibly `android.os.Build`) at the top of the file if they are only used here, to keep imports clean and avoid warnings.
</issue_to_address>

### Comment 2
<location> `app/src/main/java/com/tianma/xsmscode/xp/hook/permission/PermissionManagerServiceHook36.kt:129` </location>
<code_context>
+
+        val permissions = PACKAGE_PERMISSIONS[packageName] ?: return
+        // param.args[3] = rawUserId
+        val rawUserId = param.args[3] as Int
+        val pms = param.thisObject
+
</code_context>

<issue_to_address>
**issue (bug_risk):** Accessing param.args[3] assumes a stable onPackageInstalled signature and may be brittle.

This assumes `onPackageInstalled` will always have `package` at index 0 and `rawUserId` at index 3 with the same types. If the framework signature changes, this could become a `ClassCastException` or `ArrayIndexOutOfBoundsException`. Consider validating `args.size` and the type of `args[3]`, and logging a warning or safely returning when the layout doesn’t match.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@magisk317
Copy link
Owner

ci build报错,需要修复

- Fix unresolved USER_ALL reference in PermissionManagerServiceHook36
- Fix magic number in PermissionGranterHook
- Improve argument validation in onPackageInstalled
- Handle List<UserInfo> return type in getAllUserIds
- Remove incorrect @RequiresApi annotation
@magisk317 magisk317 merged commit 21883db into magisk317:dev Feb 19, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants