綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[資料] Android 9.0 系列編譯方法與心得

[複製連結] 查看: 38483|回覆: 2|好評: 0
跳轉到指定樓層
樓主
djpvd | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2019-8-23 20:06

馬上加入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()
改成如下:
  1. EnforcingStatus StatusFromCmdline() {
  2.     //EnforcingStatus status = SELINUX_ENFORCING;
  3.     EnforcingStatus status = SELINUX_PERMISSIVE;

  4.     import_kernel_cmdline(false,
  5.                           [&](const std::string& key, const std::string& value, bool in_qemu) {
  6.                               if (key == "androidboot.selinux" && value == "permissive") {
  7.                                   status = SELINUX_PERMISSIVE;
  8.                               }
  9.                           });

  10.     return status;
  11. }

  12. bool IsEnforcing() {
  13.     if (ALLOW_PERMISSIVE_SELINUX) {
  14.         return StatusFromCmdline() == SELINUX_ENFORCING;
  15.     }
  16.     //return true;
  17.     return StatusFromCmdline() == SELINUX_PERMISSIVE;
  18. }
複製代碼




下載配置檔案
這是個人的手機配置,可以參考這個,按照你的機型做修改。
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 複製檔案過去之後,要修改權限比較麻煩。




「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)
收藏收藏2 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
rho17 | 收聽TA | 只看該作者
發表於 2019-8-28 06:55
請問樓主 編譯出來的img可以刷機嗎
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
 樓主| djpvd | 收聽TA | 只看該作者
發表於 2019-8-28 07:50
rho17 發表於 2019-8-28 06:55
請問樓主 編譯出來的img可以刷機嗎

刷是可以刷 但是啟動有問題 沒辦法正常進到畫面
我還在研究 ˇ ˇ
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

地板
 樓主| djpvd | 收聽TA | 只看該作者
發表於 2019-8-28 07:51
rho17 發表於 2019-8-28 06:55
請問樓主 編譯出來的img可以刷機嗎

刷是可以刷 但是啟動有問題 沒辦法正常進到畫面
我還在研究 ˇ ˇ
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則