gradleプラグインバイトコード挿入杭(四)、Activityにコードを注入

1745 ワード

ActivityのonCreateメソッドにToastを注入
第3編はclassファイルを修正する時私達は具体的にclassファイルを修正していないで、それからclassファイルを修正する時まだいくつか問題があることを発見して、だからここで更に総括します:
private static void injectClass(String className, String path) {
        CtClass c = pool.getCtClass(className)
        if (c.isFrozen()) {
            c.defrost()
        }

        /** */
       if(isActivity(activities, c)){
            injectActivityLifeCircle(c)
        }
      

        c.writeFile(path)
        c.detach()
    }


 private static void injectActivityLifeCircle(CtClass c){
        System.out.println(" Activity " + c.getName())

        if(c != null){
            CtMethod onCreateMethod = c.getDeclaredMethod("onCreate")


            String insetAfterStr = "android.widget.Toast.makeText(this,\" Toast ~!!\",android.widget.Toast.LENGTH_SHORT).show(); " // 

            try {
                onCreateMethod.insertAfter(insetAfterStr)
            } catch (Exception e){
                e.printStackTrace()
            }

            System.out.println(" Toast...................................")

        }

    }


最初はこう書いていましたが、運行中に間違えてしまいました.
後で資料を調べるとandroidのクラスライブラリが必要でBundleのパッケージを導入する必要があるのでgetDeclaredMethod(「onCreate」)の前に次のコードを追加する必要があります
··· pool.appendClassPath(project.android.bootClasspath[0].toString()); pool.importPackage("android.os.Bundle"); ···
その後、実行は間違っていませんが、コードは挿入されていません.
苦労したあげく、Groovyが文字列を申明するときに三重引用符があることに気づき、文字列の申明を変更してみました
String insetAfterStr = """ android.widget.Toast.makeText(this," Toast ~!!",android.widget.Toast.LENGTH_SHORT).show(); """ 

そこで三引用符で包み、ついにバイトコード挿入杭に成功した.
次に直面するのはビジネス上の問題です.