framework

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

2018-11-06  本文已影响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的兴趣


目标--整理并学习

交接的源码包括的内容

home目录下的xposedbaiebridge.jar和Xposed的insatll
ubuntu下的android studio打开情况 android4.4-5.1部分的源码及xposedTools工具 XposedTools下的配置文件build.conf Android源码中的的xposed源码

编译环境要求

jdk


一、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

注:

初始化编译环境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对应.

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

说明


参考文献

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

上一篇 下一篇

猜你喜欢

热点阅读