馬上加入Android 台灣中文網,立即免費下載應用遊戲。
您需要 登錄 才可以下載或查看,沒有帳號?註冊
x
本帖最後由 djpvd 於 2019-8-24 07:50 編輯
編譯系統建議使用 Linux 2018 年以後的版本,如果有在編譯 Android 7/8 那建議用 Kali Linux,因為套件庫的套件比較齊全,openjdk 8 跟 9 都有。
Kali Linux 2018.1 私人訂製版本
http://mintfans.pixnet.net/blog/post/341115740-lmde---kali-2018-1
Kali Linux 官方版https://www.kali.org/downloads/
Kali 是基於 Debian,套件比 Debian 還多,也包含一些 Android 的反編譯工具套件。
穩定度我個人覺得比 Ubuntu 好很多。
官方版是滾動式更新的,所以套件可能太新。私人訂製版本,套件倉庫固定在 2018.2 的版本,剛好 openjdk 8 跟 9 都有。
** 安裝編譯工具
sudo apt-get update
sudo apt install openjdk-9-jdk
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
** 安裝 repo
curl https://storage.googleapis.com/git-repo-downloads/repo > repo
chmod 755 repo
sudo mv repo /usr/bin/repo
** 下載 Android 9.0 系列原始碼
以下任選版本:
* Google Android 9.0
mkdir -p android-9.0
cd android-9.0
repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r47
repo sync
* LineageOS 16.0
mkdir -p lineage-16.0
cd lineage-16.0
repo init -u https://github.com/LineageOS/android.git -b lineage-16.0
repo sync
* Omnirom 9.0
mkdir -p omnirom-9.0
cd omnirom-9.0
repo init -u git://github.com/omnirom/android.git -b android-9.0
repo sync
** Patch for 9.0:
* 編譯 32-bit armv7 Patch
例如 armv8 的處理器, 要編譯 armv7 的版本就需要打這個補丁
sed -i "s/ARCH_VARIANT := armv8-a/ARCH_VARIANT := armv7-a-neon/g" build/make/core/combo/TARGET_linux-arm.mk
* 關閉 SELinux
打開 system/core/init/selinux.cpp
找到 EnforcingStatus StatusFromCmdline() 與 bool IsEnforcing()
改成如下:
- EnforcingStatus StatusFromCmdline() {
- //EnforcingStatus status = SELINUX_ENFORCING;
- EnforcingStatus status = SELINUX_PERMISSIVE;
- import_kernel_cmdline(false,
- [&](const std::string& key, const std::string& value, bool in_qemu) {
- if (key == "androidboot.selinux" && value == "permissive") {
- status = SELINUX_PERMISSIVE;
- }
- });
- return status;
- }
- bool IsEnforcing() {
- if (ALLOW_PERMISSIVE_SELINUX) {
- return StatusFromCmdline() == SELINUX_ENFORCING;
- }
- //return true;
- return StatusFromCmdline() == SELINUX_PERMISSIVE;
- }
複製代碼
下載配置檔案
這是個人的手機配置,可以參考這個,按照你的機型做修改。
wget https://github.com/Mint-Fans/linux-package/raw/Android/device_twm_a55.tar.gz
tar zxvf device_twm_a55.tar.gz
解壓縮後放到原始碼目錄內
** 編譯
sudo -s
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export USE_CCACHE=1
ccache -M 50G
export CCACHE_COMPRESS=1
source build/envsetup.sh && lunch TaiwanMobile_Amazing_A55-eng
make -j$(nproc) bootimage
make -j$(nproc) recoveryimage
export LANG=zh_TW.UTF-8
export LANGUAGE=zh_TW.UTF-8
make -j$(nproc) systemimage
make -j$(nproc) vendorimage
按照這個順序編譯,感覺會快一點,中間不要做 make clean 或者刪除 out 的動作
後面編譯 system.img 會有編碼問題,所以把 LANG 改成 zh_TW.UTF-8,就可以完成編譯。
硬碟空間大約空出150GB 比較夠用,原始碼下載好之後可以刪除目錄下的隱藏資料夾 .repo 以節省空間。最好是另外割出一個150GB的分割區來編譯。
下載原始碼大約要5小時左右,看網路頻寬而定。編譯的話各版本不一定,omnirom-9.0 最快 7小時完成,編譯很順暢。Google Android 9.0 編譯起來感覺很慢,7小時還沒完成。LineageOS 16.0 目前還沒編過不曉得。
Google Android 9.0 在編譯時 會因為找不到預編的 kernel 然後編譯中斷,這時候要手動把 Kernel 複製到 out/target/product/裝置名稱/ 目錄內。然後繼續 make, 就可以完成 boot.img 跟 recovery.img 的打包。omnirom-9.0 則沒這個問題。
kernel 多半因為沒有原始碼,或找不到部份驅動, 而沒辦法編譯,基本上提取原來 boot.img 裡面的 kernel 就可以了。
編譯完成後,還需要提取原來系統裡面的驅動模塊,跟一些廠商自訂檔案,放到新編好的ROM裡面,這個要自己去判斷哪些檔案了,因為每個廠牌各型號都不一樣。
之所以建議用 Linux 是因為編好的 Image 都是 ext4 格式(boot.img 跟 recovery.img 除外),在 Linux 底下就可以直接掛載修改。用 Windows 複製檔案過去之後,要修改權限比較麻煩。
|
|