From 2c1fba450b40dcf76343e05f46642a9bc4aded83 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Sat, 29 Oct 2022 07:21:17 +0800 Subject: [PATCH] Fix ABI --- lsplant/src/main/jni/art/mirror/class.hpp | 24 +++++++++++++++--- lsplant/src/main/jni/art/runtime/handle.hpp | 27 +++++++++++++++++++-- settings.gradle.kts | 4 +-- test/build.gradle.kts | 2 +- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/lsplant/src/main/jni/art/mirror/class.hpp b/lsplant/src/main/jni/art/mirror/class.hpp index 9e832c3..90ac070 100644 --- a/lsplant/src/main/jni/art/mirror/class.hpp +++ b/lsplant/src/main/jni/art/mirror/class.hpp @@ -70,7 +70,7 @@ private: CREATE_HOOK_STUB_ENTRY( "_ZN3art6mirror5Class9SetStatusENS_6HandleIS1_EENS_11ClassStatusEPNS_6ThreadE", void, - SetClassStatus, (Handle h, uint8_t new_status, Thread *self), { + SetClassStatus, (TrivialHandle h, uint8_t new_status, Thread *self), { if (new_status == initialized_status) { BackupClassMethods(h->GetClassDef(), self); } @@ -86,6 +86,15 @@ private: return backup(h, new_status, self); }); + CREATE_HOOK_STUB_ENTRY( + "_ZN3art6mirror5Class9SetStatusENS_6HandleIS1_EENS1_6StatusEPNS_6ThreadE", void, + TrivialSetStatus, (TrivialHandle h, uint32_t new_status, Thread *self), { + if (new_status == initialized_status) { + BackupClassMethods(h->GetClassDef(), self); + } + return backup(h, new_status, self); + }); + CREATE_MEM_HOOK_STUB_ENTRY("_ZN3art6mirror5Class9SetStatusENS1_6StatusEPNS_6ThreadE", void, ClassSetStatus, (Class * thiz, int new_status, Thread *self), { if (new_status == static_cast(initialized_status)) { @@ -107,11 +116,18 @@ public: return false; } - if (!HookSyms(handler, SetClassStatus, SetStatus, ClassSetStatus)) { - return false; + int sdk_int = GetAndroidApiLevel(); + + if (sdk_int < __ANDROID_API_O__) { + if (!HookSyms(handler, SetStatus, ClassSetStatus)) { + return false; + } + } else { + if (!HookSyms(handler, SetClassStatus, TrivialSetStatus)) { + return false; + } } - int sdk_int = GetAndroidApiLevel(); if (sdk_int >= __ANDROID_API_R__) { initialized_status = 15; } else if (sdk_int >= __ANDROID_API_P__) { diff --git a/lsplant/src/main/jni/art/runtime/handle.hpp b/lsplant/src/main/jni/art/runtime/handle.hpp index 2958cfe..0118b3e 100644 --- a/lsplant/src/main/jni/art/runtime/handle.hpp +++ b/lsplant/src/main/jni/art/runtime/handle.hpp @@ -14,14 +14,37 @@ class Class; template class Handle : public ValueObject { public: + Handle(const Handle& handle) : reference_(handle.reference_) {} + + Handle& operator=(const Handle& handle) { + reference_ = handle.reference_; + return *this; + } static_assert(std::is_same_v, "Expected mirror::Class"); auto operator->() { return Get(); } - T *Get() { return down_cast(reference_->AsMirrorPtr()); } + T* Get() { return down_cast(reference_->AsMirrorPtr()); } protected: - StackReference *reference_; + StackReference* reference_; }; +static_assert(!std::is_trivially_copyable_v>); + +// https://cs.android.com/android/_/android/platform/art/+/38cea84b362a10859580e788e984324f36272817 +template +class TrivialHandle : public ValueObject { +public: + static_assert(std::is_same_v, "Expected mirror::Class"); + + auto operator->() { return Get(); } + + T* Get() { return down_cast(reference_->AsMirrorPtr()); } + +protected: + StackReference* reference_; +}; +static_assert(std::is_trivially_copyable_v>); + } // namespace lsplant::art diff --git a/settings.gradle.kts b/settings.gradle.kts index b114dfc..81db258 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,8 +5,8 @@ pluginManagement { mavenCentral() } plugins { - id("com.android.application") version "7.3.0" - id("com.android.library") version "7.3.0" + id("com.android.application") version "7.3.1" + id("com.android.library") version "7.3.1" } } dependencyResolutionManagement { diff --git a/test/build.gradle.kts b/test/build.gradle.kts index de5331e..76be0bc 100644 --- a/test/build.gradle.kts +++ b/test/build.gradle.kts @@ -76,7 +76,7 @@ android { createDevice(28, true) createDevice(29, false) createDevice(29, true) - createDevice(30, false, "aosp_atd") + createDevice(30, false) createDevice(30, true) // createDevice(31, false, "android-tv") createDevice(31, true, "aosp_atd")