dexposed enable 'god' mode for single android application.

Last update: Aug 5, 2022

What is it?

Download Software License Join the chat at https://gitter.im/alibaba/dexposed

Dexposed is a powerful yet non-invasive runtime AOP (Aspect-oriented Programming) framework for Android app development, based on the work of open-source Xposed framework project.

The AOP of Dexposed is implemented purely non-invasive, without any annotation processor, weaver or bytecode rewriter. The integration is as simple as loading a small JNI library in just one line of code at the initialization phase of your app.

Not only the code of your app, but also the code of Android framework that running in your app process can be hooked. This feature is extremely useful in Android development as we developers heavily rely on the fragmented old versions of Android platform (SDK).

Together with dynamic class loading, a small piece of compiled Java AOP code can be loaded into the running app, effectively altering the behavior of the target app without restart.

Typical use-cases

  • Classic AOP programming
  • Instrumentation (for testing, performance monitoring and etc.)
  • Online hot patch to fix critical, emergent or security bugs
  • SDK hooking for a better development experience

Integration

Directly add dexposed aar to your project as compile libraries, it contains a jar file "dexposedbridge.jar" two so files "libdexposed.so libdexposed_l.so" from 'dexposed' directory.

Gradle dependency like following:

	dependencies {
	    compile 'com.taobao.android:dexposed:[email protected]'
	}

Insert the following line into the initialization phase of your app, as early as possible:

    public class MyApplication extends Application {

        @Override public void onCreate() {        
            // Check whether current device is supported (also initialize Dexposed framework if not yet)
            if (DexposedBridge.canDexposed(this)) {
                // Use Dexposed to kick off AOP stuffs.
                ...
            }
        }
        ...
    }

It's done.

Basic usage

There are three injection points for a given method: before, after, replace.

Example 1: Attach a piece of code before and after all occurrences of Activity.onCreate(Bundle).

        // Target class, method with parameter types, followed by the hook callback (XC_MethodHook).
		DexposedBridge.findAndHookMethod(Activity.class, "onCreate", Bundle.class, new XC_MethodHook() {
        
            // To be invoked before Activity.onCreate().
			@Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
				// "thisObject" keeps the reference to the instance of target class.
				Activity instance = (Activity) param.thisObject;
        
				// The array args include all the parameters.
				Bundle bundle = (Bundle) param.args[0];
				Intent intent = new Intent();
				// XposedHelpers provide useful utility methods.
				XposedHelpers.setObjectField(param.thisObject, "mIntent", intent);
		
				// Calling setResult() will bypass the original method body use the result as method return value directly.
				if (bundle.containsKey("return"))
					param.setResult(null);
			}
					
			// To be invoked after Activity.onCreate()
			@Override protected void afterHookedMethod(MethodHookParam param) throws Throwable {
		        XposedHelpers.callMethod(param.thisObject, "sampleMethod", 2);
			}
		});

Example 2: Replace the original body of the target method.

		DexposedBridge.findAndHookMethod(Activity.class, "onCreate", Bundle.class, new XC_MethodReplacement() {
		
			@Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
				// Re-writing the method logic outside the original method context is a bit tricky but still viable.
				...
			}

		});

Checkout the example project to find out more.

Support

Dexposed support all dalvik runtime arm architecture devices from Android 2.3 to 4.4 (no include 3.0). The stability has been proved in our long term product practice.

Follow is support status.

Runtime Android Version Support
Dalvik 2.2 Not Test
Dalvik 2.3 Yes
Dalvik 3.0 No
Dalvik 4.0-4.4 Yes
ART 5.0 Testing
ART 5.1 No
ART M No

Contribute

We are open to constructive contributions from the community, especially pull request and quality bug report. Currently, the support for new Android Runtime (ART) is still in early beta stage, we value your help to test or improve the implementation.

Dexposed is aimed to be lightweight, transparent and productive. All improvements with these principal in mind are welcome. At the same time, we are actively exploring more potentially valuable use-cases and building powerful tools based upon Dexposed. We're interested in any ideas expanding the use-cases and grateful for community developed tools on top of Dexposed.

GitHub

https://github.com/alibaba/dexposed
Comments
  • 1. Why can't support YunOS?

    Then we may failed to hook mobiles running on YunOS, is there any explanation?

        public static synchronized boolean isDeviceSupport(Context context) {
            // return memory checked value.
            try {
                if (isCheckedDeviceSupport)
                    return isDeviceSupportable;
    
                if (!isX86CPU() && !isYunOS()) {
                    isDeviceSupportable = true;
                } else {
                    isDeviceSupportable = false;
                }
            } finally {
                Log.d("hotpatch", "device support is " + isDeviceSupportable + "checked" + isCheckedDeviceSupport);
                isCheckedDeviceSupport = true;
            }
            return isDeviceSupportable;
        }
    
    Reviewed by xworks at 2015-11-22 07:47
  • 2. dexposed2.3 is missing

    private static boolean loadDexposedLib(Context context) { // load xposed lib for hook. try { if (android.os.Build.VERSION.SDK_INT == 10 || android.os.Build.VERSION.SDK_INT == 9) { System.loadLibrary("dexposed2.3"); } else if (android.os.Build.VERSION.SDK_INT > 19){ System.loadLibrary("dexposed_l"); } else { System.loadLibrary("dexposed"); } return true; } catch (Throwable e) { return false; } }

    we could see there is three kind of so file,but there is nowhere to find dexposed2.3

    Reviewed by ASCE1885 at 2015-08-04 03:47
  • 3. support x86 and art 5.1

    主要做了如下几个改动:

    整个项目都切换为studio 工程

    这样就可以使用studio 的native debugger进行调试 当前studio 版本: 1.4 preview3 gradle版本: gradle-experimental:0.2.0

    art 和 delvik runtime 都支持x86

    在Genymotion android的几个虚拟机测试通过:

    • 4.4.4 api19
    • 5.0.0 api21
      • 5.1.1 api22

    增加一个dexposed-patch 子项目

    之前沟通, 编译依赖的android头文件和libxxx.so, 我提出来放到这个单独的项目中了, 并作为submodule

    增加一个dexposed 项目

    用来发布到maven, 因为studio的原因, 不能很好的引用native lib项目; 所以单独提一个项目出来专门用作发布; 它没有代码, 依赖dexposedbridge, 分别软链三个对应的so

    至于为何不像原来一样跟dexposedbridge放到一起, 因为如果dexposed_art需要单独进行native调试, 那么dexposed_art必须依赖dexposedbridge, 那放到一起的话dexposedbridge中的libdexposed_art.so 会跟dexposed_art本身编译出来的so冲突, 所以我选择干脆提出来单独发布的模块好了;这样dexposed_art和dexposed_dalvik都可以改成app单独进行natvie调试

    dexposed_art 生成5.0 和5.1两个lib

    art运行时支持, 因为5.0和5.1的dexposed.cpp区别很小, 所以用一套代码, 建了两个productFlavors来分别使用5.0和5.1头文件进行编译出两个so

    dexposed.cpp

    • 修改了invokeOriginalMethod的方式
    • 5.0的 SetNativeMethod 在5.1 被定义为SetEntryPointFromJni

    关于5.0和5.1的兼容

    因为art中使用了很多内敛函数, 而且访问类属性的时候大多用了偏移量的做法; 但是5.0和5.1的类结构又不同, 所以导致5.0和5.1不兼容; 就比如 ArtMethod::GetAccessFlags 这个方法, 5.0实际上是访问&ArtMethod+56, 而5.1是访问&ArtMethod+20

    可以做个转化来兼容, 具体可以看我的分支compatible_with_19_22, 主要是art_method_proxy.h 做了个ArtMethod属性访问的代理; 在5.0和5.1虚拟机测试通过

    但是5.0和5.1很多类的结构体好像都改了, 就像是ObjectArray::Set() 函数都会不兼容的, 经过我debug发现好像是Runtime::GetHeap() 的指针异常; 所以在我的兼容分支粗暴的改成了 SetFieldObjectWithoutWriteBarrier, 可以正常; 但是以我的知识...我不知道WriteBarrier作用是啥...

    一句话就是, 如果要搞proxy的话要搞好多xxx_porxy, 代价太高了... 而且不知道会不会带来其他问题...所以我还是选择老老实实编译两个so分别加载算了

    Reviewed by pangliang at 2015-08-26 04:45
  • 4. 转成android studio工程, 并且让它支持x86

    你好:

    我打算用这个东西来做个插件, 并且希望它支持x86, 所以自己fork了一个做了修改 主要是整个项目换成android studio的工程, dalvik, bridge, art分别作为library model

    dalvik和art模块都可以直接在android studio中编译成功, 应该会方便修改和调试

    另外, 我已经把dalvik的部分完成了了x86的支持 art的因为有个关联armeabi-v7a的汇编, 暂时不知道怎么弄

    我的分支地址: https://github.com/pangliang/dexposed/tree/android_studio 你们看是否能接受, 可以的话我就推个PR

    Reviewed by pangliang at 2015-08-14 10:39
  • 5. Patch成功,但是Hook的函数没有被替换

    执行时,有系统异常,提示如下: `DexOpt: --- BEGIN 'patch_my.apk' (bootstrap=0) --- 02-18 18:14:03.712 26653-26653/com.ruowen.hookdexposed D/dalvikvm﹕ DexOpt: --- END 'patch_my.apk' (success) --- 02-18 18:14:03.712 26653-26653/com.ruowen.hookdexposed D/dalvikvm﹕ DEX prep '/storage/emulated/0/Android/data/com.ruowen.hookdexposed/cache/patch_my.apk': unzip in 0ms, rewrite 99ms 02-18 18:14:03.722 26653-26653/com.ruowen.hookdexposed D/dalvikvm﹕ DexOpt: --- BEGIN 'patch_my.apk' (bootstrap=0) --- 02-18 18:14:03.812 26653-26653/com.ruowen.hookdexposed D/dalvikvm﹕ DexOpt: --- END 'patch_my.apk' (success) --- 02-18 18:14:03.812 26653-26653/com.ruowen.hookdexposed D/dalvikvm﹕ DEX prep '/storage/emulated/0/Android/data/com.ruowen.hookdexposed/cache/patch_my.apk': unzip in 0ms, rewrite 91ms

    /*******************此处提示有未实现的本地方法************************************_/ 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/dalvikvm﹕ No implementation found for native Lcom/taobao/android/dexposed/DexposedBridge;.hookMethodNative:(Ljava/lang/reflect/Member;Ljava/lang/Class;ILjava/lang/Object;)V 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ java.lang.UnsatisfiedLinkError: Native method not found: com.taobao.android.dexposed.DexposedBridge.hookMethodNative:(Ljava/lang/reflect/Member;Ljava/lang/Class;ILjava/lang/Object;)V /_****************_此处提示有未实现的本地方法_***********************************/

    02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.taobao.android.dexposed.DexposedBridge.hookMethodNative(Native Method) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.taobao.android.dexposed.DexposedBridge.hookMethod(DexposedBridge.java:158) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.taobao.android.dexposed.DexposedBridge.findAndHookMethod(DexposedBridge.java:192) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.taobao.patch.BtnClickPatch.handlePatch(BtnClickPatch.java:24) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.taobao.patch.PatchCallback.handlePatch(PatchCallback.java:35) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.taobao.patch.PatchCallback.call(PatchCallback.java:31) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.taobao.patch.PatchCallback.callAll(PatchCallback.java:16) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.taobao.patch.PatchMain.load(PatchMain.java:95) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.ruowen.hookdexposed.MainActivity.runPatchApk(MainActivity.java:76) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.ruowen.hookdexposed.MainActivity.onClick(MainActivity.java:52) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at android.view.View.performClick(View.java:4444) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at android.view.View$PerformClick.run(View.java:18457) 02-18 18:14:03.822 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at android.os.Looper.loop(Looper.java:136) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5049) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 02-18 18:14:03.832 26653-26653/com.ruowen.hookdexposed E/Hotpatch﹕ patch success!`

    Reviewed by Ruowenmei at 2016-02-18 10:20
  • 6. ART系统类方法Hook支持

    1.对ART的支持现在是否还有人在继续开发?

    2.手淘是否使用了其他的方案来代替dexposed?

    3.我测试了ART下自定义函数的可以hook,但是对于View的方法比如performClick不可以hook, dexposed/dexposed_so/dexposed_art/dexposed.cpp里的EnableXposedHook

    static void EnableXposedHook(JNIEnv* env, ArtMethod* art_method, jobject additional_info)
          // Create a backup of the ArtMethod object
          ArtMethod* backup_method = down_cast<ArtMethod*>(art_method->Clone(soa.Self()));
          // Set private flag to avoid virtual table lookups during invocation
          backup_method->SetAccessFlags(backup_method->GetAccessFlags() /*| kAccXposedOriginalMethod*/);
          // Create a Method/Constructor object for the backup ArtMethod object
          jobject reflect_method;
          if (art_method->IsConstructor()) {
            reflect_method = env->AllocObject(WellKnownClasses::java_lang_reflect_Constructor);
          } else {
            reflect_method = env->AllocObject(WellKnownClasses::java_lang_reflect_Method);
          }
          env->SetObjectField(reflect_method, WellKnownClasses::java_lang_reflect_AbstractMethod_artMethod,
              env->NewGlobalRef(soa.AddLocalReference<jobject>(backup_method)));
          // Save extra information in a separate structure, stored instead of the native method
          DexposedHookInfo* hookInfo = reinterpret_cast<DexposedHookInfo*>(calloc(1, sizeof(DexposedHookInfo)));
          hookInfo->reflectedMethod = env->NewGlobalRef(reflect_method);
          hookInfo->additionalInfo = env->NewGlobalRef(additional_info);
          hookInfo->originalMethod = backup_method;
    
          jstring shorty = (jstring)env->GetObjectField(additional_info,additionalhookinfo_shorty_field);
          hookInfo->shorty = env->GetStringUTFChars(shorty, 0);
          LOG(INFO) << "dexposed: >>> EnableXposedHook shorty:" << hookInfo->shorty;
    
        #if PLATFORM_SDK_VERSION < 22
            art_method->SetNativeMethod(reinterpret_cast<uint8_t *>(hookInfo));
        #else
            art_method->SetEntryPointFromJni(reinterpret_cast<void *>(hookInfo));
        #endif
    
          art_method->SetEntryPointFromQuickCompiledCode(GetQuickDexposedInvokeHandler());
          //art_method->SetEntryPointFromInterpreter(art::artInterpreterToCompiledCodeBridge);
          // Adjust access flags
          art_method->SetAccessFlags((art_method->GetAccessFlags() & ~kAccNative) /*| kAccXposedHookedMethod*/);
    

    是什么原因导致的这个问题呢? 另外xposed也支持了6.0的hook,在android_art/runtime/art_method.cc里的

    void ArtMethod::EnableXposedHook(ScopedObjectAccess& soa, jobject additional_info) {
    
      // Create a backup of the ArtMethod object
      auto* cl = Runtime::Current()->GetClassLinker();
      ArtMethod* backup_method = cl->AllocArtMethodArray(soa.Self(), 1);
      backup_method->CopyFrom(this, cl->GetImagePointerSize());
      backup_method->SetAccessFlags(backup_method->GetAccessFlags() | kAccXposedOriginalMethod);
    
      // Create a Method/Constructor object for the backup ArtMethod object
      mirror::AbstractMethod* reflect_method;
      if (IsConstructor()) {
        reflect_method = mirror::Constructor::CreateFromArtMethod(soa.Self(), backup_method);
      } else {
        reflect_method = mirror::Method::CreateFromArtMethod(soa.Self(), backup_method);
      }
      reflect_method->SetAccessible<false>(true);
    
      // Save extra information in a separate structure, stored instead of the native method
      XposedHookInfo* hookInfo = reinterpret_cast<XposedHookInfo*>(calloc(1, sizeof(XposedHookInfo)));
      hookInfo->reflectedMethod = soa.Vm()->AddGlobalRef(soa.Self(), reflect_method);
      hookInfo->additionalInfo = soa.Env()->NewGlobalRef(additional_info);
      hookInfo->originalMethod = backup_method;
      SetEntryPointFromJni(reinterpret_cast<uint8_t*>(hookInfo));
    
      ThreadList* tl = Runtime::Current()->GetThreadList();
      soa.Self()->TransitionFromRunnableToSuspended(kSuspended);
      tl->SuspendAll("Hooking method");
      {
        MutexLock mu(soa.Self(), *Locks::thread_list_lock_);
        tl->ForEach(StackReplaceMethod, this);
      }
      tl->ResumeAll();
      soa.Self()->TransitionFromSuspendedToRunnable();
    
      SetEntryPointFromQuickCompiledCode(GetQuickProxyInvokeHandler());
      SetEntryPointFromInterpreter(artInterpreterToCompiledCodeBridge);
    
      // Adjust access flags
      SetAccessFlags((GetAccessFlags() & ~kAccNative & ~kAccSynchronized) | kAccXposedHookedMethod);
    

    是否可以借鉴一下?

    Reviewed by mimers at 2016-01-21 08:25
  • 7. Build.VERSION.SDK_INT >= 21不支持吗

    在使用5.0.1手机测试时发现load的是libdexposed_l.so成功 PatchResult result = PatchMain.load(context, apkPath, null);也返回true 但运行时程序崩溃,请问下现在还不支持5.0(API 21)以上的系统吗? 如果支持该怎么配置?谢谢

    Reviewed by kingJ430 at 2015-10-15 06:49
  • 8. native_dependencies does not work

    Error:Execution failed for task ':app:resolveNativeDependencies'.

    Could not resolve all dependencies for configuration 'detachedConfiguration1'. Could not find any matches for com.taobao.dexposed:dexposed_l:0.2+ as no versions of com.taobao.dexposed:dexposed_l are available. Searched in the following locations: https://jcenter.bintray.com/com/taobao/dexposed/dexposed_l/maven-metadata.xml https://jcenter.bintray.com/com/taobao/dexposed/dexposed_l/

    Reviewed by ASCE1885 at 2015-08-04 03:45
  • 9. Duplicate files copied in APK

    Last summer, I used dexposed library by downloading jar and so files. I guess you moved to Maven repositories and one line dependency works with gradle now. However, I'm facing following error with current version.

    Error:Execution failed for task ':sample:transformNative_libsWithMergeJniLibsForDebug'.
    > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK lib/armeabi/libdexposed_l.so
        File1: D:\Works\android-windows\ScreenRecord\sample\build\intermediates\exploded-aar\com.taobao.android\dexposed\0.1.1\jni
        File2: D:\Works\android-windows\ScreenRecord\sample\build\intermediates\exploded-aar\ScreenRecord\library\unspecified\jni
    
    Reviewed by halilozercan at 2016-04-15 14:42
  • 10. Build Issues with AOSP

    [Question] I have build Android source code successfully and have placed dexposed dalvik code at right places. When I run mmm -B dexposed_dalvik, it starts to compile. But the output is not generated. I have used android-4.3_r2.2.

    Reviewed by azeemsamma at 2016-04-07 12:41
  • 11. hook Fragment onCreate onDestroy not work

    DexposedBridge.findAndHookMethod(Fragment.class, "onCreate", Bundle.class, onCreateHook); DexposedBridge.findAndHookMethod(Fragment.class, "onDestroy", onDestroyHook); 不起作用

    Reviewed by hyxbiao at 2015-11-14 14:08
  • 12. 小米4 CM13闪退

    日志如下 dev_art的

    03-13 15:23:11.418 22507-22507/? V/Dexposed_Art: JNI_Dexposed_Art_OnLoad
    03-13 15:23:11.421 22507-22507/? V/Dexposed_Art: artInterpreterToInterpreterBridge: b498e341
    03-13 15:23:11.422 22507-22507/? V/Dexposed_Art: artInterpreterToCompiledCodeBridge: b4b11b8d
    03-13 15:23:11.422 22507-22507/? V/Dexposed_Art: art_quick_resolution_trampoline: 0
    03-13 15:23:11.429 22507-22507/? D/Dexposed: Using: 16/32-bit Thumb2
    03-13 15:23:11.430 22507-22507/? D/Dexposed.Operator: source Method:0xFFFFFFFFAEB6D350
    03-13 15:23:11.430 22507-22507/? D/Dexposed.Operator: Orin Method QuickCompiledCode:0x00000000A05FCC95
    03-13 15:23:11.430 22507-22507/? D/Dexposed.Memory: Reading 8 bytes from: 0xA05FCC94
    03-13 15:23:11.431 22507-22507/? D/Dexposed.Memory: 0xA05FCC90:             AD F5 00 5C  DC F8 00 C0
    03-13 15:23:11.431 22507-22507/? V/Dexposed_Art: dexposed_getBridgeFunction b395d809
    03-13 15:23:11.432 22507-22507/? D/Dexposed: targetAddress:0xFFFFFFFFB395D809
    03-13 15:23:11.432 22507-22507/? D/Dexposed: sourceAddress:0xFFFFFFFFAEB6D350
    03-13 15:23:11.432 22507-22507/? D/Dexposed.Memory: Mapped memory of size 72 at 0xB587E000
    03-13 15:23:11.432 22507-22507/? D/Dexposed.Memory: Writing memory to: 0xB587E000
    03-13 15:23:11.434 22507-22507/? D/Dexposed.Memory: 0xB587E000: AF F3 00 80 DF F8 2C C0  60 45 40 F0 15 80 2D E9 
                                                        0xB587E010: F8 4F 84 B0 CD F8 08 30  6B 46 6B 46 CD F8 00 D0 
                                                        0xB587E020: CD F8 04 90 DF F8 08 C0  E0 47 04 B0 BD E8 F8 8F 
                                                        0xB587E030: 09 D8 95 B3 50 D3 B6 AE  AD F5 00 5C DC F8 00 C0 
                                                        0xB587E040: DF F8 00 F0 9D CC 5F A0
    03-13 15:23:11.435 22507-22507/? D/Dexposed: Writing hook to 0xB587E001 in 0xA05FCC94
    03-13 15:23:11.435 22507-22507/? D/Dexposed.Memory: Disabling mprotect from 0xA05FCC94
    03-13 15:23:11.435 22507-22507/? D/Dexposed.Memory: Writing memory to: 0xA05FCC94
    03-13 15:23:11.436 22507-22507/? D/Dexposed.Memory: 0xA05FCC90:             DF F8 00 F0  01 E0 87 B5
    03-13 15:23:11.436 22507-22507/? D/Dexposed.Memory: Mapped memory of size 40 at 0xB586B000
    03-13 15:23:11.437 22507-22507/? D/Dexposed: backAddress:0xFFFFFFFFB586B000
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler arm32
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler method: 0xaeb6d350
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler arg2: 0x12dc8d50
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler arg3: 0x10
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler sp1: 0xbefdfe18
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe18 sp[0]: 0xbefdfe18
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe1c sp[1]: 0xb4cf6500
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe20 sp[2]: 0x12dc8000
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe24 sp[3]: 0x0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe28 sp[4]: 0x12dc8000
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe2c sp[5]: 0x0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe30 sp[6]: 0x12da7620
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe34 sp[7]: 0x71036af0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe38 sp[8]: 0x12c3a880
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe3c sp[9]: 0x0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe40 sp[10]: 0xb4cf6500
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe44 sp[11]: 0x12c3a880
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe48 sp[12]: 0x12d42180
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe4c sp[13]: 0xa0601025
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe50 sp[14]: 0xb0631738
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe54 sp[15]: 0x12dc8d50
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe58 sp[16]: 0x12e80490
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe5c sp[17]: 0x12dc14c0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe60 sp[18]: 0x12d3f220
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe64 sp[19]: 0x0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe68 sp[20]: 0x1
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe6c sp[21]: 0x12dc8d50
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe70 sp[22]: 0x84
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe74 sp[23]: 0x2710
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe78 sp[24]: 0x0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe7c sp[25]: 0x7411bec5
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe80 sp[26]: 0x12c893e0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe84 sp[27]: 0x12dc8d50
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe88 sp[28]: 0x12dc14c0
    03-13 15:23:11.438 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe8c sp[29]: 0x0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe90 sp[30]: 0x12dc1500
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe94 sp[31]: 0x0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe98 sp[32]: 0x12da7620
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfe9c sp[33]: 0x7419e81d
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfea0 sp[34]: 0x718bad08
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfea4 sp[35]: 0x12da7620
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfea8 sp[36]: 0x71036af0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfeac sp[37]: 0x12c3a880
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfeb0 sp[38]: 0x0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler1 0xbefdfeb4 sp[39]: 0x12c3a880
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler size:0
    03-13 15:23:11.439 22507-22507/? D/Dexposed.Entry: isStatic:false
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[0]: 0x10
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[1]: 0x12dc8000
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[2]: 0x1000000
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[3]: 0xb4d00140
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[4]: 0xb4c21e00
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[5]: 0xc000000
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[6]: 0xb4c21da0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[7]: 0x1000
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[8]: 0xb4cfb0a0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[9]: 0x200000
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[10]: 0x1000
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[11]: 0x800000
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[12]: 0xb4bfbbac
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[13]: 0x0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[14]: 0xb4bfbb84
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[15]: 0x1f4
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[16]: 0x0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[17]: 0xb4cca0c8
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[18]: 0x0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler xargs[19]: 0x0
    03-13 15:23:11.439 22507-22507/? V/Dexposed_Art: artQuickDexposedInvokeHandler returnType:17
    03-13 15:23:11.440 22507-22507/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 22507 (io.virtualapp:x)
    03-13 15:23:11.440 277-277/? I/DEBUG: property debug.db.uid not set; NOT waiting for gdb.
    03-13 15:23:11.440 277-277/? I/DEBUG: HINT: adb shell setprop debug.db.uid 100000
    03-13 15:23:11.440 277-277/? I/DEBUG: HINT: adb forward tcp:5039 tcp:5039
    03-13 15:23:11.544 277-277/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    03-13 15:23:11.544 277-277/? A/DEBUG: CM Version: 'unknown'
    03-13 15:23:11.545 277-277/? A/DEBUG: Build fingerprint: 'Xiaomi/cancro/cancro:6.0.1/MMB29M/6.5.12:userdebug/test-keys'
    03-13 15:23:11.545 277-277/? A/DEBUG: Revision: '0'
    03-13 15:23:11.545 277-277/? A/DEBUG: ABI: 'arm'
    03-13 15:23:11.546 277-277/? A/DEBUG: pid: 22507, tid: 22507, name: io.virtualapp:x  >>> io.virtualapp:x <<<
    03-13 15:23:11.546 277-277/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
    03-13 15:23:11.633 277-277/? A/DEBUG:     r0 b4cbc000  r1 b4cf6500  r2 12dc8d50  r3 00000000
    03-13 15:23:11.633 277-277/? A/DEBUG:     r4 00000011  r5 00000000  r6 00100021  r7 b3960734
    03-13 15:23:11.633 277-277/? A/DEBUG:     r8 00000000  r9 b4cf6500  sl 12c3a880  fp 12d42180
    03-13 15:23:11.633 277-277/? A/DEBUG:     ip befdf910  sp befdfdb8  lr b395dba9  pc 00000000  cpsr 600f0010
    03-13 15:23:11.635 277-277/? A/DEBUG: backtrace:
    03-13 15:23:11.635 277-277/? A/DEBUG:     #00 pc 00000000  <unknown>
    03-13 15:23:11.635 277-277/? A/DEBUG:     #01 pc 00002ba7  /data/app/io.virtualapp-2/lib/arm/libdexposed_art.so (artQuickDexposedInvokeHandler+926)
    03-13 15:23:11.635 277-277/? A/DEBUG:     #02 pc 00000029  <unknown>
    03-13 15:23:12.170 277-277/? A/DEBUG: Tombstone written to: /data/tombstones/tombstone_01
    
    
    Reviewed by dovewi at 2017-03-13 07:39
  • 13. StackOverflowError

    AndroidRuntime: FATAL EXCEPTION: main java.lang.StackOverflowError at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.DexposedBridge.log(DexposedBridge.java:84) at com.taobao.android.dexposed.D

    Reviewed by huxian99 at 2016-07-03 09:54
  • 14. method循环调用

    hi,你好,我在使用dexposed在art中的时候出现了循环调用的现象。 在hook完之后 正常的调用逻辑应该是:before -> original -> after 但是当我调用如下函数的时候,又会hook住。 com_taobao_android_dexposed_DexposedBridge_invokeOriginalMethodNative

    最终变成了这样: before -> original -> before -> original .... .... 请问这个是目前已知的问题么?

    Reviewed by w5678912345 at 2016-05-25 02:49
Nucleus is an Android library, which utilizes the Model-View-Presenter pattern to properly connect background tasks with visual parts of an application.

Nucleus Deprecation notice Nucleus is not under develpment anymore. It turns out that Redux architecture scales way better than MVP/MVI/MVVM/MVxxx and

Jul 24, 2022
Kick-starts Android application development.

Synopsis If you've made it here, chances are you are not quite as satisfied with the Android application framework as you could be. Same for us, that'

Aug 8, 2022
Android part of the Android Studio(IntellijIDEA) OkHttp Profiler plugin
Android part of the  Android Studio(IntellijIDEA) OkHttp Profiler plugin

OkHttpProfiler Android Library Created by LocaleBro.com - Android Localization Platform The OkHttp Profiler plugin can show requests from the OkHttp l

Aug 12, 2022
Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on
Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on

android-common-lib 关于我,欢迎关注 微博:Trinea 主页:trinea.cn 邮箱:trinea.cn#gmail.com 微信:codek2 主要包括:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、

Aug 13, 2022
A Model-View-Presenter / Model-View-Intent library for modern Android apps

Mosby A Model-View-Presenter and Model-View-Intent library for Android apps. Dependency dependencies { compile 'com.hannesdorfmann.mosby3:mvi:3.1.1

Aug 17, 2022
A small, yet full-featured framework that allows building View-based Android applications
A small, yet full-featured framework that allows building View-based Android applications

Conductor A small, yet full-featured framework that allows building View-based Android applications. Conductor provides a light-weight wrapper around

Aug 16, 2022
A plugin system that runs like a browser, but instead of load web pages, it load apk plugins which runs natively on Android system.
A plugin system that runs like a browser, but instead of load web pages, it load apk plugins which runs natively on Android system.

Android Dynamic Loader Android Dynamic Loader is a plugin system. The host application is like a browser, but instead of load web pages, it load plugi

Aug 7, 2022
LiteOrm is a fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line of code efficiently.

#LiteOrm:Android高性能数据库框架 A fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line

Aug 7, 2022
🚀Plugin for Android Studio And IntelliJ Idea to generate Kotlin data class code from JSON text ( Json to Kotlin )
🚀Plugin for Android Studio And IntelliJ Idea to generate Kotlin data class code from JSON text ( Json to Kotlin )

JsonToKotlinClass Hi, Welcome! This is a plugin to generate Kotlin data class from JSON string, in another word, a plugin that converts JSON string to

Aug 12, 2022
Rosie is an Android framework to create applications following the principles of Clean Architecture.
Rosie is an Android framework to create applications following the principles of Clean Architecture.

Rosie The only way to make the deadline—the only way to go fast—is to keep the code as clean as possible at all times. — Robert C. Martin in Clean Cod

Jul 25, 2022
Create kotlin android project with one line of command.

README This is an android application template project built with kotlin language and some useful libraries. It provides a creator script to quickly c

Jul 19, 2022
Moxy is MVP library for Android
Moxy is MVP library for Android

Moxy This Moxy repository is deprecated and no longer supported. Please migrate to the actual version of the Moxy framework at Moxy communuty repo. De

Aug 11, 2022
A data-binding Presentation Model(MVVM) framework for the Android platform.

PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED. As personal time contraints, I am currently unable to keep up. Please use official android da

Jun 6, 2022
Minimal UI library for Android inspired by React
Minimal UI library for Android inspired by React

Anvil - reactive views for Android Anvil is a small Java library for creating reactive user interfaces. Originally inspired by React, it suits well as

Jul 30, 2022
A full-featured framework that allows building android applications following the principles of Clean Architecture.

EasyMVP A powerful, and very simple MVP library with annotation processing and bytecode weaving. EasyMVP eliminates the boilerplate code for dealing w

Aug 8, 2022
a MVP library for Android favoring a stateful Presenter

DEPRECATED - no longer actively maintained ThirtyInch - a MVP library for Android This library adds Presenters to Activities and Fragments. It favors

Jul 27, 2022
Android Next 公共组件库

Android-Next 公共组件库 这个库是我在日常开发过程中积累下来的一些可复用组件,大部分都在我的工作项目和个人项目中有使用。 最新版本: Gradle集成 // core 核心库, 格式:jar和aar compile 'com.mcxiaoke.next:core:1.7.

May 17, 2022
Pet project using Clean Architecture + MVVM + Reactive Extensions + Android Architecture Components. The data are fetched from LondonTheatreDirect API. 🎭
Pet project using Clean Architecture + MVVM + Reactive Extensions + Android Architecture Components. The data are fetched from LondonTheatreDirect API. 🎭

Theatre Pet project using Clean Architecture + MVVM + Reactive Extensions + Android Architecture Components. The data is fetched from LondonTheatreDir

Aug 4, 2022
Android Plugin Framework

Android Plugin Framework This project is pre-mature and may be changed very frequently. Introduction Android Plugin Framework (APF) aims to providing

Jun 8, 2022