您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
Xposed框架的使用--简单入门
 
   次浏览      
 2019-3-1  
 
编辑推荐:
本文来自csdn,Xposed框架(Xposed Framework)是一套开源的、在Android高权限模式下运行的框架服务,可以在不修改APK文件的情况下影响程序运行的框架服务.

##Xposed框架的使用

###1.xposed是什么?

框架是一款开源框架,其功能是可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed 就好比是 Google 模块化手机的主体,只是一个框架的存在,在添加其他功能模块(Modules)之前,发挥不了什么作用,但是没了它也不行。也正因为如此,Xposed 具有比较高的可定制化程度。Moto X 用户可定制手机的外观、壁纸、开机动画等,Xposed 则允许用户自选模块对手机功能进行自定义扩充。

###2.xposed框架的使用

xposed的主要作用是hook应用方法,动态劫持方法的运行。xposed的使用需要xposed框架.apk和XposedBridgeApi-54.jar配合使用 。而xposed框架apk可以看成是个Xposed 框架的管理工具,在这里可以安装、更新Xposed 框架,也可以卸载Xposed 框架,查看安装日志。也可设置Xposed 框架安装器是否联网更新框架及模块。

xposed框架.apk需要root权限,所以需要一台root后的手机或者模拟器,这里推荐使用模拟器即可。首先下载一个模拟器,常用的模拟器有bluestacks蓝叠,夜神模拟器,genemotion等,由于genemotion的cpu框架是x86的,很多应用无法运行,所以选择了夜神模拟器。下载地址:https://www.yeshen.com/。下载安装之后如下界面:

模拟器是自带root权限的,下面下载xposed框架.apk

链接: https://pan.baidu.com/s/1QjQ2CG1Br2SUoGbgHoRfTA 密码: imt4!

下载完成后直接拖到模拟器上安装,安装之后打开apk,点击框架,进去点击安装更新:

授予root权限,然后重启模拟器。xposed框架apk可以工作了,但是现在只是安装好了xposed框架apk,并没有任何hook模块工作。hook模块可以自己去下载,也可以自己编写模块。

###3.xposed模块的编写

下面通过简单的demo演示如何编写一个xposed模块,来hook住我们想要hook的方法。这里就hook自己的app的一个加载广告的代码,来动态拦截广告的加载。

1.使用AS新建一个项目XposedDemo:

2.在MainActivity 模拟加载广告的代码,正常点击加载广告按钮,会加载广告,但是使用xposed对该方法进行hook之后,可以改变这个方法的执行:

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 "广告加载成功";
}
}

 

在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="等待广告加载"
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="加载广告"/>
</android.support.constraint.ConstraintLayout>

 

2.下载XposedBridgeApi-54.jar的依赖包,地址

https://pan.baidu.com/s/1HfDapCF0rLxKa_HIZ9orew

密码:iy2p 下载完成后在app目录下创建文件夹mylib(名字随意),并把XposedBridgeApi-54.jar复制到mylib下面,注意不能直接放到lib里面,然后再app的build.gradle的dependencies加上provided fileTree(dir: ‘mylib’, include: [’.jar’]),或者compileOnly fileTree(dir: ‘mylib’, include: [’.jar’]),根据你的gradle版本选择。

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'])
}

 

3.修改AndroidManifest.xml文件,在applicatio标签下面加入以下标签:

<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模块。

4.编写hook工具类XposedHookUtil对getTTAd方法进行拦截替换,XposedHookUtil实现IXposedHookLoadPackage接口,复写handleLoadPackage方法,并替换原有的getTTAd方法,来进行拦截。

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 "广告被拦截了";
}
});
}
}

 

5.在main文件夹下创建文件夹assets,并在assets下面创建xposed_init文本文件,注意这里文件名必须是xposed_init。并在xposed_init里面添加hook工具类的完整包名路径:com.hdc.xposeddemo.xposed.XposedHookUtil

6.运行apk

点击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模块工作。

7.安装xposed模块

打开Xposed框架apk,

点击模块,看到里面有刚刚编写的模块,勾选之后重启:

重启之后,xposed模块生效,点击加载广告,显示广告被拦截了:

###总结

总的来说此demo也借鉴了许多前人的经验,至此xposed框架的基本使用已经完成。如有错误,欢迎指正。

---------------------

 

   
次浏览       
相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程