Xposed框架是一款特殊的安卓App,其主要功能是提供一个新的应用平台,玩家们安装Xposed框架后,就能够通过Xposed框架搭建起回的平台安装更多系统级的应用,实现诸多神奇的功能——从使用方面来说,和iOS越狱后的Cydia平台体验类似。
Xposed框架的原理是替换安卓系统/System/bin目录下的文件,从而实现对系统某些功能的接管,进而给予基于Xposed框架开发的App更多权限。
public class MainActivity extends AppCompatActivity {
private TextView tv_ad;
private Button btn_load_ad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_ad = findViewById(R.id.tv_ad);
btn_load_ad = findViewById(R.id.btn_load_ad);
btn_load_ad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_ad.setText(getTTAd());
}
});
}
public String getTTAd(){
return "恭喜你app创建成功!";
}
}
在MainActivity 的布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_ad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你的hook还在等待中"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_load_ad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始hook"/>
</android.support.constraint.ConstraintLayout>
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
compileOnly fileTree(dir: 'mylib', include: ['*.jar'])
}
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="这是我的第一个xposed应用"/>
<meta-data
android:name="xposedminversion"
android:value="54"/>
</application>
注意这里面的三个meta-data标签的name不能错误,不然xposed框架apk无法识别自定义编写的xposed模块。
public class XposedHookUtil implements IXposedHookLoadPackage {
String class_name = "com.hdc.xposeddemo.MainActivity";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
Class clazz = loadPackageParam.classLoader.loadClass(class_name);
XposedHelpers.findAndHookMethod(clazz, "getTTAd", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
return "恭喜你hook成功!";
}
});
}
}
点击run app按钮运行apk,如果android studio 没有找到夜神模拟器,可能是模拟器还没有关联起来。关联方法:cmd 进入命令窗口,执行cd C:\Program Files\Nox\bin,注意cd到你的夜神模拟器的安装路径,之后执行:nox_adb.exe connect 127.0.0.1:62001,然后AS可以关联成功,运行apk。
点击加载广告,这时候显示广告加载成功,因为还有使这个xposed模块工作。
a、打开Xposed框架apk。
b、点击模块,看到里面有刚刚编写的模块,勾选之后重启。
c、重启之后,xposed模块生效,点击加载广告,显示广告被拦截了。