上班没事干,给新手朋友一点帮助:)
smali 自定义 log 注入下面要用smali代码 解决2个问题
1.Logg类怎么写
2.注入类logg 如何调用 不会写smali 怎么办,不用怕 有IDE
先看 工程结构
http://file:///C:/Users/user/Documents/My%20Knowledge/temp/0e4a469c-07ef-4c72-80c3-ec34e4340c87_5_files/39bf8ad9-38c6-498e-953b-5e539b8eb002.png 需要注入的Logg 放入根目录下编译,在AK里面可以看到smali,
这里大家可能会问为什么吧 Logg放入更目录勒,等会再回答。 Loggjava 代码 public class Logg {
public static void log(String str){
Log.e("info.....", str);
}
}
smali 代码 .class public LLogg;
.super Ljava/lang/Object;
.source "Logg.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 12
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static log(Ljava/lang/String;)V
.locals 1
.param p0, "str" # Ljava/lang/String;
.prologue
.line 14
const-string v0, "info....."
invoke-static {v0, p0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
.line 16
return-void
.end method
入口类mainActivity public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = show();
}
public String show(){
return "abcdefg";
}
}
这里需要注意,因为Logg类没有包名,java代码调用会找不到Logg类,所以会报错。 那么问题来了如何调用了, 呵呵 看下面
http://file:///C:/Users/user/Documents/My%20Knowledge/temp/0e4a469c-07ef-4c72-80c3-ec34e4340c87_5_files/680e7fd9-38b7-4a26-a22a-7899cf78fdf5.png @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = show();
Logg.log(str);
}
这里会问了为什么不找这么干,别慌 等会解释
在看 smali 代码 .class public Lcom/example/smalilog/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 7
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.prologue
.line 11
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 12
const/high16 v1, 0x7f030000
invoke-virtual {p0, v1}, Lcom/example/smalilog/MainActivity;->setContentView(I)V
.line 14
invoke-virtual {p0}, Lcom/example/smalilog/MainActivity;->show()Ljava/lang/String;
move-result-object v0
.line 16
.local v0, "str":Ljava/lang/String;
invoke-static {v0}, Lcom/example/smalilog/Logg;->log(Ljava/lang/String;)V
return-void
.end method
.method public show()Ljava/lang/String;
.locals 1
.prologue
.line 18
const-string v0, "abcdefg"
return-object v0
.end method
这里只看 关键 调用方法
.line 16
.local v0, "str":Ljava/lang/String;
invoke-static {v0}, Lcom/example/smalilog/Logg;->log(Ljava/lang/String;)V
在看Llog 类 头 .class public Lcom/example/smalilog/Logg;
.super Ljava/lang/Object;
.source "Logg.java"
这里可以看到大概调用结构,因为调用的是静态方法只需要传参数。 invoke-static{v0},L包名 类名;->log(Ljava/lang/String;)V
这么每个注入点 添加 包名 会很麻烦
在看文章开头的log类 smali 头 .class public LLogg;
.super Ljava/lang/Object;
.source "Logg.java"
这里文章开头可以解释了.生成的smali ,放入要注入的smali 根目录, 因为没有包名可以任意调用 。。
当然,放里面也行,把生成好的smali头的包名去掉。也就是 log方法的类型。 调用方法 invoke-static {v0}, LLogg;->log(Ljava/lang/String;)V
在说明下 在java中怎样在有名包中引用无名包中的类
除非都是没有包名而且在同一个文件夹下的类才能互相引用
不符合这个条件的必须有包名才能被引用
聪明的你应该想到了 为什么smali 可以调用勒 ????
其他自定义log 可参考
http://www.52pojie.cn/thread-255754-1-1.html
|