1. 介绍

本文介绍了i9100手机CyanogenMod 13系统的编译方法

2. 系统要求

笔者使用的环境为CentOS-7-x86_64, 用来为i9100编译CM 13,
之所以选择最新版的CM是发现编译CM 9.1.0时遇到了无法解决的问题
需要说明的是必须使用64的系统, 而且配置越高越好

TIP: CentOS默认不支持NTFS访问, 需要安装ntfs-3g模块

$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ yum install ntfs3g

先介绍两个非常有用的命令:
查看当前目录下各文件夹包含文件的大小

$ du -h --max-depth=1

查看当前网络流量(已经编译好的ifstat)

$ ifstat

2. 环境准备

环境准备主要是指一些必要软件的安装

2.1 android tools

编译CM必备的android tools是adb和fastboot

安装adb工具, 到如下路径下载安装后将路径添加到PATH

2.2 schedtool

这个工具在后面编译的时候会用到

$ rpm -Uvh http://packages.psychotic.ninja/7/base/x86_64/RPMS/schedtool-1.3.0-12.el7.psychotic.x86_64.rpm

2.3 Packet

一些必要的packet

# yum install bison curl flex git gnupg2 libxml2 gperf lzop maven pngcrush squashfs-tools zip  glibc.i686 libstdc++.so.6 lzma

安装maven的时候会把依赖的openjdk-1.7一起安装到系统中

2.4 JDK

JDK和CM版本对应关系如下:

- CyanogenMod  - :        Sun/Oracle Java SE 1.6
- CyanogenMod 10.1: Sun/Oracle Java SE 1.6 or 1.7
- CyanogenMod 10.2 - 11.0: Sun/Oracle Java SE 1.6 or 1.7
- CyanogenMod 12.0 - 13.0: OpenJDK 1.7 (see note about OpenJDK 1.8 below)

TIP:  Enable experimental OpenJDK 1.8 support in CyanogenMod 13.0 (not available in earlier version). To enable OpenJDK 1.8 support, add this line to your $HOME/.bashrc file: export EXPERIMENTAL_USE_JAVA8=true.

系统默认安装的是OpenJDK 1.8, 但是编译成功的的则是OpenJDK 1.7;安装完后需要配置环境变量, 在执行编译前输出如下环境变量

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk/
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

3. 源码下载

CM的源码一部分使用Google的aosp, 另一部分则存放在github上.
因为众所周知的原因, Google我们是上不了的, 下面会介绍替代方法

3.1 创建目录

$ mkdir -p ~/bin
$ mkdir -p ~/android/system

3.2 安装repo命令

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

将$(HOME)/bin加入环境变量PATH中
修改repo文件, 防止google无法访问

$ vi $(HOME)/bin/repo
  REPO_URL = 'https://gerrit.googlesource.com/git-repo'
    ===>
  REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'

3.3 初始化repository

$ cd ~/android/system/
$ repo init -u https://github.com/CyanogenMod/android.git -b cm-13.0

在做上面这一步之前, 强烈建议先找一个打包的repository(aosp或者CM都可以)
因为首次同步的数据量达到20多个以上, 中途因为网络不好终止的话就需要重来
TUNA有已经打包好的aosp的.repo

下载完repository后需要对.repo/manifest.xml文件进行如下改动

fetch="https://android.googlesource.com/" />
  ===>
fetch="https://aosp.tuna.tsinghua.edu.cn/" />

3.4 下载源码

同步代码的命令有如下方式
--force-sync表示覆盖本地repo数据, 对于我们基于已经打包的repo应该是必须加上的
-j10表示同时开启10个任务, 默认为4个, 笔者使用的是8

$ repo sync 
$ repo sync --force-sync
$ repo sync –j10
$ repo sync --force-sync -j10(*)

3.5 下载问题

3.5.1 问题一

Fetching projects:  99% (225/227)  fatal: remote error:
    Repository unavailable due to DMCA takedown.
See the takedown notice for more details:
    https://github.com/github/dmca/blob/master/2014-12-22-Cambridge-Mobile.md.
fatal: Couldn't find remote ref refs/heads/gingerbread
error: Cannot fetch CyanogenMod/android_external_svox

打开.repo/manifests/default.xml
找到并注释掉CyanogenMod/android_external_svox所在行

3.5.2 问题二

当我使用9.1.0的repo来重新init cm 13.0时候, 错误信息参考如下网址
<解决在旧版本上repo init时候fatal: bad object XXX的错误>
按照文章提供的内容发现仍然不能成功, 需要做如下变更

$ git commit -m 'initial commit'

最后初始化repository成功删除 .repo/local_manifest.xml即可

4. CM编译

4.1 设备相关代码的下载

$ source build/envsetup.sh
$ breakfast i9100

下载结束时, 会有如下错误打印, 不清楚是什么意思, 好像并没有什么影响

build/core/product_config.mk:239: *** _nic.PRODUCTS.[[device/samsung/i9100/cm.mk]]: "vendor/samsung/galaxys2-common/common-vendor.mk" does not exist.  Stop.
 
** Don't have a product spec for: 'cm_i9100'
** Do you have the right repo manifest?

对于i9100而言, 设备相关代码就是如下几个repository(有缺失, 需补充)

device/samsung/galaxys2-common
device/samsung/i9100
kernel/samsung/smdk4412

4.2 Extract proprietary blobs

在进行这一步之前, 需要将PC与Android手机建立adb连接, 方式可以是USB和Wifi
使用wifi来使用adb 具体方法参考: <ADB连接方式: Wifi与USB>
注: CM 13可以在开发者选项中开启adb over Wifi

$ cd ~/android/system/device/samsung/i9100
$ ./extract-files.sh

4.2 开启caching

开启caching可以加速编译过程

$ cd ~/android/system
$ export USE_CCACHE=1
$ prebuilts/misc/linux-x86/ccache/ccache -M 50G


4.3 编译

$ cd ~/android/system
$ croot
$ brunch i9100

注意:  编译过程持续较长!编译过程持续较长!编译过程持续较长!

Tip: 由于中间容易被中断, 中断后完整的编译命令如下

$ export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk/
$ export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
$ export PATH=$PATH:$JAVA_HOME/bin
$ cd ~/android/system
$ export USE_CCACHE=1
$ prebuilts/misc/linux-x86/ccache/ccache -M 50G
$ source build/envsetup.sh
$ croot
$ brunch i9100

4.4 编译问题

4.4.1 问题一

find: ‘dummy’: No such file or directory

修改vendor/cmsdk/Android.mk

LOCAL_SRC_FILES := $(call all-java-files-under, dummy) ==> LOCAL_SRC_FILES :=

4.4.2 问题二

build/core/base_rules.mk:157: *** vendor/samsung/galaxys2-common/proprietary: MODULE.TARGET.SHARED_LIBRARIES.libUMP already defined by hardware/samsung/exynos4/hal/libUMP.  Stop.

修改hardware/samsung/exynos4/hal/Android.mk

common_exynos4_dirs := libgralloc_ump libhdmi libhwcomposer libhwconverter libsecion libUMP
    ===>
common_exynos4_dirs := libgralloc_ump libhdmi libhwcomposer libhwconverter libsecion

4.4.3 问题三

make: *** No rule to make target `vendor/samsung/galaxys2-common/proprietary/system/lib/libUMP.so', needed by `/home/Jerry/android/system/out/target/product/i9100/obj/SHARED_LIBRARIES/libUMP_intermediates/LINKED/libUMP.so'.  Stop.

从手机上拷贝一个/system/lib/libUMP.so放到指定目录vendor/samsung/galaxys2-common/proprietary/system/lib
然后修改vendor/samsung/galaxys2-common/proprietary/common-vendor-blobs.mk
加上这句话 vendor/samsung/galaxys2-common/proprietary/system/lib/libUMP.so:system/lib/libUMP.so \

4.4.4 问题四

ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.10:get (default-cli) on project standalone-pom: Couldn't download artifact: Could not transfer artifact org.cyanogenmod:gello:apk:40 from/to central (https://maven.cyanogenmod.org/artifactory/gello_prebuilds): peer not authenticated
[ERROR] org.cyanogenmod:gello:apk:40
[ERROR]
[ERROR] from the specified remote repositories:
[ERROR] central (http://repo.maven.apache.org/maven2, releases=true, snapshots=false),
[ERROR] central (https://maven.cyanogenmod.org/artifactory/gello_prebuilds, releases=true, snapshots=true)
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
make: *** [/home/xxx/android/moto/out/target/common/obj/APPS/Gello_intermediates/org.cyanogenmod.gello-40.apk] Error 1

该问题目前未解决

5. 安装升级包

编译结束后的安装包位于$OUT目录;cm-13.0-20161030-UNOFFICIAL-i9100.zip;升级方法这里不介绍

6. 关于Java

笔者在使用过程中出了编译cm13,还需要为另一个开发板编译Android 4.4
发现Android 4.4只能使用Oracle java 1.6, 查阅后了解到OpenJDK和Oracle java是可以共存的
首先到网上下载jdk-6u45-linux-x64-rpm.bin, 执行后直接安装到/usr/java目录下

然后在每次编译Android 4.4之前都输出如下环境变量

$ export JAVA_HOME=/usr/java/jdk1.6.0_45
$ export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
$ export PATH=$JAVA_HOME/bin:$PATH

如果想默认使用Oracle Java, 可以使用update-alternatives命令来完成

# update-alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_45/bin/java 300
# update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.6.0_45/bin/javac 300
# update-alternatives --install /usr/bin/jar jar /usr/java/jdk1.6.0_45/bin/jar 300

如果又想切换回OpenJDK, 仍然可以使用update-alternatives命令来完成

# update-alternatives --config java
# update-alternatives --config javac
# update-alternatives --config jar

参考:
<Build_for_i9100>
<Android镜像使用帮助>
<东软信息学院开源镜像站>
<Android实战技巧之八:Ubuntu下切换JDK版本>
<Ubuntu 16.04 LTS成功编译Android 6.0源码教程>
<CentOS CyanogenMod编译samsung("n8000")全过程>

CyanogenMod编译的更多相关文章

  1. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  2. 编译CM14.1(sudmod71.1)过程记录

    编译CM14.1内存要求很高,至少8G以上,我的6G也可以搞定,交换空间分配大一点. 1.安装平台 建议安装Deepin 15.3桌面版系统,系统UI好看. 2.配置环境 (1)安装编译依赖库 sud ...

  3. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)

    编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的“设 ...

  4. CM12.1/13.0编译教程

    环境搭建 1.安装64位Ubuntu系统(实体安装.虚拟机安装均可) 注意:要求机器至少4G内存(虚拟机至少分配4G内存),硬盘至少100G空间(源码20G+,编译后整个目录约60~70G) 安装方法 ...

  5. LinuxMint 18 编译cm13.0 笔记

    1.安装依赖文件 sudo apt--dev libesd0-dev git-core gnupg flex bison gperf build-essential zip curl zlib1g-d ...

  6. Linux下使用NDK编译FFMPEG(libstagefright)

    这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启 ...

  7. Ubuntu 下载 & 编译 Android5.1 源码

    ustc & tsinghua android srchttps://lug.ustc.edu.cn/wiki/mirrors/help/aosphttps://mirrors.tuna.ts ...

  8. [原]ffmpeg编译android 硬解码支持库 libstagefright

    最近花了一天时间将ffmpeg/tools/build_stagefright执行成功,主要是交叉编译所需要的各种动态库的支持没链接上,导致各种报错,基本上网络上问到的问题我都碰到了,特此记录下来. ...

  9. 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)

    2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...

随机推荐

  1. P1338 末日的传说 逆序数对

    题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...

  2. 大话卷积神经网络(CNN)

      这几年深度学习快速发展,在图像识别.语音识别.物体识别等各种场景上取得了巨大的成功,例如AlphaGo击败世界围棋冠军,iPhone X内置了人脸识别解锁功能等等,很多AI产品在世界上引起了很大的 ...

  3. J.U.C 系列 Tools之Executors

    上个章节说了Tools中的其他四个工具类,本节我们来看一看工具类中的老大Executors,为什么说它是老大,肯定是因为他的功能最多最强大. 一 Executors是什么 Executors 是一个线 ...

  4. 使用自己的类来作为hashtable的主键

    import java.util.*; class Counter { } class Groundhog2 { int ghNumber; Groundhog2(int n) { ghNumber ...

  5. Git上手:Git扫盲区

    Git 自述Git 是由伟大的电脑程序员Linus Torvalds编写的一个开源的,分布式的版本控制系统软件. Git 核心原理Git 利用底层数据结构,通过指向索引对象的可变指针,保存文件快照. ...

  6. jmeter运行脚本后,请求偶发性的传参错误

    问题现象:jmeter写好脚本后,请求偶发性的传参错误 排查过程:1.结合报错返回值,看是不是线程并发引起: 2.排除线程并发引起后,看看是不是取值策略:如果是参数化,看看是不是每次迭代,每次都取唯一 ...

  7. selenium初识(二)——之webdriver API

    配置完的环境之后,我们先来写一个小脚本: # __Author__:"Jim_xie" from selenium import webdriver from time impor ...

  8. Python全栈工程师(运算符、if)

    ParisGabriel       Python 入门基础   比较运算符:< 小于<= 小于等于> 大于>= 大于等于== 等于!= 不等于 语法: 表达式1>表达式 ...

  9. (原、整)BSP的江湖传说

    @author:黑袍小道 查看随缘,当苦无妨,良人可归.     引言 为什么叫江湖传说,因为实现了第一人是卡马克,就这么简单.(不接受那啥) Quake3:http://www.mralligato ...

  10. 课时1:我和python的第一次亲密接触

    目录: 一.Python3的下载与安装 二.从IDIE启动Python 三.尝试点新的东西 四.为什么会这样? 五.课时01课后习题及答案 ============================== ...