在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

相关文章

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将