最近成功把手機從 LineageOS 15.1 無痛升級到 17.1 (沒刪 /data),決定記錄一下過程、在新系統上面使用的工具和安裝方法,一方面避免自己以後需要重做這個流程,另一方面也當作分享和推廣其他人使用 LineageOS。
背景 – LineageOS 15.1
應該是從我買了這隻 Galaxy S7 我就在用 LineageOS 15.1 了,當時似乎已經有 LineageOS 16 ,但因為 Xposed 支援停在 Android 8.1 ,所以我就決定先不升 LineageOS 16。
我之前有在 COSCUP 分享過《加強 Android 隱私的工具和技巧》,裡面有提到,對我來說我覺得 XPrivacyLua 是我不能不用的模組,然後他需要 Xposed ,所以為了他我就一直留在 LineageOS 15.1。
後來我那隻手機型號的 UNOFFICIAL LineageOS 開發者轉移重心到 LOS 16 ,不再更新他的 LOS 15.1 build ,所以為了拿到 Android Security Bulletin,後期我只好自己 build ,還好其實沒很難。
後來知道有厲害的中國開發者做了 EdXposed ,配合 Magisk 和 Riru-core 就可以繼續在 Android 8 以上提供 Xposed 原本提供的系統功能。
最近 LineageOS 17.1 出了,我也找到時間,打算先來測試 LOS 17.1 + EdXposed + XPrivacyLua 的穩定性,如果夠穩定的話就可以升級啦。
Build ROM
Galaxy S7 的 LOS UNOFFICIAL 開發者還蠻認真,更新的很勤勞,幾乎每個月都會出 LOS 17 新的 build 。不過我想說既然我都可以自己 build ,何必用別人編譯的東西。
自己 build 也可以順便確認一下這個開發者寫的 code 的品質怎麼樣,我之前就發現我另一臺手機的 LOS UNOFFICIAL 開發者不是很認真,去他的 repo 看, commit message 根本亂寫,然後還不太會用 git revert ,看他經常在 revert 自己的 revert ,然後有的 revert 還不是真的 revert ,是手動把 code 加回來……
他不會用 git 就算了,我嘗試下載他的原始碼來編譯,居然還編不起來。我跑去聊天群組裡面問他,他就修了修 push 了幾個新 commit,最後我終於 build 起來。但是神奇的事情又發生了,我刷他的 build 就可以開機,我自己的 build 就開不了機 (bootloop) ,嘗試 debug 了許久沒有成果最後逼不得已還是只能用他的 build ,感覺他東西沒完整開源。(不過感覺應該是沒有惡意啦,可能只是不會用 git)(不過後來又發現他只是個法國高中生,不會用 git 就可以 port Android ROM 也是蠻厲害)……另一隻手機的故事扯遠了。
不同裝置 build LOS 的流程幾乎完全一樣,不過對於 UNOFFICIAL 裝置需要的額外動作就是要先抓 local_manifests 的 XML 放到 .repo/local_manifests/roomservice.xml ,然後才繼續 repo init, repo sync,繼續照官方文件的流程操作。
官方文件沒提到的是 LineageOS 17.1 build 需要什麼版本的 OpenJDK,我也沒查到資料,我就隨便猜,先用 OpenJDK 1.9 ,最後 build 成功,證實的確是要用 1.9 。
另一件事情是我原本希望 LOS 15.1 和 17.1 可以共用一個 source tree ,想說既然是 git 應該可以單純 checkout 不同的 branch 成 working copy 就可以,但後來查到資料是說不行,只好分開(找不到資料來源了)。
另外,完成了第一次 repo sync 之後,想要再更新 source tree (用 repo sync)的時候可能會遇到問題,這時候就直接強迫他覆蓋就好: repo sync --force-sync
自己 build 完之後建議用自己的 key 來 sign 這個 build ,官方文件有說明。
安裝 ROM 和 OpenGApps
安裝之前當然記得先做個 Nandroid backup 。
安裝就是很普通的進 recovery 按 install zip ,安裝完 ROM 之後再裝 OpenGApps。
我原本有點擔心,我沒有清除 /data ,不知道這樣直接升級可不可以(而且我還是一次跳兩個大版本),怕有些應用程式會不相容。
升級完,第一次開機證實:不會!原本的應用程式都繼續開心地正常運作。
安裝 Magisk, Riru-core, EdXposed
就直接依照 EdXposed 的說明,依序安裝 Magisk, Riru-core 和 EdXposed 就可以了。
測試 XprivacyLua
根據過去在 LOS 15.1 的經驗,有不少應用程式在受到 XprivacyLua 的限制之後會沒辦法打開。這似乎不太像是應用程式呼叫 API 拿到假資料的時候崩潰,因為我曾經遇過好幾次的神祕狀況是,原本一個受到 XprivacyLua 限制可以正常開啟的應用程式突然打不開(打開馬上當掉),然後我解除了一些 XprivacyLua 限制之後他就可以打開了,實際上看 XprivacyLua 的限制紀錄裡面也沒有顯示應用程式會使用那個打開的限制。並且在 logcat 裡面會有一些看起來跟 ART 有關的 native error (會產生 tombstone 的那種)。我猜測大概是因為 Xposed 在 ART 的 hook 沒有很穩定吧。
所以根據上面的經驗,升級之後我得先測試一下我的應用程式受到 XprivacyLua 限制的時候的穩定性。
測試結果,沒想到, LOS 17.1 + EdXposed + XprivacyLua 的組合,居然比在 LOS 15.1 之下更穩定!
有不少在 LOS 15.1 經常 crash 的應用程式,在 17.1 下,完全不會 crash。
而且,為了穩定性,我在 15.1 的 XprivacyLua 設定裡面經常必須關閉一些限制;在 17.1 ,我把這些限制都重新打開,應用程式竟然還是可以穩定運行!
所以簡單來說在 LOS 17.1 的 XprivacyLua 真的可以想限制什麼 API 就限制什麼,開到爽都不會當機。
不過!有件事情變糟,就是雖然當機的機率降低,但應用程式崩潰的影響似乎變大。在 15.1 應用程式因為 XprivacyLua 限制而當機的時候只會影響單一應用程式(強制關閉),但在 17.1 因為 XprivacyLua 當機的時候經常會直接讓整個系統 reset 重啟。但這原因我也不是很清楚, logcat 看不出所以然。
但總之整體來說我覺得比 LOS 15.1 穩定,所以決定繼續使用 17.1 。
LOS 17.1 設定微調
一開始我注意到電池消耗的速度似乎變快了,不過裝了 BetterBatteryStats 實測了一下耗電速度,又覺得還好,螢幕開著持續使用的狀況下大概 10 分鐘消耗 4% ,螢幕鎖定之後幾乎是完全不耗電,偶爾拿出來使用的話可以輕鬆撐過一整天(12 小時)。
Android 10 換了一個應用程式切換器,從原本應用程式會在畫面上垂直堆疊切換,現在變成一次只顯示一個應用程式,還要水平切換,真的很難用。原本的只要看到對的標題點下去就切換了,新的要滑一下才會顯示上下一個應用程式。網路上查了一下,換回垂直切換器目前似乎沒有解法,只有非原生 launcher 的用戶想要使用原生的切換器,但 Google 不開放權限,所以有人做了模組。
原本在 Android 8 使用的 GCam 版本到 10 也變得不太穩定,試了幾個之後我覺得 Mod8.3b_IDan_v4.7_test2_fixlos17.apk 這個版本最好。安裝之後要打開設定頁,然後重開 app ,設定才會套用,才能開始拍照。