目录
1.MainActivity.java
public class MainActivity extends AppCompatActivity {
private TextView tv;
private static final String[] permissionsGroup = new String[]{
permission.READ_PHONE_STATE};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
tv.setText("tv");
}
}
2.AndroidManifest.xml
<application>
<meta-data
android:name="xposedmodule"
android:value="true" />
<!--模块说明,一般为模块的功能描述-->
<meta-data
android:name="xposeddescription"
android:value="这个模块是用来检测用户隐私合规的,在用户未授权同意前,调用接口获取信息属于违规" />
<!--模块兼容版本-->
<meta-data
android:name="xposedminversion"
android:value="53" />
</application>
</manifest>
3.build.gradle
provided 'de.robv.android.xposed:api:82'
4. assets 下 xposed_init
包名+文件名
com.klicen.myapplication.XposedInit
5.XposedInit.java
package com.klicen.myapplication;
import android.os.Bundle;
import android.widget.TextView;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import java.lang.reflect.Field;
class XposedInit2 implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
if (lpparam.packageName == "com.klicen.myapplication") {
XposedHelpers.findAndHookMethod("com.klicen.myapplication.MainActivity",
lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Class c = lpparam.classLoader.loadClass("com.klicen.myapplication.MainActivity");
Field field = c.getDeclaredField("tv");
field.setAccessible(true);
XposedBridge.log("Test");
TextView tv = (TextView) field.get(param.thisObject);
tv.setText("new");
}
};
}
}
}
6.XposedInit Kotlin 版本
class XposedInit : IXposedHookLoadPackage {
override fun handleLoadPackage(lpparam: LoadPackageParam) {
if (lpparam.packageName == "com.klicen.myapplication") {
XposedHelpers.findAndHookMethod("com.klicen.myapplication.MainActivity",
lpparam.classLoader, "onCreate", Bundle::class.java, object : XC_MethodHook() {
override fun beforeHookedMethod(param: MethodHookParam) {
super.beforeHookedMethod(param)
}
override fun afterHookedMethod(param: MethodHookParam) {
val c = lpparam.classLoader.loadClass("com.klicen.myapplication.MainActivity")
val field = c.getDeclaredField("tv")
field.isAccessible = true
XposedBridge.log("Test")
val tv = field[param.thisObject] as TextView
tv.text = "new"
}
})
}
}
}
7.效果图
8.学习资料
- Xposed学习资料 : https://juejin.cn/post/6844903593628139528
- VirtualXposed源码 :https://github.com/android-hacker/VirtualXposed/blob/vxp/CHINESE.md
- 工具包下载(必须):https://pan.baidu.com/s/15_QuLmnUhYDXSXaHyGa_8w 1ag9
-
android 获取imei_Android隐私API合规策略及检测方法 https://blog.csdn.net/weixin_42430341/article/details/113043216