美文网首页framework
ubuntu16.04 下android源码编译以及环境配置(含

ubuntu16.04 下android源码编译以及环境配置(含

作者: 牵手生活 | 来源:发表于2018-11-06 21:48 被阅读86次

本文包括的内容

  • 交接的源码包括的内容(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两个仓库到本地。分别是xposedart。点击下载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
home目录下的xposedbaiebridge.jar和Xposed的insatll
ubuntu下的android studio打开情况
  • 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工具
android4.4-5.1部分的源码及xposedTools工具 XposedTools下的配置文件build.conf
  • 4、Android的源码下包含xposed的源码(如android7.1.2_r1的framework/base/cmd/xposed)
Android源码中的的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. 解压

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,如果出现错误请忽略

  1. 环境配置可以参照如下链接:

Ubuntu 16.04编译Android 7.1.2

  1. 不同的android版本对应的jdk

Android M以上是使用openjdk8

Android L 到 android M使用openjdk7

Android L以下使用jdk

  1. 编译

1)编译命令envsetup.sh使用


android7源码中的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
初始化编译环境source ./build/envsetup.sh 选择版本lunch

编译android源码


编译android源码 make -j16

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


android编译结果

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

img镜像文件打开情况

注意事项--报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:

  1. You can add "@hide" javadoc comments to the methods, etc. listed

in the

  errors above.
  1. 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编译后的结果图


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
运行build.pl脚本时发现需要gradle环境

linux ubuntu安装gradle-csdn

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

  1. 在把除android4.4以外的其他版本的art替换成xposed_art_androidXXX.zip压缩包解压的内容,在把xposed_androidXXX.zip解压到framework/base/cmds/下
android-7.1.2_r1/framework/base/cmds/
  1. 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中

  2. 编译xposed的sdk包时,可以看xposed源码编译与集成--简书

  3. 编译命令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
编译native层代码
  1. 编译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源码后要处理的工作

image.png
  • 把编译好的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

相关文章

网友评论

    本文标题:ubuntu16.04 下android源码编译以及环境配置(含

    本文链接:https://www.haomeiwen.com/subject/lfguxqtx.html