三星galaxyS9定制Rom入门教程

2017年中旬,谷歌宣布开启Project Treble计划,希望解决安卓手机碎片化的问题,有很多的良心厂商加入了该项目组,包括日本的索尼,韩国的三星,中国的一加,华为;也就是说,我们可以在三星的任何一款机器上面定制安卓原生系统,这对于对安卓手机有定制化需求的公司来说是一件很棒的事情;

主流手机厂商开源网站
Samsung Open Source Release Center
Sony Developer World
Lenovo Support
Huawei Open Source Release Center
Motorola Developers
OnePlus GitHub Repository

三星s9出来了,在国外的xda论坛已经有很多大神开始制作s9的rom包,但是国内的相关博客确实少之又少,可能现在做rom不挣钱?总之,对于普通人开发者来说,想要把自己三星手机或者一加手机刷成自己的系统实在是太难了;的作为一名负责人的安卓开发人员,我决定把我学到的这点知识分享给大家,如果有错误也希望大家多多指正;

本文分为以下步骤:

  1. 内核编译;
  2. 系统源码编译
  3. 刷入系统镜像和内核镜像

好了,那我们开始吧;

编译三星s9的linux内核

下载内核源码

我想对于大部分开发者来说,下载源码是最让人头疼的事情,因为我们找不到源码在哪里,这个地方我也是找了好久才知道有这个东西,以前是在git上面找不全:http://opensource.samsung.com/reception/receptionSub.do?method=sub&sub=T&menu_item=mobile&classification1=mobile_phone

我们打开后是这个样子的:
三星galaxyS9定制Rom入门教程_第1张图片
我们可以看到,三星的所有机型的源码都可以在这里下载到,建议大家不要使用检索(没用),反正我没成功过,在页面下面分页了的,一直往后面找,大概是一百三十多页就是s9的源码下载页面了;这个地方我不多说,相信大家都能找到;

下载完了之后我们解压后得到两个文件,分别是Kernel.tar.gz(内核源码),Platform.tar.gz(版本源码),那么我们把Kernel.tar.gz在linux上解压之后就要开始编译了;

安装编译依赖

一个一个安装依赖太麻烦了,网上有一条祖传秘方,大家可以试试:

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel nss_ldap openldap openldap-devel openldap-clients openldap-servers libxslt-devel libevent-devel ntp libtool-ltdl bison libtool vim-enhanced

搭建编译环境

  1. 首先要获取到Toolchain,在这里我们需要的版本号是aarch64-linux-android-4.9,这个工具大家可以自己去找,我是在NDK里面就找到了,下载好之后,大家放在一个目录里面备用,我这里是/usr/local/toolchain/aarch64-linux-android-4.9;
  2. 配置输出目录
    在内核解压目录下新建out目录,用来存放编译结果;
$ mkdir out
$ OUTPUT_DIR=out
  1. 修改根目录下Makefile文件,指定编译Toolchain,我这里是
CROSS_COMPILE=/usr/local/toolchain/aarch64-linux-android-4.9/bin/aarch64-linux-android-
  1. 开始编译
    首先指定编译版本,然后执行make指令:
$ export ARCH=arm64
$ make -C $(pwd) O=$(pwd)/out KCFLAGS=-mno-android starqlte_chn_open_defconfig
$ make -C $(pwd) O=$(pwd)/out KCFLAGS=-mno-android

到这里就是耐心等待编译完成了,编译完成后,在out/arch/arm64/boot/Image目录下会生成内核镜像,module目录在out/drivers/*/*.ko下;

下载aosp的源码

这个的话因为我之前有一篇文章有介绍,所以这里就不多说了,大家可以看下我之前写的一篇文章《下载安卓 5.0源代码并烧录到Nexus》;
当然,你也可以在清华镜像源找到如何不下载aosp源代码,如果你网速牛逼,也可以从 http://source.android.com下载,这里略过;

加入三星s9设备节点

我们将下载好的Platform.tar.gz解压,替换到aosp源码树,值得注意的是,如果aosp源码树上有了已经存在的和Platform.tar.gz内模块冲突的目录,应该先删除aosp源码树上相同目录,在替换过去;

加入编译模块

做过系统开发的都知道,当我们想要使用摸个模块就必须在mk文件里面包含进去,比如我们写了一个app,希望在镜像里面能看到这个apk,那么我们一般会在PRODUCT_PACKAGES中声明这个模块,否则我们编译出来的镜像不会有这个apk应用;

同样的,我们要把一些必须的依赖库加入进去,也需要自行配置一下(Aosp不会自动配置的);这里的话我通过修改build\target\product\core.mk文件;
对应的模块需要的lib如下:

case 1) ProfessionalAudio : 需要添加 'libjackshm','libjackserver','libjack', 'libjacklogger', 'androidshmservice','jackd','jack_dummy','jack_alsa','jack_opensles','jack_loopback',
                              'in','out','jack_connect','jack_disconnect','jack_lsp','jack_showtime','jack_simple_client','jack_transport','libasound','libglib-2.0',
                              'libgthread-2.0' 到PRODUCT_PACKAGES	
case 2) e2fsprog : 需要添加 'e2fsck','resize2fs' 到PRODUCT_PACKAGES
case 3) libexifa : 需要添加'libexifa' 到PRODUCT_PACKAGES
case 4) libjpega :需要添加 'libjpega' 到PRODUCT_PACKAGES
case 5) KeyUtils :需要添加 'libkeyutils' 到PRODUCT_PACKAGES

具体怎么做呢?我们只需要在该文件里面添加如下:

# ProfessionalAudio
PRODUCT_PACKAGES += \
    libjackshm \
    libjackserver \
    libjack \
    libjacklogger \
    androidshmservice \
    jackd \
    jack_dummy \
    jack_alsa \
    jack_opensles \
    jack_loopback \
    in \
    out \
    jack_connect \
    jack_disconnect \
    jack_lsp \
    jack_showtime \
    jack_simple_client \
    jack_transport \
    libasound \
    libglib-2.0 \
    libgthread-2.0
    
# e2fsprog
PRODUCT_PACKAGES += \
    e2fsck \
    resize2fs
    
# libexifa
PRODUCT_PACKAGES += \
    libexifa
    
# libjpega
PRODUCT_PACKAGES += \
    libjpega
    
# KeyUtils
PRODUCT_PACKAGES += \
    libkeyutils

到这里,依赖模块就添加完成了;

开始编译

执行./build_64bit.sh

$ ./build_64bit.sh

你可能感兴趣的:(系统定制)