Android 编译(一)

一,安卓aosp源码编译环境搭建 傻瓜式操作, 人人都能编译操作系统, 每个感兴趣的人都可以基于谷歌安卓aosp源码定制自己的系统。 阅读详情

build/envsetup.sh

注意:使用虚拟机时,建议内存至少1.5GB, 磁盘空间>30GB

1. 命令-也就是envsetup.sh中的函数

function help()                   # 显示帮助信息
function get_abs_build_var()           # 获取绝对变量
function get_build_var()              # 获取绝对变量
function check_product()             # 检查product
function check_variant()              # 检查变量
function setpaths()                # 设置文件路径
function printconfig()               # 打印配置
function set_stuff_for_environment()        # 设置环境变量
function set_sequence_number()          # 设置序号
function settitle()                  # 设置标题
function choosetype()               # 设置type
function chooseproduct()              # 设置product
function choosevariant()               # 设置variant
function tapas()                    # 功能同choosecombo
function choosecombo()             # 设置编译参数
function add_lunch_combo()           # 添加lunch项目
function print_lunch_menu()           # 打印lunch列表
function lunch()                  # 配置lunch
function m()                   # make from top
function findmakefile()              # 查找makefile
function mm()                  # make from current directory
function mmm()                 # make the supplied directories
function croot()                 # 回到根目录
function cproj()
function pid()
function systemstack()
function gdbclient()
function jgrep()                 # 查找java文件
function cgrep()                  # 查找c/cpp文件
function resgrep()
function tracedmdump()
function runhat()
function getbugreports()
function startviewserver()
function stopviewserver()
function isviewserverstarted()
function smoketest()
function runtest()
function godir ()                  # 跳到指定目录

 

# add the default one here
add_lunch_combo generic-eng

 

# Execute the contents of any vendorsetup.sh files we can find.
for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`
do
    echo "including $f"
    . $f
done

 

envsetup.sh其主要作用如下:

  1. 加载了编译时使用到的函数命令,如:help,lunch,m,mm,mmm等
  2. 添加了两个编译选项:generic-eng和simulator,这两个选项是系统默认选项
  3. 查找vendor/<-厂商目录>/和vendor/<厂商目录>/build/目录下的vendorsetup.sh,如果存在的话,加载执行它,添加厂商自己定义产品的编译选项
 其实,上述第3条是向编译系统添加了厂商自己定义产品的编译选项,里面的代码就是:add_lunch_combo xxx-xxx。

根据上面的内容,可以推测出,如果要想定义自己的产品编译项,简单的办法是直接在envsetup.sh最后,添加上add_lunch_combo myProduct-eng,当然这么做,不太符合上面代码最后的本意,我们还是老实的在vendor目录下创建自己公司名字,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项 

#mkdir vendor/farsight/
#touch vendor/farsight/vendorsetup.sh
#echo "add_lunch_combo fs100-eng" > vendor/farsight/vendorsetup.sh

 这样,当我们在执行source build/envsetup.sh命令的时候,可以在shell上看到下面的信息: 

including vendor/farsight/vendorsetup.sh

 
2. 按照android官网的步骤,开始执行lunch full-eng

 

当然如果你按上述命令执行,它编译的还是通用的eng版本系统,不是我们个性系统,我们可以执行lunch命令,它会打印出一个选择菜单,列出可用的编译选项

如果你按照第一步中添加了vendorsetup.sh那么,你的选项中会出现:

 

You're building on Linux
 
generic-eng simulator fs100-eng
Lunch menu... pick a combo:
     1. generic-eng
     2. simulator
     3. fs100-eng

 

其中第3项是我们自己添加的编译项。 

lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局变量。

我们一直没有说明前面的fs100-eng是什么意思,现在来说明下,fs100是我定义的产品的名字,eng是产品的编译类型,除了eng外,还有user, userdebug,分别表示:

eng: 工程机,

user:最终用户机

userdebug:调试测试机

tests:测试机 

由此可见,除了eng和user外,另外两个一般不能交给最终用户的,记得m8出来的时候,先放出了一部分eng工程机,然后出来了user机之后,可以用工程机换。 

那么这四个类型是干什么用的呢?其实,在main.mk里有说明,在Android的源码里,每一个目标(也可以看成工程)目录都有一个Android.mk的makefile,每个目标的Android.mk中有一个类型声明:LOCAL_MODULE_TAGS,这个TAGS就是用来指定,当前的目标编译完了属于哪个分类里。 

    PS:Android.mk和Linux里的makefile不太一样,它是Android编译系统自己定义的一个makefile来方便编译成:c,c++的动态、静态库或可执行程序,或java库或android的程序, 

好了,我们来分析下lunch命令干了什么? 

3. lunch命令

function lunch()

{
    local answer

    if [ "$1" ] ; then
       # lunch后面直接带参数
        answer=$1
    else
       # lunch后面不带参数,则打印处所有的target product和variant菜单提供用户选择
        print_lunch_menu   
        echo -n "Which would you like? [generic-eng] "
        read answer
    fi

    local selection=

    if [ -z "$answer" ]
    then
           # 如果用户在菜单中没有选择,直接回车,则为系统缺省的generic-eng
        selection=generic-eng
    elif [ "$answer" = "simulator" ]
    then
        # 如果是模拟器
        selection=simulator
    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    then
        # 如果answer是选择菜单的数字,则获取该数字对应的字符串
        if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
        then
            selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}
        fi
        # 如果 answer字符串匹配 *-*模式(*的开头不能为-)
    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
    then
        selection=$answer
    fi

    if [ -z "$selection" ]
    then
        echo
        echo "Invalid lunch combo: $answer"
        return 1
    fi

    # special case the simulator
    if [ "$selection" = "simulator" ]
    then
        # 模拟器模式
        export TARGET_PRODUCT=sim
        export TARGET_BUILD_VARIANT=eng
        export TARGET_SIMULATOR=true
        export TARGET_BUILD_TYPE=debug
    else

        # 将 product-variant模式种的product分离出来
        local product=$(echo -n $selection | sed -e "s/-.*$//")

        # 检查之,调用关系 check_product()->get_build_var()->build/core/config.mk比较罗嗦,不展开了
        check_product $product
        if [ $? -ne 0 ]
        then
            echo
            echo "** Don't have a product spec for: '$product'"
            echo "** Do you have the right repo manifest?"
            product=
        fi

        # 将 product-variant模式种的variant分离出来
        local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")

        # 检查之,看看是否在 (user userdebug eng) 范围内
        check_variant $variant
        if [ $? -ne 0 ]
        then
            echo
            echo "** Invalid variant: '$variant'"
            echo "** Must be one of ${VARIANT_CHOICES[@]}"
            variant=
        fi

        if [ -z "$product" -o -z "$variant" ]
        then
            echo
            return 1
        fi

        export TARGET_PRODUCT=$product
        export TARGET_BUILD_VARIANT=$variant
        export TARGET_SIMULATOR=false
        export TARGET_BUILD_TYPE=release
    fi # !simulator

    echo

    # 设置到环境变量,比较多,不再一一列出,最 简单的方法 set >env.txt 可获得
    set_stuff_for_environment
    # 打印一些主要的变量, 调用关系 printconfig()->get_build_var()->build/core/config.mk->build/core/envsetup.mk 比较罗嗦,不展开了
    printconfig
}

 lunch函数提供了一个菜单,让开发人员选择需要编译的目标产品(target product)和变体(variant),并做一些检查,设置环境变量,并打印出主要的环境变量。

直接运行lunch(必须先运行 build/envsetup.sh,让lunch函数驻留到环境变量中)

ning@ning-desktop:~/donut-compare/mydroid$ lunch

You're building on Linux

generic-eng simulator aosp_emulator_us-eng aosp_emulator_eu-eng aosp_dream_us-userdebug aosp_dream_eu-userdebug aosp_dream_us-eng aosp_dream_eu-eng aosp_sapphire_us-userdebug aosp_sapphire_eu-userdebug aosp_sapphire_us-eng aosp_sapphire_eu-eng
Lunch menu... pick a combo:
     1. generic-eng
     2. simulator
     3. aosp_emulator_us-eng
     4. aosp_emulator_eu-eng
     5. aosp_dream_us-userdebug
     6. aosp_dream_eu-userdebug
     7. aosp_dream_us-eng
     8. aosp_dream_eu-eng
     9. aosp_sapphire_us-userdebug
     10. aosp_sapphire_eu-userdebug
     11. aosp_sapphire_us-eng
     12. aosp_sapphire_eu-eng

Which would you like? [generic-eng] 7

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=1.6
TARGET_PRODUCT=aosp_dream_us
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=Donut
============================================

用户也可以直接输入参数,不使用菜单

ning@ning-desktop:~/donut-compare/mydroid$ lunch aosp_dream_us-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=1.6
TARGET_PRODUCT=aosp_dream_us
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=Donut
============================================



cocos编译安卓apk一晚上经验 一.配置环境 需要的环境和开发包: cocos framework(cocos的库文件,必要不解释) android sdk(用于安卓开法,这个一定要有,目前使用安卓api22,考录到22兼容性问题,最好下个老版本的api用于编译) android ndk(十分重要,版本要到r10,之前用r7就会出错,ndk是用于c++代码编译为安卓代码的,而r7不识别c++11的代码,游戏源代码中是 阅读详情

相关推荐

使用Aosp源码编译安卓ROM(小米,一加,三星,中兴等)

这是一篇实用性很强的文章,除了这段引言,其它的都不是废话;这篇文章教会你如何在你的大部分主流安卓机型上(小米,一加,三星,oppo,华硕,Google,Htc,华为,联想,LG,摩托,索尼,红米)使用Android系统源码(AOSP)定制你自己的Rom; 实现步骤 定制起来非常简单,我相信只要按照文章介绍去做,半个小时就可以学会定制出自己的Aosp安卓系统; 找到手机代号; 准备材料(手机,电脑......

zhonglunshun的专栏 2万+

Android 编译系统(二):envsetup.sh学习

一、编译指令      cd $(Android_dir)     // 进入android源码的根目录      . build/envsetup.sh  // 特别注意,点号后面跟着一个空格,然后才是 build      chooseproduct dkb      choosevariant eng      export ANDROID_PREBUILT_MODULES=/ho

温陵布衣的专栏 4111

【逆强化学习-1】学徒学习(Apprenticeship Learning)

逆强化学习算法1:学徒学习。算法原理+算法步骤+代码+仿真:一个基于gym的小车上山的仿真。附赠学徒学习+Q-Table及学徒学习+DQN的全套代码。

体会编程语言独到的美 7491

Android编译之lunch命令

Android的编译基本流程

江上清风山间明月的博客 2382

添加odbc数据源时的一些问题和解决办法

pl/sql

Mr_Syh的博客 9641

星敏感器:卫星姿态测量的“星空导航仪”

在卫星、航天器和深空探测器的姿态控制系统中,星敏感器(Star Tracker) 是最精确的姿态测量设备之一。它通过识别恒星的位置,计算出航天器在惯性空间中的三轴姿态,精度可达 角秒级(arcsecond),是许多高精度任务(如遥感、天文观测、深空探测)的核心传感器。

ScilogyHunter的博客 3688

Android Donut Makefile 分析之二 (build/envsetup.sh)

转自:http://www.lupaworld.com/home.php?mod=space&uid=131820&do=blog&id=149462 build/envsetup.sh 脚本分析(lunch函数) lunch函数提供了一个菜单,让开发人员选择需要编译

Android 是一种内伤 903

【深度学习新浪潮】算力行业的核心技术有哪些?

算力行业核心技术是芯片+互联+存储+调度+能效+软件的全栈协同:芯片提供算力、互联打通集群、存储保障数据、调度提升效率、能效支撑规模、软件释放算力。当前AI大模型推动算力从“单机”走向“万卡级超节点集群”,技术竞争从单一芯片升级为系统级、全栈化的综合能力。

专注:太空算力、AI infra、异构调度、大模型成本工程 338

Android编译过程详解

Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程。 如果你从来没有做过Android代码的编译,那么最官方的编译过程就是查看Android的官方网站: http://source.android.com/source

wuye110的专栏 6293

SAP_SD模块-销售批次策略应用记录

SAP_SD模块-销售批次策略完整案例

风沙的博客 2609

验证码破解2.0:Python+CV大模型搞定滑块/点选验证

核心创新:基于YOLOv8+SAM CV大模型的端到端验证码破解方案,无需人工设计特征,适配多种验证码类型;核心价值高成功率:滑块验证≥95%,点选验证≥90%,远超传统CV方案;低延迟:单验证码破解≤2秒,满足高并发采集需求;行为模拟:生成符合人类操作的轨迹,绕过行为检测;易扩展:统一架构支持新增验证码类型,仅需少量标注数据微调;技术要点采用YOLOv8实现快速目标检测,SAM实现像素级分割;生成物理规律的人类轨迹,模拟真实操作行为;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1261

Android7.0 编译系统流程分析

本文按照Android编译三部曲(source,lunch和make)的步骤来分析查看每个环节的主要流程,由于编译系统太过庞大,这里只是从关键的主干流程上做一个分析,不可能做到每个细节都剖析清楚,由于水平有限,如果有描述不够正确的地方,欢迎大家毫无保留的指正错误,在此先谢过。

lizekun2010的博客 1万+

SAP 中配置权限职责菜单并分配给用户的核心流程是:用PFCG 创建 / 维护角色(含菜单、事务码、权限)→ 生成权限参数文件 → 通过 SU01/SU10 将角色分配给用户

SAP权限配置核心流程:1)通过PFCG创建角色,配置菜单事务码及权限对象;2)生成权限参数文件;3)用SU01/SU10分配角色给用户。关键步骤包括:在PFCG中维护菜单结构、设置权限字段值、生成Profile,通过用户比较验证权限。批量分配可用SU10,特殊需求可创建复合角色或自定义权限对象。常见问题需检查权限缺失(SU53)、菜单分配及组织级别设置。流程简化为:创建角色→配置权限→分配用户→验证生效。

金牌架构师 1271

编译android 一加,手机内核编译教程(一加6安卓9为例实战)

前人栽树后人乘凉…1.同步代码啦git clone https://github.com/flar2/OnePlus6.git -b ElementalX-3.002.交叉编译工具链下载解压到某个目录.3.配置环境,这个可以参考这个登录后免费查看当前隐藏内容需登录后查看免费已有1.07K人阅读登录后查看编译内核我们用不到那么多…我这里直接这么干了.最好还是配置临时环境变量登录后免费查看当前隐藏内容...

weixin_42230607的博客 2015

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

共轭梯度法的核心原理是求解优化问题的共轭向量组作为优化方向,由于优化方向间彼此正交,故每次迭代只需沿着一个方向寻优而互不影响。本文设计基于ESDF的障碍约束、曲率约束和平滑约束,基于ROS C++和Python提供了共轭梯度法的轨迹优化实践案例

FRIGIDWINTER的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

为一加9手机编译LineageOS 22.2(Android 15)系统

本文详细记录了一加9手机(lemonade)在Ubuntu系统下编译LineageOS 22.2(基于Android 15)的全过程。主要内容包括:1)搭建编译环境(安装依赖工具、配置Git和repo);2)从国内镜像源拉取安卓源码(约100GB+);3)处理设备树依赖关系(手动拉取lemonade、sm8350-common等设备源码);4)提取设备闭源文件(需root权限);5)完整编译流程(brunch命令)及刷机测试。文末作者表示因害怕而未做总结。

flyincat511的博客 2666

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android编译 注释,安卓编译时注解的应用(一)

Java中的注解是一个非常简洁的东西。使用它可以简化上层代码,让你的业务逻辑变的清晰明了。注解分运行时级别的注解,编译时级别的注解以及源码级别的注解。运行时注解需要用到反射相关的知识,有性能的损耗,今天我们来讲讲编译时的注解,它的作用可以让你的程序在编译过程中通过代码自动生成一些类然后调用,如此就没有反射什么事了,性能也就提升了。Class级别的注解没使用过这里不做探讨了。使用编译时注解很简单,在...

weixin_32953571的博客 321

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

编译android 一加,Android 9.0 内核编译实战(以一加6为例)

前人栽树后人乘凉…我们这里用EX内核编译做个示范 https://github.com/flar2/OnePlus6/tree/ElementalX-3.001.同步代码啦git clone https://github.com/flar2/OnePlus6.git -b ElementalX-3.002.交叉编译工具链下载https://android.googlesource.com/plat...

weixin_36187176的博客 1011

安卓内核定制开发笔记(一)内核源码编译

本文详细记录了安卓内核定制开发流程,以一加3T设备为例,从环境准备到内核编译和刷入全过程。内容包括:安装编译依赖、获取交叉编译工具链、下载AnyKernel3和内核源码;执行编译命令生成内核镜像;使用AnyKernel3打包并刷入手机;针对一加3T的WiFi驱动问题提供了两种解决方案。特别强调刷机风险,适合具备Android开发基础的用户参考实践。通过修改内核版本字符串或内核模块校验机制,成功解决了驱动兼容性问题。

某互联网大厂安全架构师,从事移动安全行业8年 拒绝AI生成,拒绝抄袭搬运,输出优质原创 matrix_oc 1103

一、tiny4412开发板Android环境搭建之编译安卓源码

一、宿主机 1、ubuntu14.04 64bit

Lidroid的博客 3542

linux系统移植安卓,Android系统移植及编译(一)

Android源代码目录结构作者:华嵌长沙中心讲师 周龙早期的android源代码目录,包含内核、bootloader等,现在已经没有包含这些了,最新版本(4.4)主要包含如下目录:bionic:Android C 库; android没有用glibc, 而且基于BSD-derived 源代码开发出 Bionic。这个目录主要包含了C库、math、以及其他核心运行库的实现代码。bootab...

weixin_39828331的博客 689

迅速入门Android内核编译 & 一加5 DC调光1

迅速入门Android内核编译 & 一加5 DC调光1 去发现同类优质开源项目:https://gitcode.com/ 资源文件描述 本资源文件旨在帮助初学者快速入门Android内核编译,并提供一加5设备上的DC调光实现方法。文章简要介绍了如何使用ARM官方GCC交叉编译工具链来编译Git平台上提供的Android开源内核。虽然内容不涉及深入的优化或研究,但建议读者在开始之前已经熟练使...

gitblog_06609的博客 337

安卓9.0刷linux,Android 9.0 内核编译实战(以一加6为例)

前人栽树后人乘凉...1.同步代码啦git clone https://github.com/flar2/OnePlus6.git -b ElementalX-3.00我这里直接这么干了.最好还是配置临时环境变量sudo gedit /etc/profileexport ANDROID_AARCH64=~/android/onepluspie/prebuilts/gcc/linux-x86/aar...

weixin_31827003的博客 834

自编译安卓系统分析Android内核漏洞(一)

目标 编译Android4.4.3-r1源码及内核 0x00 环境 手机环境: nexus5 + Kernel3.4.0+Android4.4.3_r1 虚拟机编译环境: Vmware + Ubuntu 14.04 0x01 编译android系统 1. 先下源码 先下载 repo 工具: repo init -u http...

Tesi1a的充电桩 1060

Android编译过程详解(一)

Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359.htmlAndroid编译过程详解(二):http://www.cnblogs.com/mr-raptor/archive/2012/06/08/2541571.htmlAndroid编译过程详解(三):http://www.cnblogs.com

zhangzhi123456789的专栏 1908
上一篇: android4.0编译 (ubuntu12.04 64bit)
下一篇: Android 编译(二)
evenness
博客等级 码龄15年 99粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值