前言

xpoedinstall及安装器,它的作用有几个:安装xposed框架、激活xposed模块、搜索模块等等

如果我们已经安装了xposed框架,或者说我们自己二次开发了这个框架,通过手动的方式安装。然后需要使用我们自己的xposed模块,这时xposedinstall的作用就只剩激活模块了,那么我们是否可以摆脱它来激活模块?

源码

先来看看它如何激活模块的

在它的源码中有一个ModuleUtil类,其中

public void setModuleEnabled(String packageName, boolean enabled) {if (enabled)mPref.edit().putInt(packageName, 1).apply();elsemPref.edit().remove(packageName).apply();
}

可以看到将激活的模块的包名存到了sharepreference中,然后还有另外一个类

public synchronized void updateModulesList(boolean showToast) {try {Log.i(XposedApp.TAG, "updating modules.list");int installedXposedVersion = XposedApp.getInstalledXposedVersion();PrintWriter modulesList = new PrintWriter(MODULES_LIST_FILE);PrintWriter enabledModulesList = new PrintWriter(XposedApp.ENABLED_MODULES_LIST_FILE);List<InstalledModule> enabledModules = getEnabledModules();for (InstalledModule module : enabledModules) {if (module.minVersion > installedXposedVersion || module.minVersion < MIN_MODULE_VERSION)continue;modulesList.println(module.app.sourceDir);try {String installer = mPm.getInstallerPackageName(module.app.packageName);if (!PLAY_STORE_PACKAGE.equals(installer)) {enabledModulesList.println(module.app.packageName);}} catch (IllegalArgumentException ignored) {// In rare cases, the package might not be installed anymore at this point,// so the PackageManager can't return its installer package name.}}modulesList.close();enabledModulesList.close();FileUtils.setPermissions(MODULES_LIST_FILE, 00664, -1, -1);FileUtils.setPermissions(XposedApp.ENABLED_MODULES_LIST_FILE, 00664, -1, -1);if (showToast)showToast(R.string.xposed_module_list_updated);} catch (IOException e) {Log.e(XposedApp.TAG, "cannot write " + MODULES_LIST_FILE, e);Toast.makeText(mApp, "cannot write " + MODULES_LIST_FILE + e, Toast.LENGTH_SHORT).show();}
}

这里有一个getEnableModules函数,如下:

public List<InstalledModule> getEnabledModules() {LinkedList<InstalledModule> result = new LinkedList<InstalledModule>();for (String packageName : mPref.getAll().keySet()) {InstalledModule module = getModule(packageName);if (module != null)result.add(module);elsesetModuleEnabled(packageName, false);}return result;
}

可以看到这个函数正是从刚才sharepreference中读取激活的模块包名

然后回到updateModulesList中,可以看到将这些激活的模块的sourceDir保存到MODULES_LIST_FILE这个文件中,即:

private static final String MODULES_LIST_FILE = XposedApp.BASE_DIR + "conf/modules.list";

以上就是xposedinstaller激活模块的流程,可以看到就是将要激活的模块的apk地址保存到一个modules.list文件中。看来真正激活使用模块是在xposedbridge中,在它的main函数中(XposedBridge类)

protected static void main(String[] args) {// Initialize the Xposed framework and modulestry {if (!hadInitErrors()) {initXResources();SELinuxHelper.initOnce();SELinuxHelper.initForProcess(null);runtime = getRuntime();XPOSED_BRIDGE_VERSION = getXposedVersion();if (isZygote) {XposedInit.hookResources();XposedInit.initForZygote();}XposedInit.loadModules();} else {Log.e(TAG, "Not initializing Xposed because of previous errors");}} catch (Throwable t) {Log.e(TAG, "Errors during Xposed initialization", t);disableHooks = true;}// Call the original startup codeif (isZygote) {ZygoteInit.main(args);} else {RuntimeInit.main(args);}
}

主要是XposedInit.loadModules()这句,这个函数的代码:

static void loadModules() throws IOException {final String filename = BASE_DIR + "conf/modules.list";BaseService service = SELinuxHelper.getAppDataFileService();if (!service.checkFileExists(filename)) {Log.e(TAG, "Cannot load any modules because " + filename + " was not found");return;}ClassLoader topClassLoader = XposedBridge.BOOTCLASSLOADER;ClassLoader parent;while ((parent = topClassLoader.getParent()) != null) {topClassLoader = parent;}InputStream stream = service.getFileInputStream(filename);BufferedReader apks = new BufferedReader(new InputStreamReader(stream));String apk;while ((apk = apks.readLine()) != null) {loadModule(apk, topClassLoader);}apks.close();
}

这里可以看到从modules.list文件中读取已激活模块的apk地址,然后执行loadModule将其加载进来,loadModule中会有一些判断,比如说是否有assets/xposed_init文件等等,如果都正常就会将这个apk的class加载进内存中,后续就会调用他们,实际上就是将模块的代码注入到xposedbridge中来使用。这部分代码就不细说了。

(实际上,真正hook都是在xposedbridge中的,如果我们直接在这里写hook代码也是可以的,只是这样就无法灵活修改了。所以我们将hook代码写在apk中,然后在这里将这些类加载进来,然后xposedbridge再调用它的hookLoadPackage之类的代码就可以了)

结论

所以通过上面我们可以知道,我们完全可以抛开xposedinstaller,当我们安装app并打开时,可以自己创建或修改modules.list文件,将自己app加进入就可以了。当然还要重启手机,从上面可以看到,因为加载模块的代码是在main函数中执行的,所以只有重启手机才会再次执行。

当然这个默认的modules.list我们可能需要root权限才能读写,但是如果我们自己二次开发xposed,可以在xposedbridge中将这个文件路径改成sd卡下可以任意读写的路径,这样我们的app就可以随意进行改写了。

或者我们提前准好这个文件手动放到手机中,文件内容是一个未安装的apk的路径,比如/sdcard/123.apk,这样不需要安装应该就可以直接使用。这个我没有测试,效果待验证。

关注公众号:BennuCTech,获取更多干货!

如何实现不安装xpoedinstall激活xposed模块相关推荐

  1. vivo7.0系统机器(亲测有效)激活Xposed框架的教程

    对于喜欢搞机的机友来说,常常会使用到Xposed框架和种种功能牛逼的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活Xposed框架是异常轻松的,但随着系统版本的升级,5.0以后 ...

  2. 三星6.0系统手机最简单激活XPOSED框架的教程

    对于喜欢玩手机的朋友来说,经常会接触到Xposed框架及其种种功能强悍的模块,对于5.0以下的系统版本,只要手机能获得root权限,安装和激活Xposed框架是比较简单的,但随着系统版本的不断更新,5 ...

  3. 华为9.0系统机器一键激活xposed框架的流程

    对于喜欢钻研手机的小伙伴而言,经常会使用到Xposed框架及其种类繁多功能彪悍的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活Xposed框架是非常简易的,但随着系统版本的不断 ...

  4. oppo8.0系统手机(亲测有效)激活xposed框架的教程

    对于喜欢研究手机的伙伴来说,很多时候会使用上XPOSED框架及各类功能极强的模块,对于5.0以下的系统版本,只要手机能获得ROOT权限,安装和激活XPOSED框架是异常轻易的,但随着系统版本的不断升级 ...

  5. 安卓5.0以上设备最简单激活XPOSED框架的步骤

    对于喜欢研究手机的机友而言,经常会使用到Xposed框架及其各类功能强悍的模块,对于5.0以下的系统版本,只要手机能获得ROOT权限,安装和激活Xposed框架是非常简单的,但随着系统版本的持续更新, ...

  6. 魅族8.0系统手机最完美激活xposed框架的步骤

    对于喜欢搞机的小伙伴而言,很多时候会用到xposed框架和种类繁多功能无敌的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活xposed框架是异常轻易的,但随着系统版本的不断迭代 ...

  7. vivo9.0系统设备最简单激活XPOSED框架的步骤

    对于喜欢钻研手机的机友而言,常常会使用到xposed框架及其各类功能彪悍的模块,对于5.0以下的系统版本,只要手机能获得ROOT权限,安装和激活xposed框架是异常简易的,但随着系统版本的不断升级, ...

  8. oppo5.0以上机器(亲测有效)激活Xposed框架的教程

    对于喜欢玩手机的朋友而言,常常会用到xposed框架以及种类繁多功能强大的模块,对于5.0以下的系统版本,只要手机能获得ROOT权限,安装和激活xposed框架是异常简便的,但随着系统版本的迭代,5. ...

  9. 小米9.0系统最简单激活xposed框架的教程

    对于喜欢玩手机的哥们而言,常常会使用上xposed框架及种类繁多功能彪悍的模块,对于5.0以下的系统版本,只要手机能获得ROOT权限,安装和激活xposed框架是比较简单的,但随着系统版本的升级,5. ...

最新文章

  1. Fedora 提出统一流程,弃用上千 Python 2 软件包更可控
  2. 修改代码150万行!Apache Flink 1.9.0做了这些重大修改!(附链接)
  3. linux文件属性解析,Linux操作系统的文件属性与目录配置解析
  4. 二级分类_iOS 13.3正式版,增加信息联系人二级分类,支持联通VoLTE功能
  5. mybatis实现多对多
  6. 手机端测试时用的几个软件
  7. Python基础----Matplotlib_新增
  8. 拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno...
  9. 浏览器崩溃_安装谷歌浏览器后打开网页时出现页面崩溃的解决办法
  10. c语言程序设计辅导资料pdf,第一章 C语言程序设计辅导资料(修订版).pdf
  11. Ipad mini2、苹果5s降级10.3.3教程
  12. Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“的解决办法
  13. python绝对值_python求绝对值的三种方法小结
  14. HiC-Pro | HiC数据处理工具
  15. 人生就是游戏,你如何遵守游戏规则?
  16. 老板用个人手机可以远程监控员工的电脑吗?
  17. 神奇的口袋(回溯DP)
  18. Bert代码详解及模型介绍
  19. 深度学习模型压缩与加速技术(三):低秩分解
  20. 【词目】:勿谓言之不预也

热门文章

  1. SQL Server 2008 BIDS组件的安装
  2. [EffectiveC++]item22:Declare data members private
  3. 【Java面经】非科班渣硕面经
  4. linux指令快速复制粘贴[龟速更新中]
  5. 过滤器Filter(17/4/8)
  6. 无废话WCF系列教程 -- 李林峰
  7. EF中的那些批量操作
  8. 在Delphi7中调试COM
  9. 你可能过于高估了机器学习算法能力,带你解读鲜为人知的数据泄露问题
  10. 牛客小白月赛7 B 自杀游戏