本文包括的内容
- 交接的源码包括的内容(3部分)
- android 源码编译工具envsetup.sh
- android源码编译以及环境配置
- 注意事项--报error
- xposed的编译
- xposed编译工具XposedTools
- xposed编译时,xposed源码存放在android源码的位置
- android源码编译后的img文件可以用Img镜像文件工具ext2explore打开
- 不同Android 版本下的xposed源码是不一样(android4.4和其他不一样,xposed对应不同android版本的art是不一样的)
- Linxu下挂着镜像img文件
- 将android 的img文件刷入手机
感谢人员
在整理文档的过程中,发现自己Liuux领域真的太薄弱了,通过整理本笔记,让我恶补Linux领域的不少知识
感谢海哥大神前期做了大量工作,耐心指点
感谢凡老师和洪爷提供的ubuntu软、硬件支持
感谢掌微勇平兄弟引导我对ubuntu的兴趣
目标--整理并学习
- Android 源码编译(4.4、5.1、6.0、7.1),已经ok 通过。xposed编译需要Android源码环境
- 编译XposedBridge.jar(移动Xposed Bridge工程->编译后的Android 源码目录;在envsetup.sh环境中用mmm独立编译XposedBridge-art--->得到XposedBridge.jar( xposed 框架的java层);从github上克隆xposed两个仓库到本地。分别是xposed和art。点击下载zip包,解压压缩包得到xposed文件夹和art文件夹,其中art文件夹用于替换Android 源码中的art文件夹,下载的xposed文件夹移动到/home/Android-5.1.1/frameworks/base/cmds/文件夹下
)
xposed文件夹包括xposed修改之后的app_process等应用程序和libxposed_*.so等库文件的源码;art文件夹主要包括xposed修改之后的art虚拟机的文件。 -
编译XposedInstall:xposed 框架的独立apk,用于管理基于xposed的相关插件。其实作用就是做如下动作(编译后的几个文件copy到Android系统)
编译后的几个文件copy到Android系统
- Xposed(官网下载) : 修改之后的app_process,用于替代系统的 app_process
- 不关心生成的镜像img文件
交接的源码包括的内容
- 1、xposedbaiebridge.jar和Xposed的insatll的编译分成两种一个api的xposedbaiebridge.jar(给插件用的,就是你的项目调用需要的),另外一种是xposedbridge-89


-
2、android6-7部分的源码及xposedTools工具
android6-7部分的源码及xposedTools
-
XposedTools-arm64_android7.1是arm64的sdk编译脚本对应android源码是文件夹android7.1.2_r1文件夹
-
xposed目录中应该是对应各个Android 版本的源码(4.4\5.0\5.1\6.0\7.0\7.1)
-
XposedTools-arm_android7.1 :是XposedTools 的android7.1编译工具及环境(目录中build.pl是编译脚本,该脚本根据build.conf文件里的选项进行编译.build.conf)
- 3、android4.4-5.1部分的源码及xposedTools工具


- 4、Android的源码下包含xposed的源码(如android7.1.2_r1的framework/base/cmd/xposed)

编译环境要求
jdk
- Android M以上是使用openjdk8
- Android L 到 android M使用openjdk7(ndroid5.1源码编译需要使用openjdk,不再使用oracle的jdk)
- Android L以下使用jdk
- gradle 4.6(XposedBridge采用gradle编译)
XposedTools(Xposed art好像是用这个编译)
xposed编译工具XposedTools
一、android源码编译以及环境配置
- 解压
1) 使用7za x android-XXXX.7z -r -o./命令解压android-4.4.4_r1.7z,android-5.0.2_r1.7z,android-5.1.1_r1.7z,android-6.0.1_r72.7z,android-7.0.0_r1.7z,android-7.1.2_r1.7z,如果出现错误请忽略
- 环境配置可以参照如下链接:
- 不同的android版本对应的jdk
Android M以上是使用openjdk8
Android L 到 android M使用openjdk7
Android L以下使用jdk
- 编译
1)编译命令envsetup.sh使用

#初始化编译环境---命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去
source build/envsetup.sh
#选择版本 ---lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局变量。
lunch
#编译android源码 ---就是让8个线程让4个核心竞争的执行
make –j8
注:
- make编译android源码的所有模块,mmm仅编译指定的模块。在使用mmm编译指定模块之前,需要保证之前使用make命令对整个源代码进行编译。
- 编译后会将编译结果放到out文件夹下。
2)版本分别arm,arm64,x86对应的,在lunch时分别选择对应的aosp_arm-eng,aosp_arm64-eng,aosp_x86-eng


编译android源码

编译结果--在./out/target/product/下面

编译后的img镜像文件用Ext2explore打开的情况

注意事项--报error:
1.如果在编译android6.0,android5.1,android5.0时报error:unsupported reloc 43
android6.0执行:
cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/
x86_64-linux/bin/ld
android5.0,android5.1执行
cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/
x86_64-linux/bin/ld
2.如果编译过程中编译报错,请执行
make update-api
-******************************
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
- You can add "@hide" javadoc comments to the methods, etc. listed
in the
errors above.
-
You can update current.xml by executing the following commands:
p4 edit frameworks/base/api/current.xml
make update-api
To check in the revised current.xml, you will need OWNERS
approval.
-******************************
3.编译android4.4时可能出错,主要椒jdk版本布匹造成在,可以用如下命令添加或者切换
添加命令:
sudo update-alternatives --install /usr/bin/javah javah /opt/jdk1.6.0_31/bin/javah 700
sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.6.0_31/bin/javac 700
sudo update-alternatives --install /usr/bin/java java /opt/jdk1.6.0_31/bin/java 700
sudo update-alternatives --install /usr/bin/jar jar /opt/jdk1.6.0_31/bin/jar 700
sudo update-alternatives --install /usr/bin/javap jar /opt/jdk1.6.0_31/bin/javap 700
切换命令:
sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config javah
sudo update-alternatives --config jar
sudo update-alternatives --config javap
错误内容如下:
Import includes file: out/target/product/generic_x86/obj/STATIC_LIBRARIES/android_webview_android_webview_common_gyp_intermediates/import_includes
Traceback (most recent call last):
File "../../base/android/jni_generator/jni_generator.py", line 1103, in <module>
sys.exit(main(sys.argv))
File "../../base/android/jni_generator/jni_generator.py", line 1099, in main
GenerateJNIHeader(input_file, output_file, options)
File "../../base/android/jni_generator/jni_generator.py", line 1012, in GenerateJNIHeader
jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
File "../../base/android/jni_generator/jni_generator.py", line 522, in CreateFromClass
jni_from_javap = JNIFromJavaP(stdout.split('\n'), options)
File "../../base/android/jni_generator/jni_generator.py", line 488, in init
signature=JniParams.ParseJavaPSignature(contents[lineno + 1]))]
File "../../base/android/jni_generator/jni_generator.py", line 147, in ParseJavaPSignature
return '"%s"' % signature_line[signature_line.index(prefix) + len(prefix):]
ValueError: substring not found
external/chromium_org/ui/gl/surface_jni_headers.target.linux-x86.mk:22: recipe for target 'out/target/product/generic_x86/obj/GYP/shared_intermediates/ui/gl/jni/Surface_jni.h' failed
make: *** [out/target/product/generic_x86/obj/GYP/shared_intermediates/ui/gl/jni/Surface_jni.h] Error 1
二、xposed的编译
先上一个xposed编译后的结果图

XposedBaieBridge.jar生成的路径在
out/target/product/generic_x86/system/framework/java
注:generic_x86可能是generic_arm64或者generic
0:配置gradle 环境变量
我的采用android studio自带的gradle,路径在
framework/base/cmds/xposed

1.用Xposed 的art替换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
2.XposedTools工具下载
XposedTools是官方提供的一套工具集,方便用来编译和打包Xposed框架.
git clone https://github.com/rovo89/XposedTools.git
3. 配置每一个android版本都对应xposed_androidXXXX.zip的xposed压缩包。
XposedBridge的代码直接clone即可,没有版本的限制.需要注意与javadir对应.
- 注:xposed_androidXXXX.zip是是网上下载的xposed所有代码的包。(再github上下载后,解压替换到art目录,framework/base/cmds/xposed目录,这是目录是有海哥大神创建的,跟脚本对应)
cd aosp_dir/framework/base/cmds/xposed
git clone https://github.com/rovo89/XposedBridge.git
4. 除了android4.4,android每一个版本都有对应的xposed_art_androidXXXX.zip的art压缩包。
5. 编译前,android源码要先编译一次,对应的x86,arm64,arm
- 在把除android4.4以外的其他版本的art替换成xposed_art_androidXXX.zip压缩包解压的内容,在把xposed_androidXXX.zip解压到framework/base/cmds/下
android-7.1.2_r1/framework/base/cmds/
-
XposedBridge编译生成不签名的apk使用android studio,然后把apk重命名XposedBaieBridge.jar,放到android源码生成的out目录中的out/target/product/generic_x86(或者是generic_arm64或者generic)/system/framework/java中,如果提供给app调用的api,需要执行android studio的gradle project的other中的generateAPI选项,在目录build/api中
-
编译xposed的sdk包时,可以看xposed源码编译与集成--简书
-
编译命令build.pl -x86 arm(或者是x86或者是arm64):sdk版本
#其他网友做法编译native层代码(注意冒号后面接的时sdk版本号,如25)
cd XposedTools_dir
./build.pl -t arm:22
#编译后存放情况/media/weicheng/f3560f2c-f54a-467b-8784-26ef752e388e/android_source/android-7.1.2_r1/out/target/product/generic/system/framework/sdk25/arm

- 编译uninstall时,执行create_uninstaller.pl脚本
11. 如果编译不过是art的问题,请用git命令获取art代码,
git clone https://github.com/rovo89/android_art -b xposed-nougat-mr2 art
注:其中
android7.1 的分支名字:xposed-nougat-mr2
android5.0 的分支名字:xposed-lollipop
android5.1 的分支名字:xposed-lollipop-mr1
android7.0 的分支名字:xposed-nougat
android6.0 的分支名字:xposed-marshmallow
11. out/target/product/generic_x86(或者是generic_arm64或者generic)/system/framework/下会生成一个sdk版本号文件夹里面对应在xposed的sdk
注意事项:
在执行build.pl时,会报Can't locate Config/IniFiles.pm
执行perl -MCPAN -e 'install Config::IniFiles',
perl -MCPAN -e 'install File::Tail'
perl -MCPAN -e 'install File::ReadBackwards'
如果还有其他的请执行apt-cache search XXXXX对应的模块或者perl -MCPAN -e 'install [ModuleName]'
sudo apt-get install libconfig-inifiles-perl
sudo apt-get install libio-all-perl
sudo apt-get install libfile-readbackwards-perl
sudo apt-get install libfile-tail-perl
sudo apt-get install libtie-ixhash-perl
下载、编译XposedInstall.apk
git clone https://github.com/rovo89/XposedInstaller
./gradlew
./gradlew build
# 请使用java 1.8 进行编译
编译Android 和xposed源码后要处理的工作

- 把编译好的xposedbaiebridge.java拷贝到out目录中的指定文件夹,文档上有
- 放好了,然后再执行 xposedtool文件中的build.pl的perl脚本在shell中
- 编译好了在out目录中的sdk目录中生成了xposed的sdk包
- 然后用这个sdk替换xposedinstaller的assert文件夹中的对应sdk,就好了
说明
-
android4.4对应的xposedinstaller2.7,其他android版本用的是xposedinstaller3.1.5版本
-
android4.4的xposedbridge用是xposedbridge-master_54和xposedbridge-master_eclipse_54
-
xposedbaiebridge.jar是由xposedbridge-master_54,xposedbridge-master_eclipse_54,xposedbridge-89这三个工程编译出来的
-
*xposedinstaller的apk是由xposedinstaller2.7,xposedinstaller3.1.5工程编译出来的
-
xposedtool编译有arm,arm64,x86三项对应文件夹,里面有两个脚本注意下build.pl和uninstall_build.pl两个perl脚本执行在shell中
-
xposedbaiebridge.jar的编译分成两种一个api的xposedbaiebridge.jar(给插件用的,就是你的项目调用需要的),另外一种是xposedbridge-89或者是xposedbridge-master_54 编译出来的apk,修改名字为xposedbaiebridge.jar放到我们android源码编译的out目录的那个xposedbaiebridge.jar
-
api的xposedbaiebridge.jar是使用xposedbridge-89或者xposedbridge-master_eclipsed_54编译出来的,后来验证api的xposedbridge-89编译出来的api的xposedbaiebridge.jar适用android4.4到android7.1的插件,也就是说xposedbridge-master_eclipsed_54也可以不用
-
放到有system.img文件的目录中有一个java的文件夹中,你自己搜索一下xposedbaiebridge.jar在out目录中,就知道具体位置了
-
XposedTools-arm64_android7.1是arm64的sdk编译脚本对应android源码是文件夹android7.1.2_r1文件夹
参考文献
xposed源码编译与集成
Android之lunch命令--csdn
Ubuntu 16.04编译Android 7.1.2
xposed源码编译与集成--简书(含将android的img文件刷入手机)
Android的img镜像文件打开、及文件提取- 牛八少爷的专栏- CSDN博客
在linux系统中挂载img镜像文件
Android编译过程详解之一---4篇***
编译xposed源码--android5.1
xposed 的编译-csdn
XposedTools, 这些工具可以用于编译和打包Xposed框架
编译Xposed
网友评论