• 04、Android系统--Android10


    Android编译

    准备工作

    硬件要求

    磁盘的空间保持在300GB以上,编译会占用大量的硬盘空间。

    软件要求

    在AOSP开源中,主分支使用Ubuntu长期版本开发和测试的,因此推荐使用Ubuntu进行编译,下面列出不同版本的Ubuntu能够编译哪些Android版本:

    Android版本 编译的Ubuntu版本
    Android 11.0 Ubuntu 20.04
    Android 8.0 - Android 10.0 Ubuntu 18.04
    Android7.0 Ubuntu 16.04
    Android 6.0 Ubuntu 14.04
    Android 2.3.x至Android 5.x Ubuntu 12.04
    Android 1.5至Android 2.2.x Ubuntu 10.04

    除了操作系统外,JDK的版本也需要注意:

    Android版本 编译的JDK版本
    Android 7.x 至 Android 11.0 OpenJDK 8
    Android 5.x至android 6.0 OpenJDK 7
    Android 2.3.x至Android 4.4.x Oracle JDK 6
    Android 1.5至Android 2.2.x Oracle JDK 5

    搭建Android系统开发环境,我们这里如下版本的工具:

    虚拟机:VMware-workstation-full-15.5.0

    Linux系统:ubuntu-20.04.2.0-desktop-amd64.iso

    连接工具:FinalShell或xShell

    Android系统:android-10.0.0_r41

    JDK版本:openjdk-8

    基础软件

    使用VM安装Ubuntu后,需要配置镜像源,具体步骤如下:

    Settings -> About -> Software Updates -> Download from -> other

    刷新缓存后,就可以开始安装需要的软件:

    VIM安装

    安装VIM

    sudo apt install vim
    

    SSH安装

    安装SSH

    sudo apt install ssh
    

    配置ssh客户端,去掉PasswordAuthentication yes前面的#号,保存退出

    sudo vim /etc/ssh/ssh_config
    

    配置ssh服务器,把PermitRootLogin prohibit-password改成PermitRootLogin yes,保存退出。

    sudo vim /etc/ssh/sshd_config
    

    重启ssh服务

    sudo /etc/init.d/ssh restart
    

    此时,就可以通过xShell或finalShell等工具远程连接Linux系统。

    JDK安装

    由于最新的Android系统的JDK编译版本是1.8,所以我们选择openJdk1.8安装:

    sudo apt install openjdk-8-jre-headless
    

    安装完成后,通过java -version即可查看默认的Java版本:

    Git安装

    检查git是否安装,输入git version命令即可,如果没有安装则可以使用如下命令安装:

    sudo apt install git
    

    配置git的账户名和密码信息

    git config --global user.name "Your Name"
    git config --global user.email "youremail@domain.com"
    

    Python安装

    一般Ubuntu都会内置Python,我们可以通过如下命令查看系统中内置的Python版本:

    whereis python		# 查看ubuntu系统中所有的python版本
    

    由于系统编译会使用到python3,这里创建软连接

    sudo ln -s /usr/bin/python3 /usr/bin/python
    

    源码下载

    Repo是Google开发的用于管理Android版本库的一个工具。repo并不是用来取代Git,而是用Python对Git进行了一定的封装,简化了对多个Git版本库的管理。对应repo管理的任何一个版本库,都需要使用Git命令进行操作。

    在下载源码之前,我们先创建android目录,然后对目录仓库进行初始化:

    cd ~
    sodu mkdir android
    cd android
    git init
    

    Repo工具

    下载 repo 工具:

    mkdir ~/bin
    export PATH=~/bin:$PATH
    curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
    chmod a+x ~/bin/repo
    

    如果google的地址下载失败或无法下载,更改root下的repo的REPO_URL : https://gerrit-googlesource.proxy.ustclug.org/git-repo

    # repo default configuration
    #
    REPO_URL = os.environ.get('REPO_URL', None)
    if not REPO_URL:
      REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
    REPO_REV = os.environ.get('REPO_REV')
    if not REPO_REV:
      REPO_REV = 'stable'
    # URL to file bug reports for repo tool issues.
    BUG_URL = 'https://bugs.chromium.org/p/gerrit/issues/entry?template=Repo+tool+issue'
    
    # increment this whenever we make important changes to this script
    VERSION = (2, 15)
    
    # increment this if the MAINTAINER_KEYS block is modified
    KEYRING_VERSION = (2, 3)
    
    # Each individual key entry is created by using:
    # gpg --armor --export keyid
    MAINTAINER_KEYS = """
    

    源码同步

    在下载源码前,我们需要在如下网站选择相应的Android版本

    https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds

    选择相应的版本后,输入如下命令进行初始化:

    # 初始化操作,后面-b参数是相应的版本号
    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-10.0.0_r41
    

    如果出现repo has been initialized in xxx 说明成功了,此时直接同步即可:

    repo sync
    

    同步的时间会根据网络的情况而不尽相同,耐心等待即可。

    编译和运行

    编译源码

    在编译源码之前,需要添加相应的依赖:

    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential  
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
    sudo apt-get install libc6-dev-i386 
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
    sudo apt-get install lib32z-dev ccache
    sudo apt-get install libssl-dev
    

    初始化编译环境

    source build/envsetup.sh
    

    选择编译目标,就是选择编译出来的镜像运行在什么样的设备上

    lunch 或 lunch xxxx
    

    lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译目标。

    You're building on Linux
    
    Lunch menu... pick a combo:
    1. aosp_arm-eng
    2. aosp_arm64-eng
    3. aosp_mips-eng
    4. aosp_mips64-eng
    5. aosp_x86-eng
    6. aosp_x86_64-eng
    7. aosp_car_arm-userdebug
    8. aosp_car_arm64-userdebug
    9. aosp_car_x86-userdebug
    10. aosp_car_x86_64-userdebug
    11. mini_emulator_arm64-userdebug
    12. m_e_arm-userdebug
    13. m_e_mips64-eng
    14. m_e_mips-userdebug
    15. mini_emulator_x86_64-userdebug
    16. mini_emulator_x86-userdebug
    17. uml-userdebug
    18. aosp_cf_x86_auto-userdebug
    19. aosp_cf_x86_phone-userdebug
    20. aosp_cf_x86_tablet-userdebug
    21. aosp_cf_x86_tablet_3g-userdebug
    22. aosp_cf_x86_tv-userdebug
    23. aosp_cf_x86_wear-userdebug
    24. aosp_cf_x86_64_auto-userdebug
    25. aosp_cf_x86_64_phone-userdebug
    26. aosp_cf_x86_64_tablet-userdebug
    27. aosp_cf_x86_64_tablet_3g-userdebug
    28. aosp_cf_x86_64_tv-userdebug
    29. aosp_cf_x86_64_wear-userdebug
    30. cf_x86_auto-userdebug
    31. cf_x86_phone-userdebug
    32. cf_x86_tablet-userdebug
    33. cf_x86_tablet_3g-userdebug
    34. cf_x86_tv-userdebug
    35. cf_x86_wear-userdebug
    36. cf_x86_64_auto-userdebug
    37. cf_x86_64_phone-userdebug
    38. cf_x86_64_tablet-userdebug
    39. cf_x86_64_tablet_3g-userdebug
    40. cf_x86_64_tv-userdebug
    41. cf_x86_64_wear-userdebug
    42. aosp_marlin-userdebug
    43. aosp_marlin_svelte-userdebug
    44. aosp_sailfish-userdebug
    45. aosp_walleye-userdebug
    46. aosp_walleye_test-userdebug
    47. aosp_taimen-userdebug
    48. hikey-userdebug
    49. hikey64_only-userdebug
    50. hikey960-userdebug
    
    Which would you like? [aosp_arm-eng]
    

    编译目标的格式组成为BUILD-BUILDTYPE,比如aosp_arm-eng的BUILD为aosp_arm,BUILDTYPE为eng。BUILDTYPE 指的是编译类型,有以下三种:

    user:用来正式发布到市场的版本,权限受限,如没有 root 权限,不能 dedug,adb默认处于停用状态。

    userdebug:在user版本的基础上开放了 root 权限和 debug 权限,adb默认处于启用状态。一般用于调试真机。

    eng:开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置。一般用于模拟器。

    通过make指令进行代码编译,通过-j参数设置参与编译的线程数量来提高编译速度:

    make -j8
    

    编译后最终会在 out/target/product/generic_x86/目录生成了三个重要的镜像文件: system.img、userdata.img、ramdisk.img。

    system.img:系统镜像,里面包含了Android系统主要的目录和文件,通过init.c进行解析并mount挂载到/system目录下。

    userdata.img:用户镜像,是Android系统中存放用户数据的,通过init.c进行解析并mount挂载到/data目录下。

    ramdisk.img:根文件系统镜像,包含一些启动Android系统的重要文件,比如init.rc。

    至此,Android11编译完成,如果在模拟器上运行该系统需要在桌面命令行中运行emulator命令即可运行

    模块编译

    Android编译有一套自己的规则,主要利用mk文件,主要包含三个命令用于编译:make、mmm、mm。

    make:不带任何参数,用于编译整个系统,编译时间较长。也可以带参数来编译单个模块,比如make MediaProvider,由于会编译该模块的依赖模块,所以比较耗时。

    mmm packages/providers/MediaProvider:用于编译指定目录下的模板模块,不会编译该模块的依赖模块。

    mm:编译当前目录下的模块,只编译当前模块,需要通过cd切换到当前目录下。

    一般编译方式都使用增量编译,只编译发生变化的模板文件,如果想编译所有模板文件则使用-B选项参数即可。

    下面是一些常用模块的编译命令列表:

    目标模块 make命令 mmm命令
    init make init mmm system/core/init
    zygote make app_process mmm frameworks/base/cmds/app_process
    system_server make services mmm frameworks/base/services/java
    RefBase make libutils mmm frameworks/base/libs/utils
    Looper make framework mmm frameworks/base
    AudioTrack make libmedia mmm frameworks/base/media/libmedia
    AudioFliger make libaudioflinger mmm frameworks/base/libs/audioflinger
    AudioPolicyService make libaudiopolicy mmm hardware/msm7k/libaudio-qsd8k
    SurfaceFlinger make libsurfaceflinger mmm frameworks/base/libs/surfaceflinger
    Vold make void mmm system/vold/
    Rild make rild mmm hardware/ril/rild/
    Phone make Phone mmm packages/apps/Phone/

    make命令编译framework-res.apk和framework.jar两个模块,它们编译的结果在out/target/product/generic/system/framework下。

    利用adb命令将这两个文件push到手机的system/framework目录下即可替换旧的文件。(测试新模块前,需要杀掉所有使用该模块的进程)

  • 相关阅读:
    php js表单登陆验证
    jQuery Ajax 简单的实现跨域请求
    常见http代码错误原因及处理
    使用git做服务器端代码的部署
    mysql之消息队列
    MySQL触发器使用详解
    mysql之触发器before和after的区别
    mysql之触发器trigger
    手把手教你使用Git
    xcode: {} 花括号缩进一个空格
  • 原文地址:https://www.cnblogs.com/pengjingya/p/15009469.html
Copyright © 2020-2023  润新知