These tools can be used to compile and package the Xposed framework.
Clone or download
rovo89 Require that the installer is aware of FBE on Nougat
File-Based Encryption forces us to use /data/user_de for storing module
lists and other settings. This path is hard-coded in several places,
including the Xposed Installer. However, if the user didn't update the
installer, they'll still be using the legacy path. So add a requirement
to the xposed.prop file that will be checked by the installer and will
ask the user to update.
Latest commit 78173ac Oct 30, 2017

README.md

Xposed Tools

These tools can be used to compile and package the Xposed framework. They are especially useful when it comes to releasing files for various platforms and Android versions. Note that Xposed by itself is quite complicated and not suitable for beginners. You'll need a certain level of experience with C++ and general software development in order to build and modify Xposed by yourself.


General note on forks and custom builds

Xposed is open-source and contributions are very welcome. The files in this repository hopefully make it easier to compile custom versions for testing and improvements. However, please be careful when you publish your own versions. Make clear that it's an unofficial version to avoid confusion, and also remember to give proper attribution. Your version probably still includes 99% or more of the original source code that has been written since 2012, so it wouldn't be fair to make it sound like you did all the work. Also, if you made some fixes or improvements, it's in everyone's interest that you create a pull request and contribute them back to the original project.


Build script (build.pl)

This script can perform the following steps:

  • Compile the native executables (app_process), libraries (libxposed_*.so) and the modified ART runtime.
  • Collect these files and put them into a common output directory.
  • Create the xposed.prop file that serves as label for the published package.
  • Create a flashable ZIP file to install the Xposed framework.

It can also compile the Java part of the framework, called XposedBridge.jar.

You can call ./build.pl --help to get a list of allowed options. Usually, it's enough to specify the -t option, e.g ./build.pl -t arm,x86:21 to build ARM and x86 files for SDK 21 (Android 5.0).

You will need to have Perl installed to run this script. It also requires some Perl modules, some of which might not be pre-installed. Depending on your distribution, you can install them using your OS package manager (like apt-get, packages could be named lib*-perl) or via cpan <modulename>. Please look up the details for your installation yourself.


Build preparations

AOSP source tree

If you have never built the native parts of Xposed before, you obviously need to download the source code. The Xposed source is placed in the complete AOSP source tree, so it's not enough to download just the SDK/NDK. Instead, please follow the official instructions to download the full source of the Android version that you want to build for. If you have done everything right, the command make -j4 app_process should succeed. Please note that I can't support you with these steps.

Xposed source code

Once you have the AOSP source ready, you can integrate the Xposed sources into it. There are at least three ways to do so:

Local manifest

This is probably the easiest way to get started. Go to the root directory of the AOSP directory. Change into the .repo subdirectory and create a folder called local_manifests. Then create a symbolic link to one of the manifests that are included in this repository, e.g. ln -s /path/to/this/repository/local_manifests/xposed_sdk21.xml .. Afterwards, go back to the AOSP root directory and run repo sync again. This will also help to avoid some failures when compiling older Android versions on recent VMs.

Manual cloning

If you're afraid that repo sync might overwrite your changes or for some other reasons you don't want to use it, you can also clone the repositories manually. First, navigate to the framework/base/cmds directory and execute git clone https://github.com/rovo89/Xposed.git xposed. This repository contains the modified app_process executable and the libxposed_*.so files.

For variants that include ART, you will also need to replace art folder. However, you have to be careful that the repo sync command doesn't interfere with the new directory. For this, follow the steps above to activate the remove_art.xml manifest and run repo sync. This should already remove the art directory in the AOSP root, but otherwise, just remove it manually. Then execute git clone https://github.com/rovo89/android_art.git art to download the modified files.

Bind mounting

In case you have many AOSP trees and want to keep the Xposed source in sync for all of them (i.e. make one change and apply it to all SDKs immediately), you can also look into bind mounts. It's basically the same as manual cloning, but you clone the files into a separate directory and then use bind mounts to map them into the AOSP tree. This is a pretty advanced technique, so I won't go into details here.

XposedBridge source code (or prebuilt file)

If you want to compile XposedBridge.jar yourself, clone https://github.com/rovo89/XposedBridge and set the javadir variable accordingly. Make sure that the Gradle build is working fine, the Android SDK and other dependencies need to be installed for this. Then you can call ./build.pl -a java to build and copy the JAR.

If you want to use a prebuilt file instead, copy it to a java subfolder in the outdir that you have configured in build.conf. For example, if outdir is set to /android/out, then the file should be stored in /android/out/java/XposedBridge.jar.


Configuration (build.conf)

The build.pl script requires some configuration. The settings are stored in INI file format in build.conf.
As the configuration is specific to your local machine, it's not included in the GitHub repository. There is, however, a file called build.conf.sample with some examples. You can either copy it to build.conf or create your own file based on it.

[General]

outdir: The output directory for compiled files. All Xposed-specific executables/libraries are copied here, and it's used to store log files and the flashable ZIP. This directory must exist.
javadir: (Optional) The directory that XposedBridge has been checked out to (see above).

[Build]

version: The version number that is stored in the /system/xposed.prop file. It's displayed in various places, e.g. while flashing the ZIP file or in the installer. It's also the API version for Xposed, so please make sure that you use the version number that your build is based on. You're free to add any custom suffix with your own version number. You can use the placeholder %s to insert the current date in YYYYMMDD format.
makeflags: Additional parameters to pass to each make command. The default value is -j4, which enables parallel build with 4 jobs.

[GPG]

sign: (Optional) Might be all to sign all build, or release to sign only release builds (-r parameter) using gpg -ab <file>.
user: (Optional) This is passed as -u parameter to the gpg command, see its man page for allowed formats.

[AospDir]

The parameters in this section tell the build script where the AOSP source trees (see above) are stored for each Android version. The key is the SDK version, the value is the directory.

[BusyBox]

In case you want to compile the specialized BusyBox fork from https://github.com/rovo89/android_external_busybox, you have to add a mapping of platform to an Android SDK version. In the source tree for this SDK version, you have to check out the project into the folder external/busybox.