<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>xposed on HAOUTIL.COM</title><link>https://haoutil.com/categories/xposed/</link><description>Recent content in xposed on HAOUTIL.COM</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 30 Aug 2016 19:17:00 +0800</lastBuildDate><atom:link href="https://haoutil.com/categories/xposed/index.xml" rel="self" type="application/rss+xml"/><item><title>使用Xposed添加自定义系统服务</title><link>https://haoutil.com/posts/xposed-add-custom-system-service/</link><pubDate>Tue, 30 Aug 2016 19:17:00 +0800</pubDate><guid>https://haoutil.com/posts/xposed-add-custom-system-service/</guid><description>Xposed 是 Android 平台上一个著名的框架。基于这个框架，我们可以在不需要 root 的情况下修改（hook）任何系统和 App 的类和方法，正如作者介绍的那样 modify your ROM - without modifying any APK (developers) or flashing (users)!。
Xposed 可以 hook 任何类的任何方法，但是仅限于在方法执行前和执行后加入钩子（hook），而并不能修改方法原有的代码。这在大多是情况是够用的，但是当涉及到多进程时就不行了。举个例子，你 hook 了微信，获取到了微信昵称，想将昵称显示在 QQ 中，如果你想简单的通过一个变量来传值是行不通的，因为微信和 QQ 运行在不同的进程中，在 QQ 进程中获取到的还是变量的初始值。
广播（Broadcast）是解决该问题的一种方法。但是广播的缺点是：1.不能确定什么时候能够收到， 2.创建广播和广播接收者都需要用到 Context ，而在 hook 的类里并不总是有 Context。
最好的方法就是添加一个自定义的系统服务来进行进程间的数据共享。系统服务的优点有：1.服务从开机就启动了，并且一直存活到关机，2.可以简单的通过ServiceManager.getService()来调用。
在正常情况下是不能添加这样的系统服务的，但是我们可以借助 Xposed 来实现。实现进程间通信的服务需要用到 AIDL（Android Interface Definition Language），我们的服务也不例外。
首先，创建 android.os.ICustomService.aidl
package android.os; /** {@hide} */ interface ICustomService { // implemention } 以及它的实现类 CustomService.java
public class CustomService extends ICustomService.Stub { public static void register(final ClassLoader classLoader) { // implemention } } 然后，创建一个 Xposed 模块用于注册服务</description></item></channel></rss>