编译xposed源码

1 Android 5.1.1 编译Xposed框架

本文假设你了解android源码编译,git,xposed以及android Native相关知识.有关android源码编译可以参考之前的文章Android 5.1.1源码编译.编译主机环境为ubuntu 16.04 + java 1.8.

1.1 安装jdk 1.8

Ubuntu 16.04默认的的java版本为1.6.编译Xposed框架最新版需要java 1.8.所以从官网下载jdk 1.8,文件名为jdk-7u80-linux-x64.tar.gz,然后执行命令进行手动安装.

cd /opt/
tar –zxvf jdk-8u151-linux-x64.tar.gz
sudo mkdir /usr/lib/jvm
sudo mv ./jdk1.8.0_151 /usr/lib/jvm

然后再export 4个java相关的环境变量.执行java -version确认版本切换是否成功.

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_151
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

1.2 同步xposed源码

1.2.1 XposedTools

XposedTools是官方提供的一套工具集,方便用来编译和打包Xposed框架.

直接从官网clone源码备用.

cd ~
git clone https://github.com/rovo89/XposedTools.git

XposedTools目录下面有两个重要文件.其中build.pl是编译脚本,该脚本根据build.conf文件里的选项进行编译.build.conf.sample是官方提供的编译选项模板,需要自行修改.首先将build.conf.sample更名为build.conf.然后修改outdir,javadir和AospDir,路径要匹配自己的android源码位置.

[General]
outdir = /home/mobsec/Android/aosp_5.1/out
javadir = /home/mobsec/Android/aosp_5.1/XposedBridge

[Build]
# Please keep the base version number and add your custom suffix
version = 65 (custom build by xyz / %s)
# makeflags = -j4

[GPG]
sign = release
user = 852109AA!

# Root directories of the AOSP source tree per SDK version
[AospDir]
22 = /home/mobsec/Android/aosp_5.1
#21 = /android/aosp/500

# SDKs to be used for compiling BusyBox
# Needs https://github.com/rovo89/android_external_busybox
[BusyBox]
arm = 21
x86 = 21
armv5 = 17

1.2.2 xposed

xposed为整个Xposed框架的native部分,主要内容为xposed修改的app_process源码和相关库文件.这里需要提一下,这部分源码有两种同步方式.第一采用修改local_manifests,然后repo sync的方式.第二种则为手动下载合并.本文采用第二种方式.

cd aosp_dir
cd cd frameworks/base/cmds/
git clone https://github.com/rovo89/Xposed.git xposed

1.2.3 android_art

Xposed为了支持新的runtime,修改了art的源码.我们需要把原来的art源码替换成Xposed提供的代码.

cd aosp_dir
rm -rf art
git clone https://github.com/rovo89/android_art.git art
cd art
git checkout xposed-lollipop-mr1

1.2.4 XposedBridge

XposedBridge的代码直接clone即可,没有版本的限制.需要注意与javadir对应.

cd aosp_dir
git clone https://github.com/rovo89/XposedBridge.git

1.3 编译整个框架

编译Native代码的时候需要依赖java层代码的输出文件XposedBridge.jar.可以直接把XposedBridge.jar直接copy到build.conf文件中的outdir/java/路径下进行预编译.也可以手动编译整个XposedBridge.jar.

1.3.1 编译java层代码

编译Xposed java层代码需要配置好android sdk环境.先下载sdk工具,然后解压.

wget http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz

执行list sdk命令查看可以安装的sdk包.-a选项表示列举所有包.安装source的时候才需要使用-a选项.

./android list sdk --extended --proxy-host mirrors.neusoft.edu.cn --proxy-port 80 -s -a

依次安装Android SDK Build-Tools 23.0.3,Android SDK Platform 23.

./android list sdk --extended --proxy-host mirrors.neusoft.edu.cn --proxy-port 80 -s
./android update sdk --no-ui --filter 包id --proxy-host mirrors.neusoft.edu.cn --proxy-port 80 -s

使用带-a参数的list命令,安装source包.

./android list sdk --extended --proxy-host mirrors.neusoft.edu.cn --proxy-port 80 -s -a
./android update sdk --no-ui --filter 包id --proxy-host mirrors.neusoft.edu.cn --proxy-port 80 -s

然后在Xposed目录下,添加local.properties文件.并在其中填写sdk路径.

sdk.dir=/home/mobsec/sdk

XposedBridge采用gradle编译,如果遇到lint error会终止整个编译.我们可以修改lint error或者修改配置忽略lint error.

在XposedBridge/hiddenapistubs/build.gradle文件中的android段落中,添加lintOptions.这样修改之后,当编译遇到lint error时不会终止编译过程.

apply plugin: 'com.android.library'

android {
    // Only build the release variant
    // add fix
    lintOptions {
        abortOnError false
    }
    variantFilter { variant ->
        if (variant.buildType.name != BuilderConstants.RELEASE) {
            variant.ignore = true
        }
    }
}

准备工作完成,直接使用命令编译Xposed java代码.

cd XposedTools_dir
./build.pl -a java

编译成功输出以下日志.

BUILD SUCCESSFUL

Total time: 0.871 secs

Copying APK to XposedBridge.jar...
Skipping non-existent /home/mobsec/Android/aosp_5.1/XposedBridge/app/build/outputs/apk/app-release.apk
Skipping non-existent /home/mobsec/Android/aosp_5.1/XposedBridge/app/build/outputs/apk/app-release-unaligned.apk
/home/mobsec/Android/aosp_5.1/XposedBridge/app/build/outputs/apk/app-release-unsigned.apk => /home/mobsec/Android/aosp_5.1/out/java/XposedBridge.jar

Done!

1.3.2 编译native层代码

cd XposedTools_dir
./build.pl -t arm:22