didi / VirtualAPK

A powerful and lightweight plugin framework for Android
Apache License 2.0
8.98k stars 1.52k forks source link

三星note8 加载插件后,长按EditText无法弹出“复制、粘贴”等操作;其他机型正常 #365

Open appsming opened 4 years ago

appsming commented 4 years ago

报错日志: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.wsecar.testvirtualapk, PID: 28893 java.lang.AbstractMethodError: abstract method "android.graphics.drawable.Drawable android.content.pm.PackageManager.loadItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo, boolean, int)" at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:268) at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:261) at android.content.pm.ResolveInfo.loadIcon(ResolveInfo.java:274) at android.widget.Editor$ProcessTextIntentActionsHandler.loadIcon(Editor.java:7314) at android.widget.Editor$ProcessTextIntentActionsHandler.onInitializeMenu(Editor.java:7286) at android.widget.Editor$TextActionModeCallback.onCreateActionMode(Editor.java:4182) at com.android.internal.policy.DecorView$ActionModeCallback2Wrapper.onCreateActionMode(DecorView.java:3040) at com.android.internal.policy.DecorView.startActionMode(DecorView.java:1160) at com.android.internal.policy.DecorView.startActionModeForChild(DecorView.java:1116) at com.android.internal.policy.DecorView.startActionModeForChild(DecorView.java:1110) at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:919) at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:888) at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:919) at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:888) at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:919) at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:888) at android.view.View.startActionMode(View.java:7110) at android.widget.Editor.startSelectionActionModeInternal(Editor.java:2215) at android.widget.SelectionActionModeHelper.startActionMode(SelectionActionModeHelper.java:163) at android.widget.SelectionActionModeHelper.-android_widget_SelectionActionModeHelper-mthref-2(SelectionActionModeHelper.java:84) at android.widget.-$Lambda$tTszxdFZ0V9nXhnBpPsqeBMO0fw$2.$m$0(Unknown Source:6) at android.widget.-$Lambda$tTszxdFZ0V9nXhnBpPsqeBMO0fw$2.accept(Unknown Source:0) at android.widget.SelectionActionModeHelper$TextClassificationAsyncTask.onPostExecute(SelectionActionModeHelper.java:375) at android.widget.SelectionActionModeHelper$TextClassificationAsyncTask.onPostExecute(SelectionActionModeHelper.java:371) at android.os.AsyncTask.finish(AsyncTask.java:695) at android.os.AsyncTask.-wrap1(Unknown Source:0) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6940) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

ghost commented 4 years ago

LoadedPlugin的PluginPackageManager没有重写这个方法 在PluginPackageManager加上这几个方法:

    public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo, boolean bb, int aa) {
        try {
            Method method = mHostPackageManager.getClass().getMethod("loadItemIcon", PackageItemInfo.class, ApplicationInfo.class, boolean.class, int.class);
            method.setAccessible(true);
            return (Drawable) method.invoke(mHostPackageManager, itemInfo, appInfo, bb, aa);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) {
        try {
            Method method = mHostPackageManager.getClass().getMethod("loadItemIcon", PackageItemInfo.class, ApplicationInfo.class);
            method.setAccessible(true);
            return (Drawable) method.invoke(mHostPackageManager, itemInfo, appInfo);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

这个玩意确实很麻烦,PackageManager是个抽象类,而且有些abstract方法还是hide的,有些没重写到就会崩溃。。。。。