什么是Xposed
Xposed框架(Xposed Framework)是一套開源的、在Android高權限模式下運行的框架服務,可以在不修改APK文件的情況下影響程序運行(修改系統(tǒng))的框架服務羞海,基于它可以制作出許多功能強大的模塊怯伊,且在功能不沖突的情況下同時運作。 ----- 來源百度搜索
背景
首先般堆,先介紹一下之前項目中使用的抓取通知欄內(nèi)容的一套方案:
-
方案一、自定義繼承 NotificationListenerService 的服務诚啃,并通過監(jiān)聽通知變化回調(diào)獲取通知方式淮摔。
缺點: android5.0以后,存在應用殺死后服務監(jiān)聽收不到的情況始赎,需要重啟手機才能再次使用和橙。
方案二仔燕、使用android輔助功能,自定義繼承 AccessibilityService 的服務魔招,監(jiān)聽系統(tǒng)通知欄的行為變化晰搀,獲取通知。
缺點:應用需要一直停留在前臺办斑,后臺服務容易被系統(tǒng)殺死厕隧,導致監(jiān)聽失敗情況,可以采用兩個服務互為守護解決俄周。
下面介紹一下直接hook系統(tǒng) NotificationManager 的 notify 方法實現(xiàn)全局通知監(jiān)聽吁讨,這種方法通過攔截系統(tǒng)通知方法,截取 Notification 來直接從源頭獲取通知內(nèi)容峦朗。
如何使用
先配環(huán)境
- 安裝android模擬器:Genymotion, 這個模擬器啟動速度快建丧,且系統(tǒng)擁有root權限,使用起來比較流暢波势,具體安裝過程不多提翎朱。當然如果有一臺root的手機就更好了。
下載地址https://www.genymotion.com/- 為模擬器android arm 架構支持(非必須),下載地址
https://github.com/m9rco/Genymotion_ARM_Translation/tree/master/package尺铣,下載后直接拖拽到模擬器中安裝后重啟模擬器即可拴曲。- 安裝Xposed框架下載(andriod 5.0-7.0可用) 下載地址 https://pan.baidu.com/s/1T1s37QowFOVZ9X-ejB8eZg,
下載好的apk凛忿,直接拖拽到模擬器里安裝澈灼,安裝后打開應用,對框架進行激活店溢。
至此叁熔,基本工作已經(jīng)做好,剩下就是開始寫代碼了床牧。
image.png
再寫代碼
1.Xposed模塊創(chuàng)建
使用android studio 創(chuàng)建一個工程荣回,并增加Xposed框架依賴。
compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'
2.hook 系統(tǒng) NotifacationManager 類的notify方法
新建一個類HookTest類實現(xiàn) IXposedHookLoadPackage 方法并重寫 handleLoadPackage 方法戈咳。
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
final Class clazz = XposedHelpers.findClass(
"android.app.NotificationManager", loadPackageParam.classLoader);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
XposedHelpers.findAndHookMethod(clazz, "notify"
, String.class, int.class, Notification.class
, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
XposedBridge.log("methodHookParam.args: " + Arrays.toString(param.args));
Notification a = (Notification) param.args[2];
String aPackage = notification.contentView.getPackage();
String title = "";
String text = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Bundle bundle = notification.extras;
title = (String) bundle.get("android.title");
text = (String) bundle.get("android.text");
XposedBridge.log("loadpackage"+ aPackage);
XposedBridge.log("tickerText" + a.tickerText.toString());
XposedBridge.log("title"+ title);
XposedBridge.log("text"+ text);
}
}
});
}
}
}
3.新建assets目錄心软,并創(chuàng)建文件xposed_init, 文件內(nèi)容為hook類的全類名。
4.AndroidManifest.xml中為application配置meta-data標識為`xposed`框架可識別模塊著蛙。
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="hookNotification測試" />
<meta-data
android:name="xposedminversion"
android:value="54" />
5.運行應用删铃,并在安裝好的xposed框架應用中,找到配置的模塊册踩,并勾選泳姐,重啟后生效。
6.直接看效果暂吉。
6.至此胖秒,hook全局通知完成缎患。具體實現(xiàn)的原理以及xposed的框架這里就不過多介紹了,請自行百度即可阎肝。
項目git地址:https://github.com/lengku8e/XposeDemo