前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。
点击跳转到教程
前言:
什么是Android Hook技术?
Android Hook技术是指在Android平台上通过修改、拦截或替换系统或应用程序的API、方法或行为,实现对系统或应用程序的定制和扩展的技术手段。
在Android系统中,应用程序和系统之间通过API进行交互。应用程序可以调用系统提供的API来实现各种功能。而通过Hook技术,我们可以修改或拦截这些API的行为,以达到修改系统或应用程序行为的目的。
1.首先定义MainActivity,在该类里面通过hook()方法,进行了Hook,具体注释已经在代码中给出
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "" + ((Button) view).getText(), Toast.LENGTH_SHORT).show();
}
});
try {
hook(button);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "Hook失败" + e.toString(), Toast.LENGTH_SHORT).show();
}
}
/**
* 在不修改以上代码的情况下,通过Hook把 ((Button) view).getText()内给修改
*
* @param view view对象
*/
private void hook(View view) throws Exception {
//之前的还是用户写的实现代码
//为了获取ListenerInfo对象,需要执行这个方法 ListenerInfo getListenerInfo() ,才能拿到
Class<?> viewClass = Class.forName("android.view.View");
Method getListenerInfoMethod = viewClass.getDeclaredMethod("getListenerInfo");
getListenerInfoMethod.setAccessible(true);//授权
//执行方法
Object listenerInfo = getListenerInfoMethod.invoke(view);
//替换 public OnClickListener mOnClickListener; 替换为我们自己的
Class<?> listenerInfoClass = Class.forName("android.view.View$ListenerInfo");
Field mOnClickListenerField = listenerInfoClass.getField("mOnClickListener");
Object mOnClickListenerObj = mOnClickListenerField.get(listenerInfo);//需要对象
//1.监听onClick,当用户点击按钮的时候-->onClick,我们自己要先拦截这个事件,动态代理
//第一个参数:类加载器
//第二个参数:要监听的接口,监听什么接口,就返回什么接口
//第三个参数:监听接口方法里面的回调
Object onClickListenerProxy = Proxy.newProxyInstance(MainActivity.class.getClassLoader()
, new Class[]{View.OnClickListener.class}, new InvocationHandler() {
/**
* void onClick(View v);
*
* @param proxy
* @param method onClick-->method
* @param args View v -->Object[] args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//加入自己的逻辑
Log.i(TAG, "拦截到了OnClickListener方法了");
Button button = new Button(MainActivity.this);
button.setText("同学们大家好...");
//让系统片段,正常的执行下去
return method.invoke(mOnClickListenerObj, button);
}
});
//把系统的mOnClickListener,换成我们自己写的动态代理
mOnClickListenerField.set(listenerInfo, onClickListenerProxy);
}
}
实现效果如下: