在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)

本文主要是介绍在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                    修改对应的Android.mk文件使其在源码编译时能够同时编译出rgb2565和rgb2888,rgb2888的源码文件已有,其实实现很简单,这里只是将我在具体测试中不同模块标签的模块在不同编译模式下的所采取的编译方式列举一下,因为我们的改动最好能和源码进行无缝的结合。

      

         

一、           Android系统的四种编译模式

         Android系统有四种编译模式,分别是user、userdebug、eng、test。这个值由编译环境变量TARGET_BUILD_VARIANT保存,在源码编译之前需要我们手动指定。指定方式是,执行$ . build/envsetup.sh命令之后,执行lunch命令,系统会根据我们这一步的选择自动修改TARGET_BUILD_VARIANT的值。如果这个值未指定,系统则将其默认为eng。

         不同的模式决定了不同的模块被安装到目标系统(system.img)中,并适用于不同的发布版本。这样可以使发布版本的系统更轻量,更简洁。下面看一下不同的编译模式之间的主要区别。

eng

This is the default flavor. A plain "make " is the same as "make eng ". droid is an alias foreng .

·         Installs modules tagged with: eng , debug , user , and/or development .

·         Installs non-APK modules that have no tags specified.

·         Installs APKs according to the product definition files, in addition to tagged APKs.

·         ro.secure=0

·         ro.debuggable=1

·         ro.kernel.android.checkjni=1

·         adb is enabled by default.

user

"make user "

This is the flavor intended to be the final release bits.

·         Installs modules tagged with user .

在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)

分类: Andriod 175人阅读 评论(1) 收藏 举报

                               在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)


                    修改对应的Android.mk文件使其在源码编译时能够同时编译出rgb2565和rgb2888,rgb2888的源码文件已有,其实实现很简单,这里只是将我在具体测试中不同模块标签的模块在不同编译模式下的所采取的编译方式列举一下,因为我们的改动最好能和源码进行无缝的结合。

      

         

一、           Android系统的四种编译模式

         Android系统有四种编译模式,分别是user、userdebug、eng、test。这个值由编译环境变量TARGET_BUILD_VARIANT保存,在源码编译之前需要我们手动指定。指定方式是,执行$ . build/envsetup.sh命令之后,执行lunch命令,系统会根据我们这一步的选择自动修改TARGET_BUILD_VARIANT的值。如果这个值未指定,系统则将其默认为eng。

         不同的模式决定了不同的模块被安装到目标系统(system.img)中,并适用于不同的发布版本。这样可以使发布版本的系统更轻量,更简洁。下面看一下不同的编译模式之间的主要区别。

eng

This is the default flavor. A plain "make " is the same as "make eng ". droid is an alias foreng .

·         Installs modules tagged with: eng , debug , user , and/or development .

·         Installs non-APK modules that have no tags specified.

·         Installs APKs according to the product definition files, in addition to tagged APKs.

·         ro.secure=0

·         ro.debuggable=1

·         ro.kernel.android.checkjni=1

·         adb is enabled by default.

user

"make user "

This is the flavor intended to be the final release bits.

·         Installs modules tagged with user .

·         Installs non-APK modules that have no tags specified.

·         Installs APKs according to the product definition files; tags are ignored for APK modules.

·         ro.secure=1

·         ro.debuggable=0

·         adb is disabled by default.

userdebug

"make userdebug "

The same as user , except:

·         Also installs modules tagged with debug .

·         ro.debuggable=1

·         adb is enabled by default.

tests

Installs modules tagged with user,debug,eng,tests


         上面的表格区分了不同编译模式中,编译系统所做的不同的事情。从上面的表格我们可以得知:

         并不是在对应的编译模式下,对应的编译模块才预装到目标系统中。例如上图中的eng。在eng编译模式下,会预装标签为engdebuguser的模块。在tests编译模式下,会预装模块标签为userdebugengtests的模块。这对于我们修改Android.mk并成功编译rgb2888来说是非常重要的信息。

         其中在user编译模式下,只会预装标签为user的模块。在userdebug模式下,预装的模块除了标签为user的还有标签为debug的模块。

          如果在执行编译时未指定编译模式,则系统将编译模式自动默认为eng模式。

         其他的区别对于编译rgb2888并没有影响。

    

二、           Android.mk文件中的模块标签


         Android.mk文件是Android源码中的编译配置文件,指定了对应的模块以怎样的方式进行编译。Android源码中的编译都是以模块进行的,一个Android.mk文件可以同时编译一个或多个模块。

          Android.mk中以include $(CLEAR_VARS)为开始,以include $(文件格式)为结束算作一个模块。我们可以在其之间指定这个模块的标签,模块的名称,需要的源文件,需要使用的库等等。

          每个模块标签的取值范围是user、eng、tests、optional、samples。系统会根据上面提到的TARGET_BUILD_VARIANT值将对应的模块编译到目标系统中。可以对模 块标签进行如下直观的理解:

                                   user:指该模块在user模式下才编译。

                                   eng:指该模块在eng模式下才编译。

                                   tests:指该模块在tests模式下才编译

                                   optional:指该模块在任何编译模式下都将编译。

                                   samples:还不确定。

         上面官方给出的模块标签的理解,好想是不对的。因为在不同的编译模式下可能会预装不同的模块,比如,eng模式下,会预装标签为user、debug、eng的模块,所以在eng模式下也要编译标签为user,debug的模块。总之,我们可以理解为,编译模式和模块标签共同决定了在实际的编译中对应模块的编译方式,两者相互依赖。

         当模块标签未指定时,默认值是user。

三、           修改Android.mk使其同时编译rgb2565和rgb2888


         首先仿照Android.mk文件中rgb2565模块,编写rgb2888对应的编译配置。如下图所示:

                

         编写完Android.mk并选择eng模式编译。会出现如下的错误提示:


               

         上面提示user标签只支持传统的模块。如果在任何模式下编译该模块,需要指定模块的标签为optional。我们向Android.mk中rgb2888模块中添加对应的模块标签为       optional,然后重新编译,通过。

         将模块标签修改为optional后编译成功。当在对应的目录(out/host/linux-x86/bin/)中查找时,发现rgb2565命令已经生成,而rgb2888并未输出到该目录中。但是我们的编译已经通过,说明rgb2888的模块已经正确编译了。通过查看目录out/host/linux-x86/obj/EXECUTABLES/rgb2888_intermediates/,发现编译的中间生成物的确已经生成,说明我们的编译没有错误。从这一点可以说明,标签为optional的模块虽然在任何模式下都会编译,但是不会预装到目标系统中。

         当使用默认标签user时,提示user标签只支持传统的模块。通过测试发现,在eng模式下如果预装标签为user的模块时,必须显示指定user标签支持的模块。指定方式是修改源码中的build/core/user_tags.mk文件,在GRANDFATHERED_USER_MODULES +=中添加上模块的名称,即我们的rgb2888。然后编译,测试通过,对应的       rgb2888和rgb2565成功输出到了out/host/linux-x86/bin目录下。

          使用标签eng重新编译后,发现也会成功通过,rgb2888也成功输出到了对应的bin目录下(编译模式为eng)。

         通过比较发现,当使用编译模式为eng时,预装标签为user的模块时,要显示的指定,模块使用eng标签时,不需要显示的指定就可以预装该模块。对于eng模式下预装optional标签的模块,能否通过修改对应的支持才可以正确的预装,尚不明确。

         另外,将编译的模块预装到目标系统(system.img)貌似不能等价理解为对应的rgb2888在out/host/linux-x86/bin下正确输出了。这两者好像没有必然的联系。但是这并不影响我们解决问题。

   

四、           总结

            综上所述,修改Android.mk文件使其同时编译出rgb2565和rgb2888,可以使用以下三种方式(eng编译模式):


            在对应的rgb2565/Android.mk文件中添加rgb2888的模块(使用默认模块标签),并修改build/core/user_tags.mk添加对rgb2888的支持。

           可以在rgb2565目录所在的位置下,新建rgb2888目录,拷贝对应的源码文件,编写rgb2888模块的编译文件Android.mk(使用默认模块标签),并修改build/core/user_tags.mk添加对rgb2888的支持。这种方式是源码更清晰简介。但也要修改user_tags.mk,这是关键。

           直接在rgb2888模块中显示使用eng标签。

·         Installs non-APK modules that have no tags specified.

·         Installs APKs according to the product definition files; tags are ignored for APK modules.

·         ro.secure=1

·         ro.debuggable=0

·         adb is disabled by default.

userdebug

"make userdebug "

The same as user , except:

·         Also installs modules tagged with debug .

·         ro.debuggable=1

·         adb is enabled by default.

tests

Installs modules tagged with user,debug,eng,tests


         上面的表格区分了不同编译模式中,编译系统所做的不同的事情。从上面的表格我们可以得知:

         并不是在对应的编译模式下,对应的编译模块才预装到目标系统中。例如上图中的eng。在eng编译模式下,会预装标签为engdebuguser的模块。在tests编译模式下,会预装模块标签为userdebugengtests的模块。这对于我们修改Android.mk并成功编译rgb2888来说是非常重要的信息。

         其中在user编译模式下,只会预装标签为user的模块。在userdebug模式下,预装的模块除了标签为user的还有标签为debug的模块。

          如果在执行编译时未指定编译模式,则系统将编译模式自动默认为eng模式。

         其他的区别对于编译rgb2888并没有影响。

    

二、           Android.mk文件中的模块标签


         Android.mk文件是Android源码中的编译配置文件,指定了对应的模块以怎样的方式进行编译。Android源码中的编译都是以模块进行的,一个Android.mk文件可以同时编译一个或多个模块。

          Android.mk中以include $(CLEAR_VARS)为开始,以include $(文件格式)为结束算作一个模块。我们可以在其之间指定这个模块的标签,模块的名称,需要的源文件,需要使用的库等等。

          每个模块标签的取值范围是user、eng、tests、optional、samples。系统会根据上面提到的TARGET_BUILD_VARIANT值将对应的模块编译到目标系统中。可以对模 块标签进行如下直观的理解:

                                   user:指该模块在user模式下才编译。

                                   eng:指该模块在eng模式下才编译。

                                   tests:指该模块在tests模式下才编译

                                   optional:指该模块在任何编译模式下都将编译。

                                   samples:还不确定。

         上面官方给出的模块标签的理解,好想是不对的。因为在不同的编译模式下可能会预装不同的模块,比如,eng模式下,会预装标签为user、debug、eng的模块,所以在eng模式下也要编译标签为user,debug的模块。总之,我们可以理解为,编译模式和模块标签共同决定了在实际的编译中对应模块的编译方式,两者相互依赖。

         当模块标签未指定时,默认值是user。

三、           修改Android.mk使其同时编译rgb2565和rgb2888


         首先仿照Android.mk文件中rgb2565模块,编写rgb2888对应的编译配置。如下图所示:

                

         编写完Android.mk并选择eng模式编译。会出现如下的错误提示:


               

         上面提示user标签只支持传统的模块。如果在任何模式下编译该模块,需要指定模块的标签为optional。我们向Android.mk中rgb2888模块中添加对应的模块标签为       optional,然后重新编译,通过。

         将模块标签修改为optional后编译成功。当在对应的目录(out/host/linux-x86/bin/)中查找时,发现rgb2565命令已经生成,而rgb2888并未输出到该目录中。但是我们的编译已经通过,说明rgb2888的模块已经正确编译了。通过查看目录out/host/linux-x86/obj/EXECUTABLES/rgb2888_intermediates/,发现编译的中间生成物的确已经生成,说明我们的编译没有错误。从这一点可以说明,标签为optional的模块虽然在任何模式下都会编译,但是不会预装到目标系统中。

         当使用默认标签user时,提示user标签只支持传统的模块。通过测试发现,在eng模式下如果预装标签为user的模块时,必须显示指定user标签支持的模块。指定方式是修改源码中的build/core/user_tags.mk文件,在GRANDFATHERED_USER_MODULES +=中添加上模块的名称,即我们的rgb2888。然后编译,测试通过,对应的       rgb2888和rgb2565成功输出到了out/host/linux-x86/bin目录下。

          使用标签eng重新编译后,发现也会成功通过,rgb2888也成功输出到了对应的bin目录下(编译模式为eng)。

         通过比较发现,当使用编译模式为eng时,预装标签为user的模块时,要显示的指定,模块使用eng标签时,不需要显示的指定就可以预装该模块。对于eng模式下预装optional标签的模块,能否通过修改对应的支持才可以正确的预装,尚不明确。

         另外,将编译的模块预装到目标系统(system.img)貌似不能等价理解为对应的rgb2888在out/host/linux-x86/bin下正确输出了。这两者好像没有必然的联系。但是这并不影响我们解决问题。

   

四、           总结

            综上所述,修改Android.mk文件使其同时编译出rgb2565和rgb2888,可以使用以下三种方式(eng编译模式):


            在对应的rgb2565/Android.mk文件中添加rgb2888的模块(使用默认模块标签),并修改build/core/user_tags.mk添加对rgb2888的支持。

           可以在rgb2565目录所在的位置下,新建rgb2888目录,拷贝对应的源码文件,编写rgb2888模块的编译文件Android.mk(使用默认模块标签),并修改build/core/user_tags.mk添加对rgb2888的支持。这种方式是源码更清晰简介。但也要修改user_tags.mk,这是关键。

           直接在rgb2888模块中显示使用eng标签。


这篇关于在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926468

相关文章

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结