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. POJ 1286 Pólya定理

    Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9162   Accepted: 3786 ...

  2. 8,Linux系统基础优化及常用命令

    Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig 查询.设置网卡和 ...

  3. 15,redis基础学习

    redis Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件 yum安装redis 1.yum安装 #前提得配置好阿里云yum源,epel源 #查看 ...

  4. USACO Section2.1 Ordered Fractions 解题报告

    frac1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  5. Caliburn.Micro 消息附加多事件

    <Button Content="Let's Talk"cal:Message.Attach="[Event MouseEnter] = [Action Talk( ...

  6. Pythonyield使用浅析

    转自:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 您可能听说过,带有 yield 的函数在 Python ...

  7. ASP NET Core ---Automapper

    官方文档:http://docs.automapper.org/en/stable/index.html 一.安装和配置: 二.使用: 1.建立 Profile文件: public class Map ...

  8. CodeForces-1061D TV Shows

    题目链接 https://vjudge.net/problem/CodeForces-1061D 题面 Description There are nn TV shows you want to wa ...

  9. Linux 文本对比 diff 命令详解(整理)

    diff 命令详解 1.概述 windows系统下面就有不错的文本对比工具可以使用,例如常用的Beyond Compare,WinMerge都是图形界面的比较工具而且使用非常方便,如果你仅仅是在win ...

  10. System.Activator类

    public static ObjectHandle CreateInstance(string assemblyName, string typeName); 该类有一个方法. // // 摘要: ...