编译安卓系统9.0源码

1. 准备环境

  • PC
    • 系统:Mac OSX 10.14.4 (18E226)
    • 至少250GB固态硬盘
    • JDK 1.8.0_171
    • Xcode 10 SDK
    • Android SDK
  • Mobile
    • 设备: Google Pixel

2. 配置环境

  • 2.1 创建大小写敏感的磁盘镜像

    
    # 可以通过磁盘管理工具进行设置,也可以通过以下命令生成250g的镜像文件
    $ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 250g -volname android android.dmg
    
    android.dmg 表示当前目录下生成android.dmg.sparseimage
    
    
  • 2.2 将镜像文件转为可读写磁盘

    
    # 稍微会等一会,我的移动硬盘
    # 已耗时: 6m 10.512s
    # 速度:414.6M 字节/秒
    $ hdiutil convert android.dmg.sparseimage -format UDRW -o android.dmg
    
    

    PS: 创建镜像的目的是方便移动,大文件移动挺快。无所谓的可以直接在大小写敏感的硬盘(磁盘管理工具格式化为大小写敏感)上直接操作,省去这一步。

    
    # 查询当前目录所在分区的分区是否大小写敏感
    $ diskutil info . | grep Name
    
    

3.下载源码

  • 3.1 下载repo工具并且给这个工具可执行权限

    
    $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo -O repo & chmod +x repo
    
    
  • 3.2 源码地址

    
    # 推荐使用清华大学TUNA镜像源,使用每月更新的初始化包进行下载更新。具体步骤请看
    
    https://mirror.tuna.tsinghua.edu.cn/help/AOSP/
    
    
  • 3.3 同步分支android-9.0.0_r36源码,需要获取所有源码可以先repo sync,然后再切换分支(我获取的所有源码,编译+源码总共200GB)

    
    # 查看可切换的分支 
    $ cd .repo/manifests 
    $ git branch -a | cut -d / -f 3 
    # 切换到9.0分支
    $ repo init -b android-9.0.0_r36
    # long time ..., 报错继续repo sync
    $ repo sync
    # 直到显示下面内容,即为同步完成
    Syncing work tree:100%,done.
    
    
    • 同步源码报错,其他依赖环境貌似我这之前装过,没遇到其他错误
    
    warning: gpg (GnuPG) is not available.
    warning: Installing it is strongly encouraged.
    # 解决方法:
    $ brew install gpg
    
    

4. 编译源码

  • 4.1 首先进入bash环境

    
    $ bash
    
    
  • 4.2 初始化编译环境

    
    bash-5.0$ source build/envsetup.sh
    including device/generic/car/vendorsetup.sh
    including device/generic/mini-emulator-arm64/vendorsetup.sh
    including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
    including device/generic/mini-emulator-mips/vendorsetup.sh
    including device/generic/mini-emulator-mips64/vendorsetup.sh
    including device/generic/mini-emulator-x86/vendorsetup.sh
    including device/generic/mini-emulator-x86_64/vendorsetup.sh
    including device/generic/uml/vendorsetup.sh
    including device/google/crosshatch/vendorsetup.sh
    including device/google/cuttlefish/vendorsetup.sh
    including device/google/marlin/vendorsetup.sh
    including device/google/muskie/vendorsetup.sh
    including device/google/taimen/vendorsetup.sh
    including device/linaro/hikey/vendorsetup.sh
    including sdk/bash_completion/adb.bash
    
    
  • 4.3 配置编译信息
    访问https://developers.google.com/android/images得到对应设备的combo名称,这里Pixel对应sailfish

    这里执行lunch后输入45,或者输入aosp_sailfish-userdebug

    
    $ lunch
    You're building on Darwin
    
    Lunch menu... pick a combo: 
       ...
       45. aosp_sailfish-userdebug
       ...
    Which would you like? [aosp_arm-eng] 45
    ============================================
    PLATFORM_VERSION_CODENAME=REL
    PLATFORM_VERSION=9
    TARGET_PRODUCT=aosp_sailfish
    TARGET_BUILD_VARIANT=userdebug
    TARGET_BUILD_TYPE=release
    TARGET_ARCH=arm64
    TARGET_ARCH_VARIANT=armv8-a
    TARGET_CPU_VARIANT=kryo
    TARGET_2ND_ARCH=arm
    TARGET_2ND_ARCH_VARIANT=armv8-a
    TARGET_2ND_CPU_VARIANT=kryo
    HOST_ARCH=x86_64
    HOST_2ND_ARCH=x86
    HOST_OS=darwin
    HOST_OS_EXTRA=Darwin-18.5.0-x86_64-10.14.4
    HOST_BUILD_TYPE=release
    BUILD_ID=PQ3A.190505.001
    OUT_DIR=out
    ============================================
    
    

BUILD_ID=PQ3A.190505.001
这里提前把BUILD_ID对应的设备驱动下载好,访问https://developers.google.com/android/drivers得到Pixel binaries for Android 9.0.0 (PQ3A.190505.001)的两个驱动,解压后放入源码目录下解压。解压后再执行对应的sh脚本即可。(用于编译好源码后,线刷安卓系统到Pixel手机上。)

PS: 执行shell脚本时需要同意协议,^ + c 快捷键可以快速跳过协议阅读,直接弹出同意协议输入位置。

  • 4.4 开始构建

    • 脚本(ccache.sh)
    
     #!/usr/bin/env bash 
     export USE_CCACHE=1 #开启CCACHE。此配置可以提高二次全编译的速度。可以添加到.bashrc文件中,
     export CCACHE_DIR=./.ccache #设置缓存目录的路径。也可以添加到.bashrc文件中,
     # prebuilts/misc/linux-x86/ccache/ccache -M 50G #设置缓存目录的大小。这个配置一次即可。
     prebuilts/misc/darwin-x86/ccache/ccache -M 50G #设置缓存目录的大小。这个配置一次即可。
    
    
    
    # 启动ccache缓存
    $ sh ccache.sh
    # 开40个线程编译,等待编译完成
    $ make -j40 
    
    
  • 遇到的报错

    
    # 找不到jdk,这个在根目录的.bash_profile文件中添加
    
    

    解决方法:
    export ANDROID_JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home

    
     # 报错找不到对应的MacOSX.sdk,比如找不到MacOSX10.13.sdk
    ============================================
    [1/1] out/soong/.minibootstrap/minibp out/soong/.bootstrap/build.ninja
    [55/56] glob prebuilts/ndk/stl.bp
    [77/77] out/soong/.bootstrap/bin/soong_build out/soong/build.ninja
    FAILED: out/soong/build.ninja
    out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -o out/soong/build.ninja Android.bp
    internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13"]
    ninja: build stopped: subcommand failed.
    11:57:25 soong bootstrap failed with: exit status 1
    
    #### failed to build some targets (16 seconds) ####
    
    

    解决方法:下载Mac OSX SDK,Clone下来复制MacOSX10.13.sdk到目录/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs下(我测试的10.13版本,其他版本自测)

    
      # 报错sdm710 target not found
    [1/1] out/soong/.minibootstrap/minibp out/soong/.bootstrap/build.ninja
    FAILED: out/soong/.bootstrap/build.ninja
    out/soong/.minibootstrap/minibp -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/.bootstrap/build.ninja.d -o out/soong/.bootstrap/build.ninja Android.bp
    internal error: could not open symlink hardware/qcom/sdm710/Android.bp; its target (display/os_pickup.bp) cannot be opened
    ninja: build stopped: subcommand failed.
    11:02:11 soong minibootstrap failed with: exit status 1
    
    #### failed to build some targets (1 seconds) ####
    
    

    解决方法:git clone 该链接的目录文件到hardware/qcom/sdm710目录下(全部clone)
    https://android.googlesource.com/platform/hardware/qcom/sdm710/

  • 4.5 编译完成
    #### build completed successfully (25 seconds) ####

5. 修改源码

  • 5.1 去掉wifi感叹号

    
    // 去掉感叹号
    // 进入文件夹
    // /Volumes/sandisk/aosp/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
    // 修改地址链接为如下
        // private static final String DEFAULT_HTTPS_URL     = "https://www.google.com/generate_204";
        private static final String DEFAULT_HTTPS_URL     = "https://www.qualcomm.cn/generate_204";
        private static final String DEFAULT_HTTP_URL      =
                // "http://connectivitycheck.gstatic.com/generate_204";
                "http://www.qualcomm.cn/generate_204";
        // private static final String DEFAULT_FALLBACK_URL  = "http://www.google.com/gen_204";
        private static final String DEFAULT_FALLBACK_URL  = "http://www.qualcomm.cn/generate_204";
        private static final String DEFAULT_OTHER_FALLBACK_URLS =
                // "http://play.googleapis.com/generate_204";
                "http://www.qualcomm.cn/generate_204";
    
    
  • 5.2 默认adb为root

    ro.secure=0即可

    
    /Volumes/sandisk/aosp/build/make/core/main.mk
    
    ## user/userdebug ##
    
    user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))
    enable_target_debugging := true
    tags_to_install :=
    ifneq (,$(user_variant))
      # Target is secure in user builds.
      ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0
      ADDITIONAL_DEFAULT_PROPERTIES += security.perf_harden=1
    
      ifeq ($(user_variant),user)
        ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0
      endif
    
      ifeq ($(user_variant),userdebug)
        # Pick up some extra useful tools
        tags_to_install += debug
      else
        # Disable debugging in plain user builds.
        enable_target_debugging :=
      endif
    
      # Disallow mock locations by default for user builds
      ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1
    
    else # !user_variant
      # Turn on checkjni for non-user builds.
      ADDITIONAL_BUILD_PROPERTIES += ro.kernel.android.checkjni=1
      # Set device insecure for non-user builds.
      ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0
      # Allow mock locations by default for non user builds
      ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1
    endif # !user_variant
    
    
  • 5.3 修改默认输入法(参考其他文章)

    /Volumes/sandisk/aosp/frameworks/base/packages/SettingsProvider/res/values/defaults.xml添加如下内容:

    
    com.google.android.inputmethod.pinyin/.PinyinIME
    com.google.android.inputmethod.pinyin/.PinyinIME
    
    

    /Volumes/sandisk/aosp/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java方法内添加如下内容:

    
    loadStringSetting(stmt, Secure.ENABLED_INPUT_METHODS,
                        R.string.def_default_input_method);
    
    

    /Volumes/sandisk/aosp/packages/apps/创建GoogleInput文件夹,进入GoogleInput创建Android.mk文件,添加如下内容:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := GoogleInput
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    LOCAL_CERTIFICATE := PRESIGNED
    include $(BUILD_PREBUILT)
    LOCAL_MULTILIB := 64
    
    

    将GoogleInput.apk放入该目录下

    build/make/target/product/core.mk文件中修改如下:

    PRODUCT_PACKAGES += \
    移除Latin \
    末尾新增GoogleInput
    

    编译模块:

    
    # 编译系统镜像
    $ mmm packages/apps/GoogleInput/
    $ make snod
    
    
  • 5.4 修改系统名称

    修改/device/google/marlin/aosp_sailfish.mk文件内容为:

    
    PRODUCT_MODEL := Pixel
    
    

    编译模块:

    
    # 编译系统镜像
    $ mmm packages/apps/GoogleInput/
    $ make snod
    
    

你可能感兴趣的:(编译安卓系统9.0源码)