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不挣钱?总之,对于普通人开发者来说,想要把自己三星手机或者一加手机刷成自己的系统实在是太难了;的作为一名负责人的安卓开发人员,我决定把我学到的这点知识分享给大家,如果有错误也希望大家多多指正;
本文分为以下步骤:
好了,那我们开始吧;
我想对于大部分开发者来说,下载源码是最让人头疼的事情,因为我们找不到源码在哪里,这个地方我也是找了好久才知道有这个东西,以前是在git上面找不全:http://opensource.samsung.com/reception/receptionSub.do?method=sub&sub=T&menu_item=mobile&classification1=mobile_phone
我们打开后是这个样子的:
我们可以看到,三星的所有机型的源码都可以在这里下载到,建议大家不要使用检索(没用),反正我没成功过,在页面下面分页了的,一直往后面找,大概是一百三十多页就是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
$ mkdir out
$ OUTPUT_DIR=out
CROSS_COMPILE=/usr/local/toolchain/aarch64-linux-android-4.9/bin/aarch64-linux-android-
$ 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
下;
这个的话因为我之前有一篇文章有介绍,所以这里就不多说了,大家可以看下我之前写的一篇文章《下载安卓 5.0源代码并烧录到Nexus》;
当然,你也可以在清华镜像源找到如何不下载aosp源代码,如果你网速牛逼,也可以从 http://source.android.com下载,这里略过;
我们将下载好的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