目錄
1. 場景
2. 下載下傳高通OpenSource代碼
3. 編譯
4. 修改代碼
5. 問題記錄
網上幾乎99.99%都是舊教程(我沒查到一個新的),現在下載下傳網址變了。
親測有效!我的是高通SA8155P晶片。不管什麼晶片流程都是一樣的。
1. 場景
首先看下我們所面臨的問題是否類似:已擷取高通某一子產品的閉源代碼,也就是vendor裡某一子產品。然後你想修改,這時候就需要編譯so驗證。那麼得有個基礎工程吧,也就是opensource代碼。
如果場景一樣,那麼按照下面流程就可以~
2. 下載下傳高通OpenSource代碼
Android for MSM項目允許使用者建構一個基于Android的平台,其中包含針對高通晶片組的其他增強功能。
現在伺服器已經變更了,太老舊的版本已經不再維護,你也找不到。是以如果沒有對應版本找個相近的版本也應該是ok的。
新伺服器:現在可行的方式是在CodeLinaro下載下傳,以前是codeaurora,應該已經不維護了,大坑啊。下面給出網址:
Android for MSM Project | CodeLinaro Wiki
網站裡解釋得很清楚,主要下載下傳指令如下:
repo init --depth=1 -u https://git.codelinaro.org/clo/la/platform/manifest.git -b release -m [manifest] --repo-url=https://git.codelinaro.org/clo/tools/repo.git --repo-branch=qc-stable
repo sync -j8 -c --no-tags
[manifest]從Android releases | CodeLinaro Wiki這裡取,注意,要與你擷取的vendor閉源子產品版本一緻(或相近)。隻修改manifest就可以。
-c, --current-branch fetch only current branch from server.
--no-tags don't fetch tags.
-j 線程數,這個應該你們都懂
這兩項是為了節省下載下傳空間。
不懂 repo 的小夥伴我來給你們講:
repo用法及原理詳解,幹了啥幹了啥_alibli的部落格-CSDN部落格
如果下載下傳過程中報各種錯誤,請檢查你的代理伺服器啥的。
3. 編譯
把你要編譯的高通vendor閉源子產品拷貝到OpenSource對應目錄下,一般是vendor/qcom/,然後運作下面幾條指令:
根目錄下執行:
source build/envsetup.sh
這個會include一些檔案,并且配置編譯環境。
然後,選擇要編譯的系統類型:
lunch
最後,單編譯子產品:
mmm [vendor子產品路徑]
vendor子產品路徑裡要有Android.mk檔案,這個就是編譯用的。
關于m\mm\mmm\mma\mmma這個自己查吧。
最後産物在根目錄的out目錄裡。
4. 修改代碼
編譯成功的情況下,你要開始修改代碼重新編譯了。
需要注意幾點:
第一,如果你要看日志,請把日志開關打開,一般在Android.mk中和源代碼中。有時高通會把列印日志的開關注釋但保留。比如源代碼中:
//#define LOG_NDEBUG 0
Android.mk中:
#LOCAL_CFLAGS += -DENABLE_LOGV
當然具體你的子產品裡怎麼寫的,可能有點差別,還是要認真研究一下。
第二,系統内原so和你自己編的so理論上應該是版本相近,如果遇到找不到symbols等問題,在linux系統中
nm -D [涉及的].so
看下符合表是否一樣。
5. 問題記錄
1. 報錯日志
(native:platform) should not link to lib*** (native:vendor)
(native:platform) can not link to lib*** (native:vendor)
原因:
LOCAL_PROPRIETARY_MODULE是Android vendor module 必須具有的屬性,此屬性聲明将 vendor module放入vendor分區(vendor native),未聲明該屬性的module将放在system分區(platform native),且這兩個分區是不能進行連結的,是以編譯會報兩個LOCAL_MODULE無法連結的錯誤。
解決方法:
報錯位置對應 Android.mk 添加 LOCAL_PROPRIETARY_MODULE := true
該問題修改參考:Android Sensor Issues_HuluOS的部落格-CSDN部落格