美文网首页
编译安卓系统9.0源码

编译安卓系统9.0源码

作者: 诸葛不亮丶 | 来源:发表于2019-06-28 01:31 被阅读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添加如下内容:

      
      <string name="def_default_input_method" translatable="false">com.google.android.inputmethod.pinyin/.PinyinIME</string>
      <string name="def_enabled_input_methods" translatable="false">com.google.android.inputmethod.pinyin/.PinyinIME</string>
      
      

      /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源码

          本文链接:https://www.haomeiwen.com/subject/sxxjcctx.html