android源码_android源码编译 - CSDN
精华内容
参与话题
  • 50个优秀Android项目源码,是一个很不错的Android代码,有兴趣的伙伴们抽时间可以看一下把。
  • Android 系统源码——下载到编译

    万次阅读 2020-09-30 15:19:26
    一直想下载、编译、调试一下Android源码 ,加强对一些framework的理解,搞了好多次,终于可以正常调试了。这里进行一些总结和分享。 Android源码到模拟器运行,主要有的四个步骤: 下载源码 搭建编译环境 准备...

    一直想下载、编译、调试一下Android源码 ,加强对一些framework的理解,搞了好多次,终于可以正常调试了。这里进行一些总结和分享。

    Android源码到模拟器运行,主要有的四个步骤:

    1. 下载源码
    2. 搭建编译环境
    3. 准备编译

    我使用的环境是Ubuntu16.04 、openJDK8、Android 8.0.0

    硬件软件要求

    官方文档:要求

    硬件要求:

    • 如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
    • 如果要检出代码,至少需要 250GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译,则需要更多空间。
    • 如果在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。

    我的电脑是双系统,ubuntu 空间划分不集中,分区空间不够,导致编译失败。我在实践过程中,发现不需要官方声明的那么多空间,下载初始化包.repo 40G左右,检出代码(Android 8.0.0),又占用了40G左右,编译用了60G左右。总共算下来160G的分区空间应该是够用了。

    一、 下载源码

    Android 源码是非常庞大的,而且每个模块都是用git来进行管理 ,整个Android源码是由很多个git项目构成,Google对Android代码的更新也是更新到相应模块的git项目上。

    那对于需要编译Android的开发者来说,要分别clone 每个git项目而且还要放到固定的位置确实是件惨绝人寰的事,所以Google就开发了一个基于Python编写的帮助开发者管理多个项目的工具,这个工具就叫repo,repo就是封装了git命令的python脚本。

    由于国内网络的原因,我们使用国内的清华源下载源码和repo工具

    1.1、下载repo

    下面的命令,是从清华源下载repo工具,这样脚本中的路径就是指向清华源的aosp

    mkdir ~/bin   # 在home下创建bin文件夹
    PATH=~/bin:$PATH   # 把bin文件夹加入环境变量的
    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo  > ~/bin/repo #下载repo脚本
    chmod a+x ~/bin/repo #添加权限
    

    repo 工具讲解

    我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,…Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:

    在这里插入图片描述

    项目Pre进行分库的好处就是,只需要创建需要开发的模块分支,代码量减少了很多。检出的时候也可以只检出某一模块的代码。

    会遇到这么一个问题:如果我们想要创建Pre分支来做feature开发,这就意味着,我们需要到每个子项目中分别创建对应的分支,这个过程如果纯粹靠手工做,那简直是个灾难,于是会写个自动化处理程序(我们假设这个工具叫做RepoUtil)来帮助我们解决这个问题。这个RepoUtil也会有版本管理之类的需求,因此我们也用Git对其管理,并为其创建对应的仓库。此时整个项目的结构如下:

    在这里插入图片描述

    这里RepoUtil知道整个项目Pre下的每个子项目(即维护子项目的列表),同时提供对这些子项目的管理功能,比如统一创建分支等。但是从"单一职责"角度来看,RepoUitl这个工具的功能过于复杂,我们完全可以将维护子项目列表这个功能抽取出来作为一个新项目sub_projects,因为子项目也会变化。因此,为其创建对应的仓库,并用Git管理,RepoUtil只需要通过简单的对ub_projects进行依赖即可,此时整个项目的结构如下:
    在这里插入图片描述

    AOSP项目结构

    • .repo工具对应RepoUtil
    • mainfest对应sub_projects

    在mainfest文件夹中,执行git branch -a 就可以看到所有的分支

    1.2、下载源码

    下载源码有两种方法:

    1)Android 官方下载源代码

    官方文档:下载源代码

    2)使用初始化包(建议)

    初始化包每月都会进行更新,由于首次同步需要下载约 30GB 数据,如果上面的方法,过程中任何网络故障都可能造成同步失败,我第一次是使用官方的方法,失败过一次。后来都是用这个方法。

    下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。

    由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

    使用方法如下:

    wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
    tar xf aosp-latest.tar
    cd AOSP   # 解压得到的 AOSP 工程目录
    # 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.1_r1 # 可选命令,指定版本,如果未指定,则使用最新的版本
    repo sync # 正常同步一遍即可得到完整目录
    # 或 repo sync -l 仅checkout代码
    

    Android各版本列表:https://source.android.google.cn/setup/start/build-numbers.html#source-code-tags-and-builds

    二、搭建编译环境

    官方文档:搭建编译环境

    安装openJDK8

    sudo apt-get update
    sudo apt-get install openjdk-8-jdk
    

    安装软件包

    官方文档没有介绍Ubuntu 16.04所需的软件包。使用Ubuntu 16.04的小伙伴,需要安装下面的软件

    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
    
    

    三、准备编译

    设置环境

    使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。

    source build/envsetup.sh
    

    或者

    . build/envsetup.sh
    

    选择目标

    使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。

    lunch aosp_arm-eng
    

    直接运行 lunch (没有参数),会列出所有支持的类型,输入对应的序号来进行选择。
    在这里插入图片描述

    所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:

    编译类型 使用情况
    user 权限受限;适用于生产环境
    userdebug 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型
    eng 具有额外调试工具的开发配置

    源码编译

    您可以使用 make 编译任何代码。GNU make 可以借助 -jN 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 make -j16 到 make -j32 之间的命令。

    make -j4
    

    如果编译完一个版本后想重新编译一个,可以使用 make clobber清除之前编译生成的文件。我们编译产生的文件都在 out文件夹下。

    启动模拟器

    编译成功后,输入emulator可启动模拟器

    四、如何查看源码的版本

    方法一:

    每次执行完lunch后下次进入基本就忘记上次编译的参数设置,可以使用printconfig命令显示当前的设置

    方法二:

    1、 从代码中查看当前版本,找到如下文件

    build\make\core\version_defaults.mk
    

    搜索关键字 PLATFORM_VERSION

    # This is the canonical definition of the platform version,
    # which is the version that we reveal to the end user.
    # Update this value when the platform version changes (rather
    # than overriding it somewhere else).  Can be an arbitrary string.
    
    # When you add a new PLATFORM_VERSION which will result in a new
    # PLATFORM_SDK_VERSION please ensure you add a corresponding isAtLeast*
    # method in the following java file:
    # frameworks/support/compat/gingerbread/android/support/v4/os/BuildCompat.java
    
    # When you change PLATFORM_VERSION for a given PLATFORM_SDK_VERSION
    # please add that PLATFORM_VERSION to the following text file:
    # cts/tests/tests/os/assets/platform_versions.txt
    PLATFORM_VERSION.OPR1 := 8.0.0
    

    五、错误及解决方法

    由于在Ubuntu上开发,很多常用软件都没有,所以后来又在mac上编译源码,遇到不少问题,下面来分享一下

    错误 1、Could not find a supported mac sdk: [“10.10” “10.11” “10.12” “10.13” “10.14”]

    两种解决方法:

    1. 把当前系统有的sdk 版本,加入到这个列表中
    2. 下载列表中的sdk

    具体操作,下载地址,可以参考这里

    错误 2、在mac 10.15.4 上编译Android 8.0.0_r1 ,出现bad cpu type in executable

    这篇文章 也遇到这个错误,但是报错细节、Android版本号 和我的不一样,所以我暂时没有去尝试

    在苹果官网看到 关于bad cpu type in executable 回复 的,

    想了一下,既然Mac 10.15 支持64位,不支持32位,那就用新版Android吧,免得Android 8.0.0_r1 上越改问题越多

    错误3、在mac 10.15.4上编译Android10.0.0_r1,

    Android10.0.0_r1 是支持64位的,但是在编译过程中一定会遇到这个错误

    FAILED: build out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests
    Outputs: out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests
    Error: exited with code: 1
    Command: /bin/bash -c "(out/host/darwin-x86/bin/sepolicy_tests -l out/host/darwin-x86/lib64/libsepolwrap.dylib       -f out/target/product/generic_x86_64/obj/ETC/plat_file_contexts_intermediates/plat_file_contexts  -f out/target/product/generic_x86_64/obj/ETC/vendor_file_contexts_intermediates/vendor_file_contexts  -p out/target/product/generic_x86_64/obj/ETC/sepolicy_intermediates/sepolicy ) && (touch out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests )"
    Output:
    /bin/bash: line 1: 28159 Segmentation fault: 11  ( out/host/darwin-x86/bin/sepolicy_tests -l out/host/darwin-x86/lib64/libsepolwrap.dylib -f out/target/product/generic_x86_64/obj/ETC/plat_file_contexts_intermediates/plat_file_contexts -f out/target/product/generic_x86_64/obj/ETC/vendor_file_contexts_intermediates/vendor_file_contexts -p out/target/product/generic_x86_64/obj/ETC/sepolicy_intermediates/sepolicy )
    

    这个错误是与mac 10.15 兼容问题,可通过这个临时解决

    make SELINUX_IGNORE_NEVERALLOWS=true
    

    还有个官方方案,打上下面的patch:(我是使用这个方法解决的)
    1f944107a3341ab593c93bbdf09e22436cc0e3d3

    官方就是修改 system/sepolicy/tests/Android.bp 去掉stl: “libc++_static”,

    下面这个是Catalina MacOS SDK 10.15的patch:
    89dad60ed5ec30b0f732b612d454151abdb4e449

    出自这篇文章:AOSP SELinux error

    错误4、Mac 下编译 关于 文件格式

    注意在mac 上编译,磁盘格式最好使用 Mac OS扩展(区分大小写,日志式),我在APFS 上解压aosp-laster.rar、同步代码、编译,完整操作了两次都不行。遇到同样的错误,也没再网上找到答案。也有可能是其它原因,按照官方的最好

    六、使用Android studio 查看源码

    Android Studio 导入 Android 源码

    IntelliJ IDEA导入Android源码

    注意:执行命令的时候,需要在bash 环境下,不能再zsh 环境下

    参考:
    官方文档:准备编译
    自己动手编译Android源码(超详细)
    Android 源码下载 到 编译全过程
    从源码中查看当前android版本
    android aosp编译的一些辅助命令

    展开全文
  • Android 源码下载 到 编译全过程

    千次阅读 2018-08-19 21:37:32
    下载之前先认识一下repo,整个Android源码是由很多个git项目构成,Google对Android代码的更新也是更新到相应模块的git项目上。那对于需要编译Android的开发者来说,要分别clone 每个git项目而且还要放到固定的位置...

    近日网速还算可以,于是乎决定下载一下Android源代码以供在家研究学习。下载之前先认识一下repo,整个Android源码是由很多个git项目构成,Google对Android代码的更新也是更新到相应模块的git项目上。那对于需要编译Android的开发者来说,要分别clone 每个git项目而且还要放到固定的位置确实是件惨绝人寰的w事,所以Google就开发了一个基于Python编写的帮助开发者管理多个项目的工具,这个工具就叫repo,说白了repo就是封装了git命令的python脚本。

    知道repo之后就下来就来研究一下怎么把Android源码弄下来,下载Android通常有两种方式,一种是直接用repo命令,直接了当,但是问题是需要浪费很长的时间,具体操作如下

    • 下载repo

                Google的repo下载比较麻烦,需要翻墙。建议用清华源上提供的,点击查看。

    • repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-cts-7.0_r22
    • repo sync -j6  -f (这个过程经常中断,要多执行几次才可以)
       

    第二种Android源码的方式是先下载个初始包,然后在执行repo sync进行代码同步即可

    • wget -c -t 0 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
    • tar -xvf aosp-latest.tar
    • repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-cts-7.0_r22
    • repo sync

    无论以上那种方式获取Android代码都是一个非常耗时的过程,建议在临睡觉前进行代码同步,等第二天醒来就差不多同步完成了。

    获取完代码之后接下来就是紧张又刺激的编译环节

    1. 首先进入Android源码目录,进行如下操作
    ll@ll-pc:~/android/aosp$ source build/envsetup.sh 
    including device/generic/mini-emulator-arm64/vendorsetup.sh
    including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
    including device/generic/mini-emulator-x86_64/vendorsetup.sh
    including device/generic/mini-emulator-x86/vendorsetup.sh
    including device/google/dragon/vendorsetup.sh
    including device/google/marlin/vendorsetup.sh
    including device/huawei/angler/vendorsetup.sh
    including device/lge/bullhead/vendorsetup.sh
    including device/linaro/hikey/vendorsetup.sh
    including sdk/bash_completion/adb.bash
    ll@ll-pc:~/android/aosp$ 
    ll@ll-pc:~/android/aosp$ lunch 
    
    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. mini_emulator_arm64-userdebug
         8. m_e_arm-userdebug
         9. mini_emulator_x86_64-userdebug
         10. mini_emulator_x86-userdebug
         11. aosp_dragon-userdebug
         12. aosp_dragon-eng
         13. aosp_marlin-userdebug
         14. aosp_sailfish-userdebug
         15. aosp_angler-userdebug
         16. aosp_bullhead-userdebug
         17. hikey-userdebug
    
    Which would you like? [aosp_arm-eng] 9
    
    ============================================
    PLATFORM_VERSION_CODENAME=REL
    PLATFORM_VERSION=7.1.1
    TARGET_PRODUCT=mini_emulator_x86_64
    TARGET_BUILD_VARIANT=userdebug
    TARGET_BUILD_TYPE=release
    TARGET_BUILD_APPS=
    TARGET_ARCH=x86_64
    TARGET_ARCH_VARIANT=x86_64
    TARGET_CPU_VARIANT=
    TARGET_2ND_ARCH=x86
    TARGET_2ND_ARCH_VARIANT=x86
    TARGET_2ND_CPU_VARIANT=
    HOST_ARCH=x86_64
    HOST_2ND_ARCH=x86
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-4.13.0-45-generic-x86_64-with-Ubuntu-16.04-xenial
    HOST_CROSS_OS=windows
    HOST_CROSS_ARCH=x86
    HOST_CROSS_2ND_ARCH=x86_64
    HOST_BUILD_TYPE=release
    BUILD_ID=N9F27M
    OUT_DIR=out
    ============================================
    ll@ll-pc:~/android/aosp$ 
    

     

    ll@ll-pc:~/android/aosp$ make -j8
    

    接下来就是漫长的等待过程,上面执行lunch之后的选项是针对不同平台的,根据实际情况去选择,我这里选择了9,make -j8 中的8 是指线程的数量,就是要用几个线程去编译,通常是cpu核心的2倍。

     

    Android编译过程会遇到各式各样的问题,不同的主机也会出现不同的问题,这时就需要我们沉着面对、冷静思考,多搜搜资料问题肯定会被解决的。下面是我这次编译过程所遇到的问题

    1. including ./art/Android.mk ...
      build/core/java.mk:26: *** art/tools/amm: Invalid LOCAL_SDK_VERSION 'current' Choices are: test_current .
      build/core/ninja.mk:163: recipe for target 'out/build-mini_emulator_x86_64.ninja' failed
      make: *** [out/build-mini_emulator_x86_64.ninja] Error 1
      
      解决方法:由于本人的疏忽大意,没有对manifest.xml 进行初始化,而是直接使用的是master分支上的manifest.xml,repo sync之后使用repo forall -c git checkut  android-7.1.1_r22强制切换的分支,导致源码不完整或者源码各模块版本不一致,从而导致了这个问题,解决办法是在repo sync 之前先执行 repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-cts-7.0_r22,然后再repo sync,这个问题就解决了。
    2. [  0% 8/27631] host C: libcrypto-host_32 <= external/boringssl/src/crypto/rsa/padding.c
      ninja: build stopped: subcommand failed.
      build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
      make: *** [ninja_wrapper] Error 1
      解决方法:刚开始编译就出现问题,首先想到的就是环境没有配对,又出现了
      "ninja_wrapper"

      这样的字样,估计是jack的问题,于是看了下home下是否有jack相关配置文件,结果不出所料,没有看到jack的配置文件,于是执行如下命令进行jack 初始化配置即解决问题

      ll@ll-pc:~/android/aosp/prebuilts/sdk/tools$ ls
      Android.mk                jack-server-4.8.ALPHA.jar
      darwin                    jack_server_setup.mk
      dx                        jack_versions.mk
      jack                      jills
      jack-admin                lib
      jack-annotations.jar      linux
      jack-coverage-plugin.jar  mainDexClasses
      jack-diagnose             mainDexClasses.rules
      jack_for_module.mk        README-jack-code-coverage.md
      jack-jacoco-reporter.jar  README-jack-server.md
      jack-launcher.jar         windows
      jacks
      ll@ll-pc:~/android/aosp/prebuilts/sdk/tools$ ./jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar
      Installing jack server in "/home/ll/.jack-server"
      
      Warning:
      JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore /home/ll/.jack-server/server.jks -destkeystore /home/ll/.jack-server/server.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
      
      Warning:
      JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore /home/ll/.jack-server/client.jks -destkeystore /home/ll/.jack-server/client.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
      ll@ll-pc:~/android/aosp/prebuilts/sdk/tools$ 
      jack-server-4.8.ALPHA.jar
      darwin                    jack_server_setup.mk
      dx                        jack_versions.mk
      jack                      jills
      jack-admin                lib
      jack-annotations.jar      linux
      jack-coverage-plugin.jar  mainDexClasses
      jack-diagnose             mainDexClasses.rules
      jack_for_module.mk        README-jack-code-coverage.md
      jack-jacoco-reporter.jar  README-jack-server.md
      jack-launcher.jar         windows
      jacks
      ll@ll-pc:~/android/aosp/prebuilts/sdk/tools$ ./jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar
      Installing jack server in "/home/ll/.jack-server"
      
      Warning:
      JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore /home/ll/.jack-server/server.jks -destkeystore /home/ll/.jack-server/server.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
      
      Warning:
      JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore /home/ll/.jack-server/client.jks -destkeystore /home/ll/.jack-server/client.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
      ll@ll-pc:~/android/aosp/prebuilts/sdk/tools$ 
      

       
    3. intermediates/build.prop ) && (cat out/target/product/mini-emulator-armv7-a-neon/android-info.txt | grep 'require version-' | sed -e 's/require version-/ro.build.expect./g' >> out/target/product/mini-emulator-armv7-a-neon/obj/ETC/system_build_prop_intermediates/build.prop ) && (build/tools/post_process_props.py out/target/product/mini-emulator-armv7-a-neon/obj/ETC/system_build_prop_intermediates/build.prop )"
      error: ro.build.fingerprint cannot exceed 91 bytes: Android/mini_emulator_arm64/mini-emulator-armv7-a-neon:7.1.1/N8I11B/ll07151211:userdebug/test-keys (98)
      [ 17% 5755/33411] host C: sqlite3 <= external/sqlite/dist/sqlite3.c
      ninja: build stopped: subcommand failed.
      build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
      make: *** [ninja_wrapper] Error error: ro.build.fingerprint cannot exceed 91 bytes: Android/mini_emulator_arm64/mini-emulator-armv7-a-neon:7.1.1/N8I11B/ll07151211:userdebug/test-keys (98)
      [ 17% 5755/33411] host C: sqlite3 <= external/sqlite/dist/sqlite3.c
      ninja: build stopped: subcommand failed.
      build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
      make: *** [ninja_wrapper] Error 

    解决方法

    这里是说value的长度超过限制

     

    • 修改 build/tools/post_process_props.py 如下:

    PROP_NAME_MAX = 31

    # PROP_VALUE_MAX = 91

    PROP_VALUE_MAX = 127
     

    • 修改 bionic/libc/include/sys/system_properties.h 如下:

    #define PROP_NAME_MAX   32
    // #define PROP_VALUE_MAX  92
    #define PROP_VALUE_MAX  128

        

     

    •  修改  native/cmds/installd/installd_deps.h

    // Size constants. Should be checked to be equal to the cutils requirements.
    constexpr size_t kPropertyKeyMax = 32u;
    //constexpr size_t kPropertyValueMax = 92u;
    constexpr size_t kPropertyValueMax = 128u;

     

     

    经过漫长的等待,终于编译完成

    [ 94% 13560/14334] host Java: ahat-tests (out/...VA_LIBRARIES/ahat-tests_intermediates/classes)
    注: art/tools/ahat/test/SortTest.java使用了未经检查或不安全的操作。
    注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
    [ 95% 13721/14334] host Java: android-icu4j-ho...RIES/android-icu4j-host_intermediates/classes)
    注: 某些输入文件使用或覆盖了已过时的 API。
    注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
    注: external/icu/android_icu4j/src/main/java/android/icu/impl/Relation.java使用了未经检查或不安全的操作。
    注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
    [ 96% 13859/14334] host Java: android-icu4j-te...ndroid-icu4j-tests-host_intermediates/classes)
    注: 某些输入文件使用或覆盖了已过时的 API。
    注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
    注: 某些输入文件使用了未经检查或不安全的操作。
    注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
    [100% 14334/14334] host Executable: primitives...itives_tests_intermediates/primitives_tests32)
    
    #### make completed successfully (01:10:01 (hh:mm:ss)) ####

    因为我编译的是

     mini_emulator_x86_64-userdebug

    模拟器版本,所以可以在pc端打开虚拟机

     

    展开全文
  • 使用Android Studio导入源码

    万次阅读 多人点赞 2015-12-23 19:39:38
    准备开始重操那两年的旧业,后悔之前在上家公司做Amlogic和...关于Android Studio对于应用层App开发的技巧和配置前面我写过文章分析的,这里不再解释说明,具体查看我的这一片博文《Android Studio入门到精通 》。

    1 背景

    上路了,准备开始重操那两年的旧业,后悔之前在上家公司做Amlogic和Realtak方案盒子时没有养成写博客的习惯,这算是开篇之作吧,顺带也算是给一个网友的答疑吧。不多说,该篇只是工具讲解而已。

    关于Android Studio对于应用层App开发的技巧和配置前面我写过文章分析的,这里不再解释说明,具体查看我的这一片博文《Android Studio入门到精通 》。这里我们主要说明的是用它来看源码的相关配置(该实例依据官方源码android-5.1.1_r14进行配置说明)。

    以前在上家公司查看修改源码时还是使用的Eclipse导入部分代码的方式,而现在在android源码中发现有一个development/tools/idegen目录,查了一下发现是生成IDE的project文件(主要是intellij的project文件,其实也就是Android Studio的),所以说福利工具就这么来了,欲知详情,请看下文。

    2 配置使用过程

    2-1 基础准备工作

    首先你得安装配置了Android Studio,具体不明白的参考《Android Studio入门到精通 》

    接着你得下载好了源码Code,至于如何下载这里不再说明,比较简单,上官网查看就行了。

    其次你需要保证源码已经被编译生成了out相关目录文件。

    好了,如上就是一些基本准备工作,针对定制源码或者原生源码来说,这些准备步骤都是必须的,没必要再强调了。

    2-2 配置导入及使用

    2-2-1 编译源码idegen模块及生成AS配置文件(*.ipr)

    在开始编译idegen模块前,你一定知道需要先全局编译出out目录及相关文件吧,这个不再过多说了,我们通过如下命令编译idegen模块:

    mmm development/tools/idegen/

    这行命令的意思是编译idegen这个模块项目,然后生成idegen.jar文件(不信你自己去查看这个模块的Android.mk的目标吧,不多解释)。运行完以后如果看到如下信息则说明编译OK:

    ......
    #### make completed successfully (7 seconds) ####

    接着执行如下脚本:

    development/tools/idegen/idegen.sh

    这行命令的意思是在根目录生成对应的android.ipr、android.iml IEDA工程配置文件。等待片刻得到类似如下信息说明OK:

    Read excludes: 21ms
    Traversed tree: 194799ms

    通过如上操作我们就完成了基本的源码配置工作。

    2-2-2 导入Android Studio前的一些客户化操作

    大家都知道使用Eclipse倒入源码很慢,Android Studio导入源码时也慢,所以建议修改android.iml文件(将自己不用的代码去掉),然后再导入Studio。

    就像下面摘取的android.iml文件1887行开始的这些一样:

    <sourceFolder url="file://$MODULE_DIR$/./sdk/testapps/userLibTest/src" isTestSource="true"/>
    <sourceFolder url="file://$MODULE_DIR$/./tools/external/fat32lib/src/main/java" isTestSource="false"/>
    <excludeFolder url="file://$MODULE_DIR$/out/eclipse"/>
    <excludeFolder url="file://$MODULE_DIR$/.repo"/>
    <excludeFolder url="file://$MODULE_DIR$/external/bluetooth"/>
    <excludeFolder url="file://$MODULE_DIR$/external/chromium"/>
    <excludeFolder url="file://$MODULE_DIR$/external/icu4c"/>
    <excludeFolder url="file://$MODULE_DIR$/external/webkit"/>
    <excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs"/>
    <excludeFolder url="file://$MODULE_DIR$/out/host"/>
    <excludeFolder url="file://$MODULE_DIR$/out/target/common/docs"/>
    <excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates"/>
    <excludeFolder url="file://$MODULE_DIR$/out/target/product"/>
    <excludeFolder url="file://$MODULE_DIR$/prebuilt"/>

    我们可以仿照上面这段代码的<excludeFolder url="file://$MODULE_DIR$/.repo"/>写法一样过滤掉不需要的内容,这样在导入时就会快很多。

    也可以通过Android Studio的Project Stucture 打开左侧Modules,然后将右侧Sources中一些目录Excluded掉。

    2-2-3 使用Android Studio导入源码工程

    有了如上的这些操作以后,我们打开Android Studio,然后选择打开一个现有的Android Studio项目,然后选择打开源码根目录下的android.ipr文件,然后出现如图一样的索引即可等待导入就行:tu

    这里写图片描述

    到目前为止我们就可以方便的使用Android Studio查看源码啦。如下图所示:

    这里写图片描述

    吊不屌!!!

    2-3 使用技巧

    上图我们看见了,可以通过Android Studio搜索整套源码的代码了。但是这时候如果你打开一个Service.java类,然后把鼠标放在其中任意方法的Intent参数上按住CTRL+鼠标左键跳转到Intent类你会发现跳转过去的是一个Intent.class文件,为啥呢?因为他跳转的是你的默认SDK中的jar内部的class文件。既然要修改查看整套源码,这么跳转得多蛋疼啊,所以我们需要配置让其能跳转到Intent.java文件,具体做法如下:

    首先删掉依赖中的所有依赖,只保留下图中没被选中的那两个(当然你可以选择保留一些你用到的其他jar),如下:

    这里写图片描述

    接着点击加号的JARs or directories将你源码的frameworks及external和你用到的其他跳转目录添加到依赖中,然后apply即可。

    这时候我们在像上面一样打开Service.java跳转Intent,你会发现像下图一样直接跳转到你源码路径下的Intent.java文件了,如下:

    这里写图片描述

    到此对于平时只是查看源码的人来说已经够用了。

    3 总结

    俗话说工欲善其事必先利其器,你会发现使用Android Studio比Eclipse和Source Insight都好很多(当然了,SubText还是很强大的),无论是代码提示还是跳转、还是Python Shell等插件支持等都很强大,慢慢体验吧。

    顺带说一句,Google的野心真的很大,看来Android Studio即将要被他们打造为全能IDE了。

    4 附加README

    附上原版的英文README文档,英语高手直接看这里就行:

    IDEGen automatically generates Android IDE configurations for IntelliJ IDEA
    and Eclipse. Your IDE should be able to compile everything in a reasonable
    amount of time with no errors.

    If you’re using IntelliJ…

    If this is your first time using IDEGen...
    
        IDEA needs a lot of memory. Add "-Xms748m -Xmx748m" to your VM options
        in "IDEA_HOME/bin/idea.vmoptions" on Linux or
        "IntelliJ IDEA.app/Contents/Info.plist" on OS X.
    
        Create a JDK configuration named "1.6 (No Libraries)" by adding a new
        JDK like you normally would and then removing all of the jar entries
        under the "Classpath" tab. This will ensure that you only get access to
        Android's core libraries and not those from your desktop VM.
    
    From the project's root directory...
    
        Repeat these steps after each sync...
    
        1) make (to produce generated .java source)
        2) development/tools/idegen/idegen.sh
        3) Open android.ipr in IntelliJ. If you already have the project open,
           hit the sync button in IntelliJ, and it will automatically detect the
           updated configuration.
    
        If you get unexpected compilation errors from IntelliJ, try running
        "Build -> Rebuild Project". Sometimes IntelliJ gets confused after the
        project changes significantly.
    

    If you’re using Eclipse…

    If this is your first time using IDEGen...
    
        Edit eclipse.ini ("Eclipse.app/Contents/MacOS/eclipse.ini" on OS X) and
        add "-Xms748m -Xmx748m" to your VM options.
    
        Configure a JRE named "1.5 (No Libraries)" under "Preferences -> Java ->
        Installed JREs". Remove all of the jar entries underneath "JRE system
        libraries". Eclipse will not let you save your configuration unless at
        least one jar is present, so include a random jar that won't get in the
        way.
    
    From the project's root directory...
    
        Repeat these steps after each sync...
    
        1) make (to produce generated .java source)
        2) development/tools/idegen/idegen.sh
        3) Import the project root directory into your Eclipse workspace. If you
           already have the project open, simply refresh it (F5).
    

    Excluding source roots and jars

    IDEGen keeps an exclusion list in the "excluded-paths" file. This file
    has one regular expression per line that matches paths (relative to the
    project root) that should be excluded from the IDE configuration. We
    use Java's regular expression parser (see java.util.regex.Parser).
    
    You can create your own additional exclusion list by creating an
    "excluded-paths" file in the project's root directory. For example, you
    might exclude all apps except the Browser in your IDE configuration with
    this regular expression: "^packages/apps/(?!Browser)".
    

    Controlling source root ordering (Eclipse)

    You may want some source roots to come before others in Eclipse. Simply
    create a file named "path-precedence" in your project's root directory.
    Each line in the file is a regular expression that matches a source root
    path (relative to the project's root directory). If a given source root's
    path matches a regular expression that comes earlier in the file, that
    source root will come earlier in the generated configuration. If a source
    root doesn't match any of the expressions in the file, it will come last,
    so you effectively have an implicit ".*" rule at the end of the file.
    
    For example, if you want your applications's source root to come first,
    you might add an expression like "^packages/apps/MyApp/src$" to the top
    of the "path-precedence" file.  To make source roots under ./out come last,
    add "^(?!out/)" (which matches all paths that don't start with "out/").
    
    展开全文
  • 自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 43...

    自己动手编译Android源码(超详细)

    2016.06.20 02:12* 字数 4330 阅读 86819评论 89赞赏 7

    Android Studio代码调试一文中,简单的介绍了代码调试的一些技巧.现在我们来谈谈android源码编译的一些事.(俺认为,作为android developer人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解).

    本文使用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:

    sudo apt-get install git 
    git configglobal user.emailtest@test.com” 
    git config –global user.name “test”
    

    其中test@test.com为你自己的邮箱.

    简要说明

    android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.


    源码下载

    由于某墙的原因,这里我们采用国内的镜像源进行下载.
    目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)

    repo工具下载及安装

    通过执行以下命令实现repo工具的下载和安装

    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
    

    补充说明
    这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:

    我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:


    这里写图片描述

    将一个项目Pre进行分库后会遇到这么一个问题:如果我们想要创建Pre分支来做feature开发,这就意味着,我们需要到每个子项目中分别创建对应的分支,这个过程如果纯粹靠手工做,那简直是个灾难,利索当然我们会想写个自动化处理程序(我们假设这个工具叫做RepoUtil)来帮助我们解决这个问题.这个RepoUtil也会有版本管理之类的需求,因此我们也用Git对其管理,并为其创建对应的仓库.此时整个项目的结构如下:


    这里写图片描述

    这里RepoUtil知道整个项目Pre下的每个子项目(即维护子项目的列表),同时需要提供对这些子项目的管理功能,比如统一创建分支等.但是从"单一职责"角度来看,RepoUitl这个工具的功能过于复杂,我们完全可以将维护子项目列表这个功能抽取出来作为一个新项目sub_projects,因为子项目也会变化,因此,为其创建对应的仓库,并用Git管理,这样的化,RepoUtil只需要通过简单的对ub_projects进行依赖即可,此时整个项目的结构如下:


    这里写图片描述

    AOSP项目结构和我上文的描述非常类似.repo工具对应RepoUtil,mainfest对应sub_projects.
    总结一下:repo就是这么一种工具,由一系列python脚本组成,通过调用Git命令实现对AOSP项目的管理.

    建立源码文件夹

    熟悉Git的同学都应该知道,我们需要为项目在本地创建对应的仓库.同样,这里为了方便对代码进行管理,我们为其创建一个文件夹.这里我在当前用户目录下创建了source文件夹,后面所有的下载的源码和编译出的产物也都放在这里,命令如下:

    mkdir source
    cd source
    

    初始化仓库

    我们将上面的source文件夹作为仓库,现在需要来初始化这个仓库了.通过执行初始化仓库命令可以获取AOSP项目master上最新的代码并初始化该仓库,命令如下:

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
    
    

    或者使用:

    repo init -u git://aosp.tuna.tsinghua.edu.cn/aosp/platform/manifest
    

    两者实现的效果一致,仅仅只是协议不同.
    如果执行该命令的过程中,如果提示无法连接到 gerrit.googlesource.com,那么我们只需要编辑 ~/bin/repo文件,找到REPO_URL这一行,然后将其内容修改为:

    REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'
    

    然后重新执行上述命令即可.

    补充说明
    不带参数的manifest命令用于获取master上最新的代码,但是可以通过-b参数指定获取某个特定的android版本,比如我们想要获取android-4.0.1_r1分支,那么命令如下:

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
    

    (AOSP项目当前所有的分支列表参看:分支列表)

    同步源码到本地

    初始化仓库之后,就可以开始正式同步代码到本地了,命令如下:

    repo sync
    

    以后如果需要同步最新的远程代码到本地,也只需要执行该命令即可.在同步过程中,如果因为网络原因中断,使用该命令继续同步即可.不出意外,5个小时便可以将全部源码同步到本地.所以呢,这个过程可以放在晚上睡觉期间完成.

    (提示:一定要确定代码完全同步了,不然在下面编译过程出现的错误会让你痛不欲生,不确定的童鞋可以多用repo sync同步几次)


    构建编译环境

    源码下载完成后,就可以构建编译环境了.在开始之前,我们先来看看一些编译要求:

    1. 硬件要求:
    64位的操作系统只能编译2.3.x以上的版本,如果你想要编译2.3.x以下的,那么需要32位的操作系统.
    磁盘空间越多越好,至少在100GB以上.意思就是,你可以去买个大点的硬盘了啊
    如果你想要在是在虚拟机运行linux,那么至少需要16GB的RAM/swap.
    (实际上,我非常不推荐在虚拟机中编译2.3.x以上的代码.)

    2. 软件要求:
    1. 操作系统要求
    AOSP开源中,主分支使用Ubuntu长期版本开发和测试的,因此也建议你使用Ubuntu进行编译,下面我们列出不同版本的的Ubuntu能够编译那些android版本:

    Android版本编译要求的Ubuntu最低版本
    Android 6.0至AOSP masterUbuntu 14.04
    Android 2.3.x至Android 5.xUbuntu 12.04
    Android 1.5至Android 2.2.xUbuntu 10.04

    2. JDK版本要求
    除了操作系统版本这个问题外,我们还需要关注JDK版本问题,为了方便,同样我们也列出的不同Android版本的源码需要用到的JDK版本:

    Android版本编译要求的JDK版本
    AOSP的Android主线OpenJDK 8
    Android 5.x至android 6.0OpenJDK 7
    Android 2.3.x至Android 4.4.xOracle JDK 6
    Android 1.5至Android 2.2.xOracle JDK 5

    更具体的可以参看:Google源码编译要求

    我现在在Ubuntu 16.04下编译AOSP主线代码,因此需要安装OpenJDK 8,执行命令如下:
    sudo apt-get install openjdk-8-jdk
    如果你需要在Ubuntu 14.04下编译AOSP主线代码,同样需要安装OpenJDK 8,此时需要执行如下命令:

    sudo apt-get update
    sudo apt-get install openjdk-8-jdk
    

    如果你要编译的是Android 5.x到android 6.0之间的系统版本,需要采用openjdk7.但是在Ubuntu 15.04及之后的版本的在线安装库中只支持openjdk8和openjdk9的安装.因此,如果你想要安装openjdk 7需要首先设置ppa:

    sudo add-apt-repository ppa:openjdk-r/ppa 
    sudo apt-get update
    

    然后再执行安装命令:

    sudo apt-get install openjdk-7-jdk 
    

    有时候,我们需要编译不同版本的android系统,就可能使用不同的jdk版本.关于jdk版本切换,可以使用如下命令:

    sudo update-alternative --config java
    sudo update-alternative --config javac
    

    3. 其他要求

    Google官方构建编译环境指南中已经说明了Ubuntu14.04,Ubuntu 12.04,Ubuntu 10.04需要添加的依赖,这里我们就不做介绍了.我原先以为,Ubuntu16.04的设置和Ubuntu14.04的依赖设置应该差不多,但是只能说too young too simple.
    下面是Ubuntu16.04中的依赖设置:

    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
    

    (其中几个命令中参数是重复的,但不妨碍我们)

    初始化编译环境

    确保上述过程完成后,接下来我们需要初始化编译环境,命令如下:

    source build/envsetup.sh
    

    执行该命令结果如下:


    这里写图片描述

    不难发现该命令只是引入了其他执行脚本,至于这些脚本做什么,目前不在本文中细说.
    该命令执行成功后,我们会得到了一些有用的命令,比如最下面要用到的lunch命令.


    编译源码

    初始化编译环境之后,就进入源码编译阶段.这个阶段又包括两个阶段:选择编译目标和执行编译.

    选择编译目标

    通过lunch指令设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上.这里我们设置的编译目标是aosp_arm64-eng,因此执行指令:

    lunch aosp_arm64-eng
    

    编译目标格式说明
    编译目标的格式:BUILD-BUILDTYPE,比如上面的aosp_arm-eng的BUILD是aosp_arm,BUILDTYPE是eng.

    什么是BUILD

    BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境.其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架构的处理器;此外,还有一些单词代表了特定的Nexus设备,下面是常用的设备代码和编译目标,更多参考官方文档
    |受型号|设备代码|编译目标|
    |---|----|---|
    |Nexus 6P|angler|aosp_angler-userdebug|
    |Nexus 5X|bullhead|aosp_bullhead-userdebug|
    |Nexus 6|shamu|aosp_shamu-userdebug|
    |Nexus 5|hammerhead|aosp_hammerhead-userdebug|

    提示:如果你没有Nexus设备,那么通常选择arm或者x86即可

    什么是BUILDTYPE

    BUILD TYPE则指的是编译类型,通常有三种:
    -user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不鞥年dedug等)
    -userdebug:在user版本的基础上开放了root权限和debug权限.
    -eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具

    了解编译目标的组成之后,我们就可以根据自己目前的情况选择了.那不知道编译目标怎么办?
    我们只需要执行不带参数的lunch指令,稍后,控制台会列出所有的编译目标,如下:


    这里写图片描述

    接着我们只需要输入相应的数字即可.

    来举个例子:你没有Nexus设备,只想编译完后运行看看,那么就可以选择aosp_arm-eng.
    (我在ubuntu 16.04(64位)中编译完成后启动虚拟机时,卡在黑屏,尝试编译aosp_arm64-eng解决.因此,这里我使用了aosp_arm64-eng)

    开始编译

    通过make指令进行代码编译,该指令通过-j参数来设置参与编译的线程数量,以提高编译速度.比如这里我们设置8个线程同时编译:

    make -j8
    

    需要注意的是,参与编译的线程并不是越多越好,通常是根据你机器cup的核心来确定:core*2,即当前cpu的核心的2倍.比如,我现在的笔记本是双核四线程的,因此根据公式,最快速的编译可以make -j8.
    (通过cat /proc/cpuinfo查看相关cpu信息)

    如果一切顺利的化,在几个小时之后,便可以编译完成.看到### make completed successfully (01:18:45(hh:mm:ss)) ###表示你编译成功了.


    运行模拟器

    在编译完成之后,就可以通过以下命令运行Android虚拟机了,命令如下:

    source build/envsetup.sh
    lunch(选择刚才你设置的目标版本,比如这里了我选择的是2)
    emulator
    

    如果你是在编译完后立刻运行虚拟机,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行虚拟机:

    emulator
    

    不出意外,在等待一会之后,你会看到运行界面:


    这里写图片描述

    补充
    既然谈到了模拟器运行,这里我们顺便介绍模拟器运行所需要四个文件:

    1. Linux Kernel
    1. system.img
    2. userdate.img
    3. ramdisk.img

    如果你在使用lunch命令时选择的是aosp_arm-eng,那么在执行不带参数的emualtor命令时,Linux Kernel默认使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目录下的kernel-qemu文件;而android镜像文件则是默认使用source/out/target/product/generic目录下的system.img,userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像文件.

    上面我在使用lunch命令时选择的是aosp_arm64-eng,因此linux默认使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件则是使用的source/out/target/product/generic64目录下的system.img,userdata.img和ramdisk.img.
    当然,emulator指令允许你通过参数制定使用不同的文件,具体用法可以通过emulator --help查看


    模块编译

    除了通过make命令编译可以整个android源码外,Google也为我们提供了相应的命令来支持单独模块的编译.

    编译环境初始化(即执行source build/envsetup.sh)之后,我们可以得到一些有用的指令,除了上边用到的lunch,还有以下:

      - croot: Changes directory to the top of the tree.
      - m: Makes from the top of the tree.
      - mm: Builds all of the modules in the current directory.
      - mmm: Builds all of the modules in the supplied directories.
      - cgrep: Greps on all local C/C++ files.
      - jgrep: Greps on all local Java files.
      - resgrep: Greps on all local res/*.xml files.
      - godir: Go to the directory containing a file.
    

    其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Launcher2模块,执行指令:

    mmm packages/apps/Launcher2/
    

    稍等一会之后,如果提示:
    ### make completed success fully ###
    即表示编译完成,此时在out/target/product/gereric/system/app就可以看到编译的Launcher2.apk文件了.

    重新打包系统镜像
    编译好指定模块后,如果我们想要将该模块对应的apk集成到系统镜像中,需要借助make snod指令重新打包系统镜像,这样我们新生成的system.img中就包含了刚才编译的Launcher2模块了.重启模拟器之后生效.

    单独安装模块
    我们在不断的修改某些模块,总不能每次编译完成后都要重新打包system.img,然后重启手机吧?有没有什么简单的方法呢?
    在编译完后,借助adb install命令直接将生成的apk文件安装到设备上即可,相比使用make snod,会节省很多事件.

    补充
    我们简单的来介绍out/target/product/generic/system目录下的常用目录:
    Android系统自带的apk文件都在out/target/product/generic/system/apk目录下;
    一些可执行文件(比如C编译的执行),放在out/target/product/generic/system/bin目录下;
    动态链接库放在out/target/product/generic/system/lib目录下;
    硬件抽象层文件都放在out/targer/product/generic/system/lib/hw目录下.


    SDK编译

    如果你需要自己编译SDK使用,很简单,只需要执行命令make sdk即可.


    错误集合

    在编译过程中,遇到的大部分错误都可以在google搜到解决方案.这里只列举几个常见的错误:
    错误一: You are attemping to build with the incorrect version.具体错误如下:

    这里写图片描述

    如果你认真看了构建环境的的要求,那么这个错误是可以避免的.当然,这个问题也很容易解决:安装openjdk 8,别忘了使用sudo update-alternative命令切换jdk版本.

    错误二: Out of memory error.具体错误如下:

    这里写图片描述

    这个错误比较常见,尤其是在编译AOSP主线代码时,常常会因为JVM heap size太小而导致该错误.
    此时有两种解决方法:
    方法一:
    在编译命令之前,修改prebuilts/sdk/tools/jack-admin文件,找到文件中的这一行:
    JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
    然后在该行添加-Xmx4096m,如:
    JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
    然后再执行time make -8j

    方法二:
    在控制台执行以下命令:

    export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
    out/host/linux-x86/bin/jack-admin kill-server
    out/host/linux-x86/bin/jack-admin start-server
    

    如图:


    这里写图片描述

    执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.

    错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
    执行如下命令:

    ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7 
    
    

    通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.


    结束吧

    到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.

    展开全文
  • 如何学习Android系统源码

    千次阅读 2018-05-22 12:16:37
    Android系统的源代码非常庞大和复杂,我们不能贸然进入,否则很容易在里面迷入方向,进而失去研究它的信心。我们应该在分析它的源代码之前学习好一些理论知识,下面就介绍一些与Android系统相关的资料。 我们知道,...
  • 如何快速阅读并分析Android源码

    千次阅读 2019-04-11 11:09:21
    很多时候为了解决一个问题必须先理解Android系统的运行原理,这...那么,如何阅读并分析Android源码呢? 这里我只讲一些初级的、基础的方法,很快就可以上手,不需要下载和编译系统源码。 我们下载Android SDK的时...
  • 平时我们在用Android Studio开发项目的时候,如果想要查看源码,直接 Ctrl + 左键 查看对应的源码,你可能会发现有一些具体源码看不到,或者部分代码飘红。我们就来说说这一部分。
  • 自己动手编译Android源码(超详细)

    万次阅读 2017-08-10 19:48:49
    作为android developer人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解。 android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.
  • Android源码解析系列

    万次阅读 多人点赞 2016-07-24 10:55:20
    知乎上看了一篇非常不错的博文:有没有必要阅读ANDROID源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入android体系,决定学习android framework层源码。这篇文章就是源码学习的汇总...
  • 自己动手编译最新Android源码及SDK(Ubuntu)

    万次阅读 多人点赞 2017-11-11 22:11:13
    现在我们来谈谈android源码编译的一些事.(俺认为,作为android developer人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解).本文适用于以下以下编译途径: Ubuntu 16.04...
  • 使用AndroidStudio查看并调试Android源码

    万次阅读 多人点赞 2018-11-04 19:08:42
    使用AndroidStudio查看并调试Android源码使用AndroidStudio查看并调试Android源码0.基础环境1. 操作系统2. Java3. Android源码1. 编译源码初始化编译环境AndroidP的终端检查源码AndroidO的终端检查源码选择编译目标...
  • Ubantu18.04环境下编译android源码

    万次阅读 2018-08-19 22:27:35
    最近在看金泰延老师写的《Android 框架揭秘》一书,第一章就是下载并编译android源码,书中内容较为陈旧,所以不得不到网上收罗各种资料,最后总算是大功告成,现在总结如下。 1、安装git和repo并配置 安装git...
  • Windows 环境下载 Android 源码

    万次阅读 多人点赞 2019-02-14 16:16:22
    Windows 环境下载 Android 源码 前言 Android 官网(该方式不适合 Windows 平台):https://source.android.com/source/downloading.html 可是我就想在 Windows 中使用 Source Insight 看看源代码,当然可以! ...
  • 使用Android studio查看Android源码

    千次阅读 2018-02-23 16:26:18
    转载自 http://blog.csdn.net/Easyhood/article/details/53466648一,准备工作在使用Android Studio查看源码之前,你需要做下面几件事:下载Android源码进行过一次完整编译(不编译是无法进行源码导入工作的)以上操作...
  • 从github下载最新Android源码

    万次阅读 多人点赞 2014-09-23 14:21:52
    Android官方的资源不能访问,想下载Android代码当然是困难重重了。本文就为大家解决这一问题——介绍如何使从github.com/andorid下载Andorid最新源码。俗话说“授之以鱼不如授之以渔”,本文不只是给出一个已经打包...
  • Mac编译Android源码9.0

    千次阅读 2019-03-04 09:00:11
    Mac编译Android源码9.0我的编译设备官方编译教程(有需要的可以自己看一下)一、搭建编译环境(创建磁盘映像) 我的编译设备 2017款mac pro 15 最低配(16G-256G-i7) 移动硬盘500G的 注:因为我下载的整个源码大概在...
  • android开发一些体会 android开发一些体会 前言 一、学习知识汇总 1.1、Java se基础 1.2、android UI编程 1.3、android网络编程与数据存储 二、进阶之路(初级-&amp;amp;gt;中级-&amp;amp;gt;高级) ...
  • windows平台下载android源码

    万次阅读 热门讨论 2016-02-17 15:40:21
    最近在看《android内核剖析》,很多细节不具体看代码很难理解,记住了印象也不深,感觉还是跟着源码走一遍好些,回来下载android源码,遇到不少问题,终于开始下载了,整理下流程,鉴于网上很多教程时间久了都会失效...
  • Android 源码编译详解【合集篇】

    万次阅读 2018-03-05 10:52:20
    Android 源码编译详解【一】:服务器硬件配置及机型推荐做 Android系统开发多年,开发环境都是入职就搭建好了,入职时拿个账号密码就直接开始搞开发了,年初换了新公司,所有的项目都是刚起步,一切环境都要重新搭建...
1 2 3 4 5 ... 20
收藏数 366,866
精华内容 146,746
关键字:

android源码