基於Samsung平臺CM11.0編譯ROM及刷機全過程

poclist發表於2016-09-17

如果你想自己編譯CM11.0,如果你想刷第三方ROM,那麼我將在這篇文章帶你一起探討。也許這篇文章有點偏向與純技術方面的經驗,但對於大家對android編譯原理及刷機還是很有幫助的。對於刷機教程那塊網上相關資料也很多,我僅點到為止,我相信有興趣的GG&MM參考本經驗可使你少走很多彎路。以下經驗本人親自編譯驗證,我也希望大家喜歡在自己手機刷上自己編譯定製的ROM。

基於Samsung平臺CM11.0編譯ROM及刷機全過程
基於Samsung平臺CM11.0編譯ROM及刷機全過程
基於Samsung平臺CM11.0編譯ROM及刷機全過程
基於Samsung平臺CM11.0編譯ROM及刷機全過程

工具/原料

  • 一臺帶SSD硬碟高配置電腦,Ubuntu 12.04 64位Server版。(或使用windows下的虛擬機器執行ubuntu)。
  • 20M光釺Internet連線,實際網速得2M以上最好。因為設定過程中需要下載30G左右的資料。
  • 一部手機,作者使用的Samsung-I9300。
  • 需對刷機\LINUX操作\安卓系統比較熟悉,太過小白的不建議自己編譯。

方法/步驟---基於Samsung平臺CM11.0編譯ROM

  1. 1

    一、環境搭建

    1.1 安裝JDK和Toolchain

    先把prebuilt-2b5cdec. tar.gz和jdk-6u26-linux-x64.bin拷貝到使用者的Home目錄.

    cd /opt

    sudo tar xvf ~/prebuilt-2b5cdec.tar.gz

    sudo mv prebuilt-2b5cdec arm-eabi-4.4.3

    chmod +x ~/jdk-6u26-linux-x64.bin

    sudo ~/jdk-6u26-linux-x64.bin

    1.2 安裝MTK Android編譯環境

    sudo apt-get update        #更新一下軟體倉庫列表

    sudo apt-get install git-core gnupg flex bison gperf build-essential \

    zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \

    x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev \

    libgl1-mesa-dev gcc-4.4 g++-4.4 gcc-4.4-multilib \

    g++-4.4-multilib mingw32 tofrodos python-markdown \

    libxml2-utils xsltproc wine

    sudo rm /bin/sh

    sudo ln -s /bin/bash /bin/sh #修改default sh link to bash

    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20

    sudo update-alternatives --config gcc

    sudo update-alternatives --config g++

    1.3 完善JDK配置:

    sudo update-alternatives --install /usr/bin/java java /opt/jdk1.6.0_26/bin/java 300 

    sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.6.0_26/bin/javac 300 

    sudo update-alternatives --install /usr/bin/javah javah /opt/jdk1.6.0_26/bin/javah 300

    sudo update-alternatives --install /usr/bin/javap javap /opt/jdk1.6.0_26/bin/javap 300

    sudo update-alternatives --install /usr/bin/jar jar /opt/jdk1.6.0_26/bin/jar 300

    sudo update-alternatives --install /usr/bin/javadoc javadoc /opt/jdk1.6.0_26/bin/javadoc 300

    驗證:

    sw06@sw06:/home/data/work$ java -version

    java version "1.6.0_26"

    Java(TM) SE Runtime Environment (build 1.6.0_26-b03)

    Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

    1.4 安裝Repo功能

    在下載之前配置下hosts服務

    sw06@sw06:/home/data/work$ sudo vim /etc/hosts

    74.125.31.82    android.googlesource.com

    74.125.31.82    www.googlesource.com

    203.208.46.172  cache.pack.google.com

    59.24.3.173     cache.pack.google.com

    通過一下命令安裝 "repo" 工具,注意安裝路徑的許可權,可能需要修改相關資料夾許可權。

    curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

    chmod a+x ~/bin/repo 

    提示:你可能需要重啟電腦才能生效。

  2. 2

    二、下載原始碼並編譯

    2.1 新建目錄

    sw06@sw06:/home/data/work $ mkdir -p cmandroid

    cd cmandroid

    2.2通過repo下載CM-11.0最新原始碼

    sudo repo init -u git://github.com/CyanogenMod/android.git -b cm-11.0

    $ repo sync

    等待下載……

    下載過程很長,並且還有下載一半中斷的情況,多下幾次,確保下載完成,硬碟要準備足夠大。大概20G。

    sw06@sw06:/home/data/work/test/cmandroid$ du -sc

    21853416        .

    21853416        total

    如果下載過程中報錯,修改/.repo/local_manifests/ local_manifest.xml 檔案如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <manifest>

      <project name="CyanogenMod/android_device_samsung_i9300" path="device/samsung/i9300" remote="github" />

      <project name="CyanogenMod/android_device_samsung_smdk4412-common" path="device/samsung/smdk4412-common" remote="github" />

      <project name="CyanogenMod/android_kernel_samsung_smdk4412" path="kernel/samsung/smdk4412" remote="github" />

      <project name="CyanogenMod/android_packages_apps_SamsungServiceMode" path="packages/apps/SamsungServiceMode" remote="github" />

      <project name="CyanogenMod/android_hardware_samsung" path="hardware/samsung" remote="github" />

    </manifest>

    2.3 get-prebuilts

    $ cd cmandroid /vendor/cm

    $ sudo ./ get-prebuilts  //(這一步是為了下載Term.apk並解壓到當前propritary目錄) (只需執行一次,以後編譯無需執行)

    2.4 breakfast i9300

    $ source build/envsetup.sh

    $ breakfast i9300

    //(這一步會自動從github下載   三星I9300裝置的驅動和核心; 注意必須是CM官方支援升級到cm11.0的裝置才能使用這個命令下載到//核心和驅動!!!) (只需執行一次,以後編譯無需執行)

    錯誤1:

    不要想著這兩個命令了,由於網路原因,breakfast這個命令基本上是行不通的。這步會報錯, 因為找不到device i9300。

    解決辦法:

    直接到

    https://github.com/CyanogenMod/android_device_samsung_i9300 https://github.com/CyanogenMod/android_device_samsung_smdk4412-common

    下載後解壓到 /device/samsung/i9300和/device/samsung/smdk4412-common

    git clone https://github.com/CyanogenMod/android_device_samsung_i9300 -b cm-11.0

    其它裝置可以參考

    https://github.com/CyanogenMod/android_device_samsung_裝置名 從github上下載。

    手機上刷9300  cm11.0的rom 並連線上手機,之前要安裝android sdk,

     錯誤2:

    IOError: [Errno 13] Permission denied: '.repo/local_manifests/roomservice.xml'

    build/core/product_config.mk:238: *** _nic.PRODUCTS.[[device/samsung/i9300/cm.mk]]: "vendor/samsung/smdk4412-common/common-vendor.mk" does not exist.  Stop.

     

    ** Don't have a product spec for: 'cm_i9300'

    ** Do you have the right repo manifest?

    解決辦法:主要是修改檔案許可權chmod 664 .repo/local_manifests/roomservice.xml

     

    錯誤3:

    urllib2.HTTPError: HTTP Error 403: Forbidden

    build/core/product_config.mk:238: *** _nic.PRODUCTS.[[device/samsung/i9300/cm.mk]]: "vendor/samsung/smdk4412-common/common-vendor.mk" does not exist.  Stop.

    解決辦法:

    手動下載proprietary_vendor_samsung,copy資料夾i9300和 smdk4412-common到vendor/samsung/目錄下。

     

    2.5 extract-files.sh

    cd ~/ home/data/work/cmandroid/device/samsung/i9300

    chmod a+x extract-files.sh

    $ sudo ./extract-files.sh

     首先連線好samsung S3手機,然後來到 /device/samsung/i9300 這個目錄下,執行上面的指令。 這個指令碼的主要作用是將手機中的驅動so庫pull出來,然後新建 /vendor/samsung/i9300這個目錄,然後在裡面放相應的庫檔案。

     ok,執行,首先報錯。

    錯誤1:

    build/core/product_config.mk:238: *** _nic.PRODUCTS.[[device/samsung/n8000/cm.mk]]: "device/samsung/n80xx-common/n80xx-common.mk" does not exist。 停止。

     ** Don't have a product spec for: 'cm_n8000'

    ** Do you have the right repo manifest?

    解決方法:

     https://github.com/CyanogenMod/android_device_samsung_smdk4412-common

     這裡面將 n80xx-common 驅動包下載下來,放到/device/samsung/smdk4412-common

     這個目錄下,這個目錄本身是沒有的,需要新建。

    chmod +x  android-cm-10.2/device/samsung/smdk4412-common/extract-files.sh

    繼續執行 ./extract-files.sh 這個命令

    錯誤2:

    remote object '/system/vendor/lib/libWVStreamControlAPI_L1.so' does not exist

    remote object '/system/vendor/lib/libwvdrm_L1.so' does not exist

    618 KB/s (58560 bytes in 0.092s)

    解決辦法:

    可以直接將/device/samsung/smdk4412-common/下的東東拷貝到/vendor/samsung/ smdk4412-common/proprietary/system/目錄下;將/device/samsung/i9300/下的東東拷貝到/vendor/samsung/ i9300/proprietary/system/目錄下;

     錯誤3:

    remote object '/sbin/cbd' does not exist remote object '/system/bin/bcm4330B1_murata.hcd' does not exist remote object '/system/bin/bcm4330B1_semcosh.hcd' does not exist remote object '/system/etc/wifi/bcmdhd_apsta.bin' does not exist remote object '/system/etc/wifi/bcmdhd_mfg.bin' does not exist remote object '/system/etc/wifi/bcmdhd_p2p.bin' does not exist remote object '/system/etc/wifi/bcmdhd_sta.bin' does not exist remote object '/system/lib/libfactoryutil.so' does not exist remote object '/system/lib/libomission_avoidance.so' does not exist remote object '/system/lib/libsecnativefeature.so' does not exist

     關於錯誤3 有兩種解決方法,第一種是從

    https://github.com/DonkeyCoyote/proprietary_vendor_samsung

    連結下面的檔案包含了目前三星裝置絕大部分的device驅動包。  

     下載到驅動包,然後將缺少的so adb push到手機裡面,然後再./extract-files.sh出來,另外一種是 直接拷貝到相應的 /vendor/samsung/ 目錄下,第二種比較方便,但是可能需要自己新建資料夾,第一種比較自動化,也不容易錯誤。

    2.6真正編譯

    前面工作主要是為編譯打好基礎,進行編譯平臺的配置,然後可以開始按照官方文件進行編譯了。

    $ export USE_CCACHE=1

    $ croot

    $ brunch i9300

    不幸的是,編譯會報錯:

    錯誤1:

    build/core/product_config.mk:238: *** _nic.PRODUCTS.[[device/samsung/n8000/cm.mk]]: "hardware/samsung/exynos4x12.mk" does not exist。 停止。

     ** Don't have a product spec for: 'cm_n8000'

    ** Do you have the right repo manifest?

     No such item in brunch menu. Try 'breakfast'

    解決辦法:缺少samsung硬體基礎庫。

    https://github.com/CyanogenMod/android_hardware_samsung  下載後將裡面的檔案替換到 hardware/samsung/下面。

     錯誤2:

    Export includes file: external/sepolicy/tools/Android.mk -- /sda5-194G-data/android-cm-10.2/out/host/linux-x86/obj/EXECUTABLES/checkseapp_intermediates/export_includes

    Notice file: external/sepolicy/NOTICE -- /sda5-194G-data/android-cm-10.2/out/target/product/n8000/obj/NOTICE_FILES/src//root/seapp_contexts.txt

    make: *** 沒有規則可以建立“/sda5-194G-data/android-cm-10.2/out/target/product/n8000/root/sbin/cbd”需要的目標“vendor/samsung/smdk4412-common/proprietary/sbin/cbd”。 停止。

    make: *** 正在等待未完成的任務....

    Notice file: external/sepolicy/NOTICE -- /sda5-194G-data/android-cm-10.2/out/target/product/n8000/obj/NOTICE_FILES/src//root/sepolicy.txt

    解決辦法: 從那個https://github.com/DonkeyCoyote/proprietary_vendor_samsung

    下載的proprietary_vendor_samsung-android-4.3/smdk4412-common/proprietary/sbin/cbd

    目錄下找找cbd,copy到指定目錄。這裡最好是把system目錄下的東西也都替換掉。

     錯誤3:

    /usr/bin/ld: cannot open output file external/powertop/csstoh: Permission denied

    collect2: ld returned 1 exit status

    target Generated: libart <= art/runtime/thread.h

    make: *** [external/powertop/css.h] Error 1

    make: *** Waiting for unfinished jobs....

    解決辦法:

    修改external/powertop目錄許可權:chmod 775 external/powertop

     

  3. 3

    三、編譯完成和下載

    開始真正的編譯,大概3個小時左右編譯完成。

    可以看到編譯後包:out/target/product/i9300/cm-11-20140505-UNOFFICIAL-i9300.zip

    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    END

方法/步驟--- SAMSUNG I9300之CM ROM刷機教程

  1. I9300刷機教程之4個檔案

    三星USB驅動—SAMSUNG_USB_Driver_for_Mobile_Phones.exe

    Odin 3.07.rar—刷機平臺,解壓後先放著

    CF-SGS3-CWM-v5.5-v1.2.tar—這個檔案別解壓,檔案字尾是tar,我們用它來刷recovery分割槽

    root.zip—獲取root的命令和安裝包

  2. I9300刷機教程之關機,開始刷recovery

    1、開啟Odin3,此時你的手機先不要連線USB;

    2、點選軟體內的PDA,把下載的CF-SGS3-CWM-v5.5-v1.2.tar選上;

    3、檢查下左側的一些配置:勾選“自動重啟”、“復位時間”兩項;點選PDA按鈕,選擇從剛才下載後解壓出來的recovery檔案,檔案是tar格式的;CF-SGS3-CWM-v5.5-v1.2.tar。如圖:

    4、手機先關機狀態,然後同時按住音量下+Home鍵+電源鍵;

    5、這時你看到一個警告,選擇continue,按一下音量上鍵;

    6、插入你的手機,然後點開始刷機;7、成功後重啟了,恭喜你,你完成了第一步。

    基於Samsung平臺CM11.0編譯ROM及刷機全過程
  3. I9300刷機教程之root

    如果是第一次刷機,官方系統是沒法用網上一鍵ROOT工具進行ROOT的,作者是按照如下方式進行的:

    1、手機先關機. 按住音量加+Home鍵+電源鍵, 一秒後放開電源鍵,這時recovery就成功載入了

    2、選擇"install zip from sdcard",選擇你下載好的root.zip;

    3、成功後,重啟你的手機.

    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    基於Samsung平臺CM11.0編譯ROM及刷機全過程
  4. I9300刷機教程之真正刷機

    我們在手機關機的狀態下同時按“音量+ + HOME鍵 + 電源鍵開機”,這是就可以進入到手機的Recovery系統中了。一般的刷機需要首先雙WIPE手機。選擇從內部儲存介質中安裝ZIP刷機包,找到我們拷貝進去的刷機包,按動音量+—進行游標移動,按動電源鍵就可以進行刷機了。

    按如下圖示,就可以完成刷機了。

    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    基於Samsung平臺CM11.0編譯ROM及刷機全過程
    END

注意事項

  • 如果編譯Android4.4不能用OpenJDK,必須用Oracle JDK1.6,1.7目前是不支援的。
  • 如果是第一次刷機,必須通過在Recovery模式下進行ROOT。
  • 刷機有風險,最好在有一定經驗的朋友指導下進行。如果對大家有幫助,請給予支援。

相關文章