本文包括的內容
- 交接的源碼包括的內容(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系統)
- 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) 使用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裏的所有用到的命令加載到環境變量裏去
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
編譯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