V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tingyunsay
V2EX  ›  问与答

xposed 框架在 genymotion 虚拟机上的运行报错

  •  
  •   tingyunsay · 2018-03-11 19:08:11 +08:00 · 1980 次点击
    这是一个创建于 2455 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.环境如下:

    Ubuntu 16.04
    android 虚拟机 5.1.0
    genymotion 2.11.0
    xposed_installer 82 版本
    android-sdk 22 (针对 android5.1 的)
    

    2.情况如下:

    android 虚拟机已 root,刷好了相关的包,包括 http://blog.csdn.net/CrystalIFDE/article/details/53888203 其中提到的所有软件包,xposed_installer 已经激活,但是在写完 xposed 的测试代码的时候总是报错,且经过我测试,其报错原因大致是由于读取不到 android 模拟器中的部分文件系统

    E/libprocessgroup: failed to make and chown /acct/uid_10062: Read-only file system
    

    导致我后续要操作的对象,都是一个 null 的对象,后续的 xposed 报错则为:

    E/Xposed: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String)' on a null object reference
    

    3.xposed 代码如下:

    import de.robv.android.xposed.IXposedHookLoadPackage;
    import de.robv.android.xposed.XC_MethodHook;
    import de.robv.android.xposed.XposedBridge;
    import de.robv.android.xposed.XposedHelpers;
    import de.robv.android.xposed.callbacks.XC_LoadPackage;
    
    public class xposed implements IXposedHookLoadPackage{
        @Override
        public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpParam) throws Throwable {
            XposedBridge.log("laozi is running");
            XposedBridge.log("beging xposed test .....");
    
            Class clazz = lpParam.classLoader.loadClass("com.tingyun.root.xposed_activity.MainActivity");
            XposedHelpers.findAndHookMethod(clazz,"toastMessage", new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            XposedBridge.log("before xposed ...");
                            super.beforeHookedMethod(param);
                        }
                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable{
                            param.setResult("你已被劫持");
                            XposedBridge.log("after xposed !!!");
                        }
                    }
            );
    
        }
    }
    

    MainActivity.java:

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private Button btChange;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fuck);
            btChange = (Button) findViewById(R.id.button1);
            btChange.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }
    
        public String toastMessage() {
            return "我未被劫持";
        }
    }
    

    4.问题如下: 想请教下大家如何解决这个问题,是使用另外一种 android 虚拟机(linux 下还有什么类似的,求推荐~)?还是 genymotion 有什么能修改这个文件权限的方法?

    其他配置文件如果有什么需要注意的,希望各位大哥指出来一下,谢谢了,我会尽快回复您的!

    4 条回复    2018-04-08 16:24:33 +08:00
    bluesky139
        1
    bluesky139  
       2018-03-13 17:24:18 +08:00   ❤️ 1
    不清楚楼主遇到的是什么问题,一般情况下:

    1. 新建一个 Genymotion 虚拟机,启起来进入系统,不要做多余的操作。

    2. 到 https://dl-xda.xposed.info/framework/ 去下一个对应 API level 和 abi 的刷机包(永远下最新的),拖到虚拟机上刷入。

    3. 到 https://forum.xda-developers.com/showthread.php?t=3034811 去下 XposedInstaller (只有最新的),用 adb 装上。

    4. 关掉虚拟机重新打开,到 XposedInstaller 中查看情况,再写点代码测试,一般情况下都没问题。
    tingyunsay
        2
    tingyunsay  
    OP
       2018-03-14 10:38:35 +08:00
    @bluesky139 我是按照这样的步骤做的,但是最后总是报错说是文件系统没有权限,就是说 genymotion 起开的虚拟机中的文件夹都是只读的文件系统,没法操作
    且 xposed 是都已经生效了的,但只打出了部分的日志,针对 MainActivity.java 中任何变量的操作都是 null (没有这个对象)。我在 adb shell 进去之后,发现在 acct 这个目录是 drwxr-xr-x 的权限,即:没有 write 权限,我手动更改也不影响其报错只读的错误
    failed to make and chown /acct/uid_10062: Read-only file system

    我打算重新安装 genymotion 再试试看,谢谢你啦!
    woyaojizhu8
        3
    woyaojizhu8  
       2018-03-29 15:19:10 +08:00
    要不要试试 android x86 或者 openthos
    tingyunsay
        4
    tingyunsay  
    OP
       2018-04-08 16:24:33 +08:00
    忘了回来结帖了,sorry,找到问题了,在 app/build.gradle 这个文件中忘了注释掉带有 implementation 的所有行,遗漏了一条:implementation files('libs/api-82-sources.jar') ,注释了 api-82.jar ,但是忘了把 source 注释掉了,导致使用的库文件调用失败。
    并且再提一句:使用的 xposedinstaller 和其中的刷的 sdk 包都应该是最新的,我在使用 v89 的包一切正常,但是 v85 的包还是会报 api 错误
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2709 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:09 · PVG 18:09 · LAX 02:09 · JFK 05:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.