zoukankan      html  css  js  c++  java
  • CyanogenMod编译

    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 7 - 9:        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")全过程>

  • 相关阅读:
    结对编程作业
    4组-Alpha冲刺-2/6
    4组-Alpha冲刺-1/6
    结对编程作业
    4组 团队展示
    python多进程遇到的问题和解决
    GNS3第一次ping通
    前缀表达式计算(栈的使用)
    欧拉筛法(线性筛)素数
    拓扑排序
  • 原文地址:https://www.cnblogs.com/hzl6255/p/6014401.html
Copyright © 2011-2022 走看看