一、环境搭建
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.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个小时左右编译完成。
可以看到编译后包:out/target/product/i9300/cm-11-20140505-UNOFFICIAL-i9300.zip
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的命令和安装包
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、成功后重启了,恭喜你,你完成了第一步。
I9300刷机教程之root
如果是第一次刷机,官方系统是没法用网上一键ROOT工具进行ROOT的,作者是按照如下方式进行的:
1、手机先关机. 按住音量加+Home键+电源键, 一秒后放开电源键,这时recovery就成功加载了
2、选择"install zip from sdcard",选择你下载好的root.zip;
3、成功后,重启你的手机.
I9300刷机教程之真正刷机
我们在手机关机的状态下同时按“音量+ + HOME键 + 电源键开机”,这是就可以进入到手机的Recovery系统中了。一般的刷机需要首先双WIPE手机。选择从内部存储介质中安装ZIP刷机包,找到我们拷贝进去的刷机包,按动音量+—进行光标移动,按动电源键就可以进行刷机了。
按如下图示,就可以完成刷机了。