1. 程式人生 > >Xposed模組開發入門教程

Xposed模組開發入門教程

           前言:在高手如雲的XDA論壇上Xposed框架都被許多開發者譽為“安卓第一神器”。究竟是什麼神奇的能力讓它在眾多APP中脫引而出呢?本文將指引大家完成一個Xposed上最簡單的Demo,讓大家感受一下Xposed的能力。

一、手機環境

1.ROOT過的Android手機(根據手機型號自行ROOT,本文不再詳述)

2.安裝了Xposed框架(沒有Xposed框架的可從此處下載

二、原理

Xposed替換了/system/bin/app_process可執行檔案,在啟動Zygote時載入額外的jar檔案(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),並執行一些初始化操作(XposedBridge

的main方法),然後我們就可以在這個Zygote上下文中進行某些hook操作。

三、開發Xposed模組

1.加入jar包

將XposedBridgeApi-54.jar加入到libs資料夾下,沒有jar包的可從此處下載


2.匯入jar包

在build.gradle的dependencies下加入語句:(單引號內內容為實際jar包所在路徑)

compile files('libs/XposedBridgeApi-54.jar')

3.修改Androidmanifest.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.xposeddemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- 作為xposed模組 -->
        <meta-data
            android:name="xposedmodule"
            android:value="true" />

        <!-- 模組描述 -->
        <meta-data
            android:name="xposeddescription"
            android:value="模組描述" />

        <!-- XposedBridgeApi的最低版本號 -->
        <meta-data
            android:name="xposedminversion"
            android:value="54" />

    </application>

</manifest>

主要在application下加入三個元資料標籤,

xposedmodule表示作為Xposed下的一個模組,value值為true。

xposeddescription表示對本模組的描述,該描述會顯示在安裝好後的程式名稱下方。

xposedminversion表示jar包的最低版本號,我們使用的是54。

4.新建一個類Test,該類實現IXposedHookLoadPackage的介面,程式碼如下:

package com.example.administrator.xposeddemo;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

/**
 * Created by Administrator on 2016/5/10.
 */
public class Test implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        // 列印裝載的apk程式包名
        XposedBridge.log("Launch app: " + loadPackageParam.packageName);
    }
}

該類覆蓋了介面中的handleLoadPackage方法,通過對該方法中的引數loadPackageParam執行某些操作可對實際執行的該apk進行劫持,這裡我們只是簡單地列印包名。

5.指定該模組的執行入口

在/app/src/main/下新建一個assets資料夾:


在該資料夾下新建一個名為"xposed_init"的檔案:


在xposed_init中寫上Test類的入口:


6.將程式進行key簽名後生成apk,然後安裝到手機上。

注:儘量簽名後生成apk安裝,debug執行有時候不行。

安裝完成後通知欄會出現如下圖通知,點選“啟用並重啟”


重啟後Xposed框架的模組下會出現該Demo:


7.Android studio下檢視Tag為“Xposed”的logcat資訊:


結果如我們預想的那樣,logcat下可以看到我們launch的各種app包名。

完整原始碼下載請點選這裡