Migrate to YukiHookAPI 1.2.x

YukiHookAPI has undergone a lot of adjustments since version 1.2.0, you can read on to see what are the notes and new features.

Default Behavior Changes

Since version 1.2.0, the isUsingResourcesHook function in @InjectYukiHookWithXposed is no longer enabled by default, please enable it manually if necessary.

Notice

Resources Hook will be removed in version 2.0.0 and is now marked LegacyResourcesHook.

You can use @OptIn(LegacyResourcesHook::class) to eliminate the warning, continue to use version 1.x.x.

New API

YukiHookAPI introduced the New Hook Code Styleopen in new window (New API) of 2.0.0 in the 1.2.0 version, it is now in the experimental stage.

You can before the 2.0.0 version is officially released, start migrating and experience the New API.

Notice

All legacy APIs have been marked LegacyHookApi, you can use @OptIn(LegacyHookApi::class) to eliminate the warning and continue to use the legacy API.

For example, we want to Hook the test method in the com.example.Test class.

Legacy API

findClass("com.example.Test").hook {
    injectMember {
        method {
            name = "test"
        }
        beforeHook {
            // Your code here.
        }
        afterHook {
            // Your code here.
        }
    }
}

New API

"com.example.Test".toClass()
    .method {
        name = "test"
    }.hook {
        before {
            // Your code here.
        }
        after {
            // Your code here.
        }
    }

The Hook object of the New API has been migrated from Class to Member, which will be more intuitive.

Differential Functions

The following are some of the different functions of connecting to the new version of the API.

New Multi-Hook Usage

Previously we needed to hook all methods that match conditions like this.

The following example

injectMembers {
    method {
        name { it.contains("some") }
    }.all()
    afterHook {
        // Your code here.
    }
}

Now, you can use the following method instead.

The following example

method {
    name { it.contains("some") }
}.hookAll {
    after {
        // Your code here.
    }
}

New allMembers(...) Usage

Previously we needed to hook all methods and constructors like this.

The following example

injectMembers {
    allMembers(MembersType.METHOD)
    afterHook {
        // Your code here.
    }
}
injectMembers {
    allMembers(MembersType.CONSTRUCTOR)
    afterHook {
        // Your code here.
    }
}

Now, you can use the following method instead.

The following example

method().hookAll {
    after {
        // Your code here.
    }
}
constructor().hookAll {
    after {
        // Your code here.
    }
}

When the find conditions are not filled in, all members in the current Class are obtained by default.

If you want to hook MembersType.ALL, there is currently no direct method, but you can concatenate all members and then hook.

The following example

(method().giveAll() + constructor().giveAll()).hookAll {
    after {
        // Your code here.
    }
}

But we do not recommend this approach, too many hook members at one time are uncontrollable and problems may occur.