gradleプラグインバイトコード挿入杭(四)、Activityにコードを注入
1745 ワード
ActivityのonCreateメソッドにToastを注入
第3編はclassファイルを修正する時私達は具体的にclassファイルを修正していないで、それからclassファイルを修正する時まだいくつか問題があることを発見して、だからここで更に総括します:
最初はこう書いていましたが、運行中に間違えてしまいました.
後で資料を調べるとandroidのクラスライブラリが必要でBundleのパッケージを導入する必要があるのでgetDeclaredMethod(「onCreate」)の前に次のコードを追加する必要があります
··· pool.appendClassPath(project.android.bootClasspath[0].toString()); pool.importPackage("android.os.Bundle"); ···
その後、実行は間違っていませんが、コードは挿入されていません.
苦労したあげく、Groovyが文字列を申明するときに三重引用符があることに気づき、文字列の申明を変更してみました
そこで三引用符で包み、ついにバイトコード挿入杭に成功した.
次に直面するのはビジネス上の問題です.
第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(); """
そこで三引用符で包み、ついにバイトコード挿入杭に成功した.
次に直面するのはビジネス上の問題です.