编译安卓系统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添加如下内容:

    
    <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
    
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容