ubuntu16.04 下android源碼編譯以及環境配置(含xposed)--交接筆記

本文包括的內容

  • 交接的源碼包括的內容(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系統)


  • Xposed(官網下載) : 修改之後的app_process,用於替代系統的 app_process
  • 不關心生成的鏡像img文件

交接的源碼包括的內容

  • 1、xposedbaiebridge.jar和Xposed的insatll的編譯分成兩種一個api的xposedbaiebridge.jar(給插件用的,就是你的項目調用需要的),另外一種是xposedbridge-89

  • 2、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. 解壓

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裏的所有用到的命令加載到環境變量裏去
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:

  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編譯後的結果圖


XposedBaieBridge.jar生成的路徑在
out/target/product/generic_x86/system/framework/java
注:generic_x86可能是generic_arm64或者generic

0:配置gradle 環境變量
我的採用android studio自帶的gradle,路徑在

framework/base/cmds/xposed

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


編譯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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章