基于Samsung平台CM11.0编译ROM及刷机全过程

如果你想自己编译CM11.0,如果你想刷第三方ROM,那么我将在这篇文章带你一起探讨。也许这篇文章有点偏向与纯技术方面的经验,但对于大家对android编译原理及刷机还是很有帮助的。对于刷机教程那块网上相关资料也很多,我仅点到为止,我相信有兴趣的GG&MM参考本经验可使你少走很多弯路。以下经验本人亲自编译验证,我也希望大家喜欢在自己手机刷上自己编译定制的ROM。

基于Samsung平台CM11.0编译ROM及刷机全过程_第1张图片
基于Samsung平台CM11.0编译ROM及刷机全过程_第2张图片
基于Samsung平台CM11.0编译ROM及刷机全过程_第3张图片
基于Samsung平台CM11.0编译ROM及刷机全过程_第4张图片

工具/原料

  • 一台带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 文件如下:

     

     

     

     

     

    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及刷机全过程_第5张图片
    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及刷机全过程_第6张图片
  3. I9300刷机教程之root

    如果是第一次刷机,官方系统是没法用网上一键ROOT工具进行ROOT的,作者是按照如下方式进行的:

    1、手机先关机. 按住音量加+Home键+电源键, 一秒后放开电源键,这时recovery就成功加载了

    2、选择"install zip from sdcard",选择你下载好的root.zip;

    3、成功后,重启你的手机.

    基于Samsung平台CM11.0编译ROM及刷机全过程_第7张图片
    基于Samsung平台CM11.0编译ROM及刷机全过程_第8张图片
  4. I9300刷机教程之真正刷机

    我们在手机关机的状态下同时按“音量+ + HOME键 + 电源键开机”,这是就可以进入到手机的Recovery系统中了。一般的刷机需要首先双WIPE手机。选择从内部存储介质中安装ZIP刷机包,找到我们拷贝进去的刷机包,按动音量+—进行光标移动,按动电源键就可以进行刷机了。

    按如下图示,就可以完成刷机了。

    基于Samsung平台CM11.0编译ROM及刷机全过程_第9张图片
    基于Samsung平台CM11.0编译ROM及刷机全过程_第10张图片
    基于Samsung平台CM11.0编译ROM及刷机全过程_第11张图片
    基于Samsung平台CM11.0编译ROM及刷机全过程_第12张图片
    基于Samsung平台CM11.0编译ROM及刷机全过程_第13张图片
    基于Samsung平台CM11.0编译ROM及刷机全过程_第14张图片
    基于Samsung平台CM11.0编译ROM及刷机全过程_第15张图片
    END

注意事项

  • 如果编译Android4.4不能用OpenJDK,必须用Oracle JDK1.6,1.7目前是不支持的。
  • 如果是第一次刷机,必须通过在Recovery模式下进行ROOT。
  • 刷机有风险,最好在有一定经验的朋友指导下进行。如果对大家有帮助,请给予支持。

你可能感兴趣的:(android,system)