是否可以使用javassist修改android按钮

时间:2015-01-19 07:41:18

标签: java android bytecode javassist

我想添加一些标记当开发人员调用某些方法时,例如preformClick,但我得到一个例外:javassist.NotFoundException: C:\Users\xyz\AppData\Local\Android\android-sdk\platforms\android-21\android.jar.

这是我的代码,我使用AfterBurner,它是javassist的android包装器:

AfterBurner afterBurner = new AfterBurner();
ClassPool classPool = new ClassPool(ClassPool.getDefault());
            classPool.insertClassPath("C:\\Users\\xyz\\AppData\\Local\\Android\\android-sdk\\platforms\\android-21\\android.jar");
            afterBurner.addOrInsertMethod(new InsertableMethod(classPool.get(Button.class.getName())) {

                @Override
                public String getFullMethod() throws AfterBurnerImpossibleException {
                    return "public void mark() { ___BODY___ }";
                }

                @Override
                public String getBody() throws AfterBurnerImpossibleException {
                    String body = "android.util.Log.d(\"AfterBurner Demo\", \""
                            + "set click listener"
                            + " [\" + System.identityHashCode(this) + \"] \u27F3 "
                            + "\");";
                    return body;
                }

                @Override
                public String getTargetMethodName() throws AfterBurnerImpossibleException {
                    return "mark";
                }

                @Override
                public String getInsertionAfterMethod() {
                    return "setOnClickListener";
                }
            });

1 个答案:

答案 0 :(得分:-3)

您指的是构建时jar(.class)路径。但是,如果我理解正确的话,Android运行时会引用Dalvik OS上的dex格式文件。尝试     ClassPool pool = ClassPool.getDefault(getApplicationContext()); 在我的例子中,我尝试使用javassist替换android.net.wifi.p2p.WifiP2pService中的私有方法。但我可以看到所有私有方法都有cachedName,如访问$ 12596。我试图找到一种方法将其映射到真正的私有API名称。有没有人有想法?