android 判断系统语言系统用什么语言开发

Android系统开发中log的使用方法及简单的原理
字体:[ ] 类型:转载 时间:
LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录;在平时开发过程中经常需要与log打交道,所以很有必要了解log的使用方法及简单的原理,感兴趣的朋友可以了解下啊
在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录。在Android系统中,提供了简单、便利的LOG机制,开发人员可以方便地使用。在平时开发过程中经常需要与log打交道,所以很有必要了解log的使用方法及简单的原理。1、linux内核的log输出 在标准的linux内核开发过程中,使用printk,这是一个与printf输出打印齐名的函数,同样提供格式化输出功能,只是其有 打印级别且将信息保存到/proc/kmsg日志中,使用cat命令查看其信息[cat/proc/kmsg]
代码如下: &SPANstyle="COLOR:#003333;FONT-SIZE:14px"&#defineKERN_EMERG"&0&"/*systemisunusable*/ #defineKERN_ALERT"&1&"/*actionmustbetakenimmediately*/ #defineKERN_CRIT"&2&"/*criticalconditions*/ #deinfeKERN_ERR"&3&"/*errorconditions*/ #deinfeKERN_WARNING"&4&"/*warningconditions*/ #deinfeKERN_NOTICE"&5&"/*normalbutsignificantcondition*/ #deinfeKERN_INFO"&6&"/*informational*/ #deinfeKERN_DEBUG"&7&"/*debug-levelmessages*/&/SPAN&
2、android中log输出 Android系统在用户空间中提供了轻量级的logger日志系统,它是在内核中实现的一种设备驱动,与用户空间的logcat工具配合使用能够方便地跟踪调试程序。 Android系统中的C/C++日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别: /* *Androidlogpriorityvalues,inascendingpriorityorder. */ typedefenumandroid_LogPriority{ ANDROID_LOG_UNKNOWN=0, ANDROID_LOG_DEFAULT,/*onlyforSetMinPriority()*/ ANDROID_LOG_VERBOSE, ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL, ANDROID_LOG_SILENT,/*onlyforSetMinPriority();mustbelast*/ }android_LogP 为了使用方便,在system/core/include/cutils/log.h定义了相对应的宏: #defineLOGV(...)((void)LOG(LOG_VERBOSE,LOG_TAG,__VA_ARGS__)) #defineLOGD(...)((void)LOG(LOG_DEBUG,LOG_TAG,__VA_ARGS__)) #defineLOGI(...)((void)LOG(LOG_INFO,LOG_TAG,__VA_ARGS__)) #defineLOGW(...)((void)LOG(LOG_WARN,LOG_TAG,__VA_ARGS__)) #defineLOGE(...)((void)LOG(LOG_ERROR,LOG_TAG,__VA_ARGS__)) 因为如果需要使用log输出,包含其头文件:#include&cutils/log.h&并link其动态库:liblog.so即可 #defineLOG_TAG"XX_LOG_TAG"//这里可以定义其输出的TAG #include&cutils/log.h& JAVA层打印: importandroid.util.L privatestaticfinalStringTAG="XX_LOG_TAG"; Log.e(TAG,"ThisistheerrorlogprintedbyLog.iinandroiduserspace."); 3、盒子上如何获取log a、进入shell获取log adbkill-server adbconnectdest-ip adbshell【登录shell】 mount-oremount/system/system【改变权限】 logcat&&1.log 命令行输入CTRL+C回到cmd命令行,adbpullpath/1.log b、直接在cmd命令行获取log adbconnect连上后; adbshell adblogcat&&path/1.log 操作完毕后 命令行输入CTRL+C回到cmd命令行,adbpullpath/1.log c、在terminal终端直接输出log 回车切到shell logcat[此时即可看到打印] 4、Eclipse环境下运行(安装了Android插件),那么直接可以在Eclipse就可以查看了 &5、常用技巧 1、logcat中会打印【输出级别+LOG_TAG名字+进程字+打印的信息】可以充分利用这些信息分析问题 I/SystemServer(939):ActivityManager I/ActivityManager(939):Memoryclass:96 E/AndroidRuntime(939):ErrorreportingWTF 第一列由Log.i(e/w..决定)或者LOGI/LOGE/LOGW... 第二列由LOG_TAG/TAG(JAVA)中决定,可以对于同一组模块前相同的前缀[xxx]funtion这种命名 第三列是系统进程号getpid()这值,打印线程值pthread_slef() 最后的就是自行增加的打印信息 2、调效效率或者执行时间 1、建议重点的打印增加前缀,方便查找。以[######] 2、直接利用logcat输出时间,调试执行速度,分析效率 logcat-vtime【Displaythedate,invocationtime,priority/tag,andPIDoftheoriginatingprocess.】
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Android为什么选择Java作为开发语言?
Android系统基于Linux,内核和驱动都是使用C/C++语言做开发,为什么又设计一个 Dalvik JVM,然后在SDK 层面选择Java作为开发语言?
按投票排序
避免Native作为应用代码导致的因为设备多样化导致App生态了支离破碎,是从Nokia哪里的教训。重新实现Dalvik,一是避来自Oracle Java的产权问题,二是从Sun J2ME来的教训。Java在过去的发展累积下了很多为业务逻辑产生的人力资源链,而移动应用开发的人力分布基本重合,可以充分复用。
首先我们需要选用一个语言来开发本地App。那么,我们第一步干啥了。在现有的语言中挑选语言。那么首先考虑的条件是不火的语言和没前途的语言是不在选择范围的。
---因为没人用,那么库就会少。因为库少就不会好用。因为不好用。所以用的人更少。生态圈的核心思想。
--那这个世界是不是只有C++/Java了。肯定不是。因为有些语言是有前途的。最大的特点是。简化了程序员的负担。或者效率更高。未来肯定是主流。那么我们常用的语言和有前景的语言是哪些C/C++/Java/C#/Python/Ruby/Go/JavaScript+Html好。这些是我们常用的语言。我们看待的是怎么把这些语言一步步的踢掉。然后只剩下Java的。首先踢掉的是C。至今大型的超过10万行代码的图形化界面程序没有几个是用C的。因为复杂的错误处理和没有纠错机制。使得程序非常容易崩溃。同时。因为C没有面向对象。那么工程化开发显得非常麻烦。相信没有人现在主动说。用C开发App这种多界面程序吧。继续踢掉的是C#。我干嘛要用一个一出生就为了对付Java的。还是微软的私货的语言。对。Android是开源界的。而C#注定不是适合开源界的语言。那我们继续踢语言:我们该要一门重语言还是轻语言?Java/C++/C#/Go/C是重语言。Python/Ruby/JavaScript+Html/是轻语言。对。我心目中划分语言的标准基本上是属于这样的,只要在代码中体现我们需要讲效率的。那就是重语言。重语言首先讲究的是运行效率。然后讲究工程化。轻语言讲究开发效率,讲究敏捷性开发。回到我们选语言的原则。我们想开发一款本地App。还在性能不高的手机上。那么除了C之外的开发语言中。运行效率最高的是C++,然后是Java。那么轻型语言就要被一个个踢掉了。Ruby在网页端有作为。但是库太少。图形库更少,开发者都是网页端的人。被踢。JavaScript+Html - ----&
这是未来大一统的趋势。但是我们现在是找一门开发本地App的语言。外加真心html+JavaScript有着先天的劣势。(效率+Offline)Python有着完善的库。有着极高的人气社区。在手机上开发也有过尝试。(Nokia就干过这事。Ubuntu Phone的UML也是一种类python的语言。)Google也是python的大用户。效率是问题。但是不是绝对的。先对Python实现保留意见。那么我们看这一轮入围的四门语言Java/C++/Python/Go再说Go。Go语言还不成熟。库也不多。开发者少。但是作为Google主打的语言。很有可能。Google会提供基于Go的Android sdk。至少现在Android的主打语言不会是Go。剩下三门C++/Python/JavaC++重运行效率。但是跨平台性较弱。开发难度较高。库多,用的人多。Python,重开发效率。跨平台性高。开发难度低,库多,用的人多。Java。重开发效率。不及python,重运行效率,不及C++。开发难度低。库多。用的人多。那再回到需求:Google是想要一门开发本地App的语言。Google想屏蔽掉底层硬件的差异。实现对于开发者来说是一个统一的平台。同时。对于手机这个现阶段的平台来说。耗电,以及性能。是无法回避的问题。那么这门语言的跨平台性要求很高。同时效率又很高。说Python:效率实在无法达到其普遍的手机要求。尤其是对于图像处理这种高计算操作。且。社区无法与C++/Java相比。意味着库没有Java和C++多,开发者不是跟Java和C++一个等级的。说C++:用过JNI的人都知道本地的C/C++库,至少要编译多次。不同的框架就代表者不同的编译环境。而且直接用C++编译运行的话。C++并不能很好的屏蔽掉硬件差异。所以对于开发来说调试来说,都是一个比较艰巨的任务。C++也不是一个非常好的工程化开发语言。那有没有破解法。Qt。可以用框架屏蔽掉大部分的细节操作。Qt5.0支持Android。为什么没用。估摸着是跟Qt不是Google家的产品加不开源的问题吧。说Java:虚拟机是核心。因为虚拟机真正能屏蔽掉开发的很多差异。而且通过虚拟机。开发者只要在打包的时候翻译成运行码而不需要翻译成机器码。通过虚拟机完成很多差异的解决。而效率并不是丢的非常严重。且Java比C++更受开源界和工业界的共同欢迎。即使Java也有版权问题。。。我们屏蔽掉最基础的硬件差异。通过Linux,在屏蔽掉手机的一些基本功能差异。然后提供纯粹的利于开发者开发和测试的方法。只有通过虚拟机了。而这个虚拟机是需要讲性能的。Google搞了一个Davlik虚拟机。对。这就是Android的核心。就是因为性能要求高。不得不重新开发虚拟机。Davlik就是一个非常讲效率的虚拟机。而其他的常用库都有的,现成的。根本就不需要自己去写的。只要打包就好。那么还有些必须考效率的库和应用。怎么办。用JNI技术调用C++对就这么坑爹。为什么Object-C这门语言无视我说的大部分要求了。因为Apple有能力创造一门更好的语言。Google对于Android,只是在开源社区挑一门语言。且。ObjectC生在Apple,死在Apple。兼容性。人家才不需要考虑。所以人家敢用Object-C,而Android为了实现真正的跨平台。只能选Java。参考:人家的回答:
个人一点不成熟的理解是:安卓最初设计出来的时候就是要在不同厂商的不同硬件平台上运行的。不同硬件平台意味着不同的CPU不同的指令集。在系统层面为了保持效率以及系统开发一般都用c/c++开发在应用层面就必须面对跨平台的支持性那么哪种语言能做到一次编译,到处运行呢?最成熟、可靠且流行的方案应该只有java了
linux是河床。sdk是水。jvm是船。你说过河是趟过河床还是坐船呢。java开发者那个数量之庞大啊。
现在安卓手机和平板里面已经有ARM、Intel、MIPS几种CPU了,ARM又有几代。如果用C,会很麻烦,因为要考虑不同的硬件,对于很多性能要求不高的小软件来说,也过于大材小用了。现在这样很好,大部分不需要高性能的小应用,纯JAVA,跨硬件毫无压力。3D游戏,视频图像之类需要高性能的,也能JNI。
说原生语言C++不会成熟,请参考iOS 的 object-C ,基本就是C++叔伯兄弟。开发了这么久的Android应用,我越来越觉得,用JAVA就是让你源码开放!!,随随便便就能反编译了,受用不少啊。
这问题应该有标准答案的,先去stackoverflow找找。我个人感觉主要是三点,java良好的封装性和对内存操作的隐藏带来的便捷;还是它的封装性让你不至于写错程序把手机烧了;另外就是java学习成本低,本身比较流行,在linux上也比较成熟。java有良好的封装性的具体解释:你开发个应用只需要api接口就可以了,不需要也不应该把硬件层面的东西交给你控制,用dma传输一段数据都要操作n个寄存器,太麻烦了,(当然ti什么的封装了arm之后也提供了各种简单的*ware,但仍然不如java友好)另外作为一个从学c嵌入式开发到面向对象再到脚本语言的人,我觉得是越学越顺越方便,如果反过来学我估计会疯的。
我个人猜测是:1.Java在互联网时代已经取得了重大成功,所产生的第三方的优秀的类库也就比较容易移植了,而且Java有者很强的面对对象语言特性。
2.从整个生态链的角度讲,Java程序员众多,Java是比较简单易学,这样容易聚集众多的开发者。而之所以重新设计了一个JVM,一方面剔除了Java中自己的UI组件(awt,swt)等其他部分,另一方面是由于嵌入式设备的性能,Google重新设计JVM目的是想更加高效的操作硬件。
Android平台使用Java语言开发,纯粹是Google的商业策略,Google倒是想用自己的(例如Go语言)。一门计算机语言的普及,从编译器、语法、基础库,然后到草根程序员认可,不是短时间能完成得了的。而面对苹果的i系列移动设备在市场上的疯狂程度,Android只有通过捷径展开竞争。Java语言是一个相当成熟的计算机编程语种,除了基础类库完善,各种高效的第三方组件更是不计其数,最最重要的一点是Java虚拟机规范也是开放的,以Google的实力在此规范下做一款虚拟机出来不费吹灰之力(即便是新的硬件架构)。这个策略实在太英明了。市场上,在Android 4.x版本对比iOS就呈现压倒性优势,以致于Oracle都非常嫉妒,以侵犯API版权为名索要好处费。高级开发语言竞争也非常激烈,Java实际上在慢慢失去优势,应该感谢Android为Java语言的兴旺添一把火。
1.Java是世界上使用人数最多的语言,所以更容易吸引开发者到Android生态里开发。(懂了Java又想做Android开发几乎没有什么学习难度和心理压力)2.Java有一堆现成的开发工具,开发难度更小(对比新语言)。3.很多手机开发人员已经熟悉使用Java(Java ME),这个领域中,Java已为人所熟悉。4.Java有内存管理,没有指针。相对C、C++更安全,在手机中,安全性很重要!5.因为Java跑在虚拟机上,可限制APP程序开发OS内核,以保证手机的安全性。6.Java在编译成JVM可运行的代码后,不需要在多台不同手机(硬件设备)上重新编译。手机硬件设备经常日新月异,所以这一点上也显得格外重要。7.和C、C++相比,APP在手机上的那一点速度差异并不是一个大问题,如果是的话,应该考虑使用汇编语言。以上参考自stackoverflow
因为Java可以做到平台无关性,想想Android上有多少乱七八糟的硬件。全都匹配会累死人的。另外,在大部分手机应用都是CS模式的情况下,用于网络通信的时间远远大于处理数据的时间,总运行效率上C并没有优势,反而会增加开发的复杂性。比如在我的备胎机诺基亚2730c上用UC,下载网页数据占载入时间的80%以上。在高端机器上,用于数据处理的时间更是少得可怜,这时,程序的运行效率就不如开发效率重要了
我也很诧异为什么要用Java来实现android。已有答案这么多洗地的,其实我认为Java的不可控gc,就能(而且该)要了android的命!但真不知道为什么android能逆水行舟到今天!看来只能归为天数了。。。有人说android的跨平台性,安全性,工具,已有代码等等。。。其实。。。android就是个linux,你都linux了,还怕这些?居然还有人说java的内存管理。。。java的gc机制根本就不适合做交互程序!因为gc是不可预知的,所以gc带来的卡顿也是不可预知的!只能是程序员蛋疼的遵守java的规范,祈求gc开恩罢了。作为4年的Qt developer和首批MeeGo的试用者,我只能对MeeGo表示惋惜,并对Nokia的中2行为表示惋惜!上面的答案我尽量不夹杂个人好恶,真的尽力了。
其实是历史原因。当时正是java火的时候,如果你是程序员,必定选用java而不是c++。当时对CPU太乐观了。摩托罗拉使用java开发手机系统,结果太慢无法运行。(微软也干过这种蠢事 )。但是Android很幸运,内核和系统运行库是用c/c++写的,而应用是java或c++或java&c++写的,所以才能运行。现在后悔也晚了,大局已定,除非被其它系统取代。现在分析为何使用java就是在扯蛋,说什么吸引程序员,应对更多复杂的设备,开发成本低,想多了。现在优秀点的应用都是c++和java结合使用,两种语言一起使用反而增加了复杂度。
居然妖我,我真滴不会写java呀&_&开发难度和效率之间是存在不可协调的矛盾滴……不可否认,java写起来感觉比c++更简单,更容易上手,而且有丰富的类库支持Android的终端繁多,硬件多样化,java虚拟机出色的实现了跨平台,其他系统恐怕没有抽象出高层的接口给程序调用,另外google优化过了自己的虚拟机其他我就不知道了。。。卖个萌好了~(@^_^@)~
因为当初Android不是Google做的,所以选了适合做手机软件的开发者最多的语言。如果Google一开始就做Android,先不说能不能成,我觉得加速开发go语言用来做软件开发语言也不是没有可能的,当然那样的话golang就完全不是现在这个样子了。
因为Objective-C是Apple的,C#是微软的,这些都不能用。JAVA是SUN的,Apple和微软都讨厌JAVA,SUN反微软反苹果,敌人的敌人是朋友,说不定哪天还能买过来 
搞了半天是java,我以为有一门新创造的语言呢
首先,编译型的针对没个平台都得编译,为了效率可以提供但肯定不能作为最主要的开发语言,安卓不是iphone硬件比较固定,安卓上CPU GPU型号太多,架构各异,解释型只要给了统一的api,实现了虚拟机就能跑程序了,而解释型语言当中的静态语言Java,C#当然是最合适的,不用C#是因为谷歌和微软死对头,不爱用对方的东西,C#已经标准化了拿去用完全没有问题,如今甲骨文也靠Java告谷歌呢。至于动态类型语言主要则是成熟度不一定够以及效率问题,其中js有v8但执行效率是c++的8倍,而且js的原型对面向对象的支持并不好,出错难以调试,智能提示非常差等许多问题,python也许也是个还不错的选择,主要还是效率有差距。
1.Java 开发者众多2.现成的代码,工具,类库也多|3.需要抽象硬件实现。安卓需要兼容大量的硬件4.当时需要快速的追平App Store上面的软件数量。C++ 相对学习和精通也好更难些。比较难开发。安卓系统的游戏用什么语言开发的?_百度知道
安卓系统的游戏用什么语言开发的?
安卓游戏主要还是Java语言。Java编写小软件还是很轻松,如果想做安卓游戏就非常复杂了。都是用eclipse+ADT+android SDK开发的安卓游戏,还要有一定的美工基础。推荐游戏引擎,可以自动封装成apk的,小的文字类或者RPG可以用renpy引擎,引擎语言官网上有,纯文字类的推荐onscripter,编写相对简单。编写一个好的安卓手机游戏客户端需要很长的过程和完善的团队,自己一个人的力量是十分有限的,自己可以做比如挖掘机之类的小游戏。
其他类似问题
6人觉得有用
为您推荐:
提问者采纳
java,C++都可以安卓系统用的是linux系统的核心,支持linux的语言基本都可以的.
来自团队:
安卓系统的相关知识
其他3条回答
java c++ c
一般是java
用的是Java;
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁[原]深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制 - 推酷
[原]深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制
4.3定制Android平台系统
通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品,从本节开始,我们从最原始的Android源码系统里一步一步定制出自己的Android系统。本节主要内容包含:根据Android源码,添加新产品编译项,定制系统启动界面和文字,定制系统启动动画和声音,定制系统桌面。
4.3.1添加新产品编译项
Android系统的源代码是一个逻辑结构非常独立工程,在一套Android源码中可以编译出多个产品映像,在需要编译某一个产品系统时,只要通过lunch命令选择产品编译项即可。本节我们介绍如何在Android源码中创建新产品编译项并定制编译出该产品系统。
在创建新产品编译项时,要先了解下面几个概念:
&O&目标产品:具体指某个最终用户买到的Android设备,如:iPhone5,乐PhoneS2,小米手机等。
&O&产品系列:开发手机的团队通常由同一团队打造,在研发出一款产品后,往往要继续在其基础上研发出新产品,新产品往往是在老产品的硬件或软件基础上做一些升级,这些产品们就是一个产品系列。比如:联想的乐Phone系列手机包含:乐PhoneS1和乐PhoneS2,他们同属于一个系列。
&O&目标设备:目标设备可以理解为手机主板,它是指手机设备硬件配置信息的集合体,每个手机产品都有设备硬件配置,一个设备硬件配置可能被不同产品使用,同一手机有高配置版本和低配置版本,如乐PhoneS2有512M RAM、8G Flash容量版本和1G RAM 、16G Flash容量版本。
在Android编译系统中,每个编译项编译出一个产品系统,每个目标产品都对应一个目标设备,一个产品系列包含多个不同的产品,一个目标设备可能被多个产品配置使用。
由前面描述可知,同一系列的新老产品之间可以存在“继承关系”,新产品是老产品的“子产品”,老产品是新产品的“父产品”,子产品可以复用父产品的特性,还可以重写、扩展父产品。如:老产品不支持NFC近距离通信技术,新产品支持NFC技术。同样,设备主板间也存在“继承关系”。
图x-x 产品、设备与编译项关系图
如图x-x所示,某一产品系列包含3个产品,2个目标设备,其中产品2继承了产品1,产品2 使用了设备2,它是基于产品1所使用的设备1的升级。产品3使用了和产品2一样的设备2,他们硬件配置一样,但是却不是同一产品,3个不同产品都对应一个产品编译项。
在Android编译系统中,产品编译项相关配置文件都在device/&厂商名&/目录下。厂商的产品列表由AndroidProducts.mk文件定义,目标产品信息由&产品名&.mk定义,目标设备信息由BoardConfig.mk和AndroidBoard.mk定义。创建新产品的编译项就是创建上述几个mk文件的过程。
1.&&&&&&创建厂商目录
不同的手机厂商对应device/下不同目录,在厂商目录下放置该厂商的产品相关信息,我们厂商名定义为mycompany。
$ cd ~/android/android_source
$ mkdir device/mycompany
2.&&&&&&在厂商目录下创建设备目录
定义设备名为myphone。
$ mkdir device/mycompany/myphone
3.&&&&&&添加新产品编译项配置文件,该配置文件在执行source build/envsetup.sh时,被加载执行
$ vim device/mycompany/myphone/vendorsetup.sh
在vendorsetup.sh文件时添加下面一条命令,用于向编译系统添加编译项,新添加的产品名为:myproduct,编译类型为eng。
add_lunch_combo myproduct-eng
注:add_lunch_combo命令是build/envsetup.sh脚本中定义的函数,表示将一个新产品编译项添加到lunch菜单里。
4.&&&&&&创建产品列表配置文件AndroidProducts.mk
AndroidProducts.mk文件用于定义当前厂商所拥有的所有产品列表,每个产品都对应一个配置文件:
$ vimdevice/mycompany/myphone/AndroidProducts.mk
在产品列表配置文件中添加如下内容:
PRODUCT_MAKEFILES := \
&&&$(LOCAL_DIR)/full_product.mk
注:PRODUCT_MAKEFILES变量用于保存所有产品配置信息列表,$(LOCAL_DIR)表示当前目录,full_product.mk表示某一款产品的配置文件。
5.&&&&&&配置full_product.mk文件,定义产品的配置信息,添加如下内容:
include build/target/product/languages_full.mk
include build/target/product/full.mk
# Discard inherited values and use our owninstead.
PRODUCT_NAME := myproduct
PRODUCT_DEVICE := myphone
产品配置也可以和Java中的类一样被继承,通过inclulde命令可以将指定的文件包含进来,然后在后面可以对里面的内容进行重写。一般而言不同的产品产品名和设备名都不一样,在full_product.mk中对继承的full.mk中的产品名和设备名进行重写:PRODUCT_NAME为myproduct,PRODUCT_DEVICE为myphone。
在full_product.mk文件中继承的languages_full.mk内容如下:
@build/target/product/languages_full.mk
PRODUCT_LOCALES := en_US fr_FR it_IT es_ES de_DEnl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TRpt_PT pt_BR rm_CH sv_SE bg_BG ca_ES en_GB fi_FI hr_HR hu_HU in_ID iw_IL lt_LTlv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH
该配置文件里表示的是当前产品系统里默认支持的本地语言,由上述配置信息可知,它基本包含了Android所支持的所有语言包。
@build/target/product/full.mk
PRODUCT_PACKAGES := \
&&&OpenWnn \
&&&PinyinIME \
&&& VoiceDialer\
&&&libWnnEngDic \
&&&libWnnJpnDic \
&&&libwnndict
# Additional settings used in all AOSP builds
PRODUCT_PROPERTY_OVERRIDES := \
&&&keyguard.no_require_sim=true \
&&&.android.dateformat=MM-dd-yyyy \
&&&.android.dataroaming=true \
&&&ro.ril.hsxpa=1 \
&&&ro.ril.gprsclass=10
PRODUCT_COPY_FILES := \
&&&development/data/etc/apns-conf.xml:system/etc/apns-conf.xml \
&&&development/data/etc/vold.conf:system/etc/vold.conf
# Pick up some sounds - stick with the shortlist to save space
# on smaller devices.
$(call inherit-product,frameworks/base/data/sounds/OriginalAudio.mk)
# Get the TTS language packs
$(call inherit-product-if-exists,external/svox/pico/lang/all_pico_languages.mk)
# Get a list of languages. We use the small listto save space
# on smaller devices.
$(call inherit-product,build/target/product/languages_small.mk)
$(call inherit-product,build/target/product/generic.mk)
# Overrides
PRODUCT_NAME := full
PRODUCT_BRAND := generic
PRODUCT_DEVICE := generic
PRODUCT_MODEL := Full Android
继承的full.mk文件内容比较多,我们将主要的一些变量列出如表x-x所示。
PRODUCT_PACKAGES
系统预置的模块列表,不仅仅只是Android应用程序,还可以包含库,可执行程序等
直接将系统中要安装的模块名以空格隔开列出
PRODUCT_PROPERTY_OVERRIDES
系统设置的属性值
将所有预设的属性以空格隔开列出,属性格式为:key-value
PRODUCT_COPY_FILES
要拷贝的文件
将文件列表拷贝到文件系统中,文件格式为:源文件:目标文件
PRODUCT_NAME
该产品名要和编译项中产品名一致
PRODUCT_BRAND
PRODUCT_DEVICE
产品对应的设备名
该名字要和产品设备主板配置文件(BoardConfig.mk)所在目录名一致
PRODUCT_MODEL
总结:我们自己定义的full_product产品继承了build/target/product/目录下的full.mk和languages_full.mk,full.mk文件是Android系统定义的一个“通用产品”,languages_full.mk文件是全部语言包配置文件,这样,自己的产品full_product就具有了通用产品的特点并且支持全部语言包。
6.&&&&&&定义目标产品对应的设备配置文件AndroidBoard.mk和BoardConfig.mk
同样的道理,我们可以继承使用通用设备配置文件:build/target/board/generic/目录下的AndroidBoard.mk和BoardConfig.mk文件。
&O&创建AndroidBoard.mk和BoardConfig.mk文件
$ touch AndroidBoard.mk BoardConfig.mk
&O&添加AndoridBoard.mk的内容如下:
@ device/mycompany/myphone/AndroidBoard.mk
include build/target/board/generic/AndroidBoard.mk
“继承”的父AndroidBoard.mk,其内容:
@build/target/board/generic/AndroidBoard.mk
LOCAL_PATH := $(call my-dir)
file := $(TARGET_OUT_KEYLAYOUT)/tuttle2.kl&&&&&&&&&& # Linux内核按键码布局文件
ALL_PREBUILT += $(file)
$(file) : $(LOCAL_PATH)/tuttle2.kl | $(ACP)
&&&&&&&& $(transform-prebuilt-to-target)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := tuttle2.kcm&&&&&&&&&&& #&Android按键码映射文件
include $(BUILD_KEY_CHAR_MAP)
其实build/target/board/generic/AndroidBoard.mk文件里只是拷贝了按键映射文件和默认系统属性文件,我们可以将其内容直接拷贝到device/mycompany/myphone/AndroidBoard.mk中。
&O&添加BoardConfig.mk的内容如下:
@ device/mycompany/myphone/BoardConfig.mk
includebuild/target/board/generic/BoardConfig.mk
“继承”的父BoardConfig.mk内容:
@build/target/board/generic/BoardConfig.mk
# config.mk
# Product-specific compile-time definitions.
# The generic product target doesn't have anyhardware-specific pieces.
TARGET_NO_BOOTLOADER := true&&&&&&&&&&&&&&&&& # 当前设备是否没有Bootloader
TARGET_NO_KERNEL := true&&&&&&&&&&&&&&&&&&&&&&&&&&& # 当前设备是否没有Linux内核
TARGET_CPU_ABI := armeabi&&&&&&&&&&&&&&&&&&&&&&&&&& # 当前设备支持的目标架构
HAVE_HTC_AUDIO_DRIVER := true&&&&&&&&&&&&&&&&&& # 是否使用HTC的音频驱动
BOARD_USES_GENERIC_AUDIO := true&&&&&&&&& # 是否使用通用音频技术
# no hardware camera
USE_CAMERA_STUB := true&&&&&&&&&&&&&&&&&&& # 是否使用摄像头Stub
通过BoardConfig.mk的信息可知,其实该文件就是定义了一些设备硬件相关的一些变量,这些变量用来裁剪系统的功能,决定Android系统可运行的体系构架。
7.&&&&&&根据需要定义产品默认属性和键值信息
Android系统的属性服务类似于Windows的注册表,记录着系统的一些设置信息,我们可以在新产品中预定义一些属性值来设置自己产品。在Android编译系统中,属性都保存在xxx.prop文件中,在build/target/board/generic/system.prop中定义了默认的属性,我们可以在它基础上进行修改。
复制属性文件:
$ cp build/target/board/generic/system.prop& device/mycompany/myphone/
在Android系统中,底层使用Linux内核来接收来自按键硬件上报的键值信息,上层处理用户按键的是Android的框架,二者之间通过两个键值布局文件来进行键值的映射。
&O&Keylayout文件:按键布局文件,以kl后缀命名,该文件用来定义按键驱动里上报的键值号(数字)和Linux内核中通过event事件上报的键值(字符)之间的映射关系。kl文件要放在/system/usr/keylayout/目录下或/data/usr/keylayout/目录下。
&O&KeyCharMap文件:键值字符映射文件,以kcm后缀命名,它用来将Linux内核上报来的键值(字符)进行转换,转换成Android系统里可以识别的键盘码或组合按键。kcm文件要放在/system/usr/keychars/目录下或/data/usr/keychars/目录下。
上述两个按键映射文件使用按键驱动名作为其文件名,如果没有驱动名对应的布局文件,则使用/system/usr/keylayout/qwerty.kl和/system/usr/keychars/qwerty.kcm作为默认的按键映射文件。这两个文件名都通过AndroidBoard.mk文件负责拷贝和安装。
如果我们要使用模拟器作为目标设备,只需要将源码build/target/board/generic/目录里的tuttole2.kl和tuttle2.kcm拷贝到AndroidBoard.mk所在的目录中即可。
$ cp build/target/board/generic/tuttle2.kl& device/mycompany/myphone/tuttle2.kl
$ cp build/target/board/generic/tuttle2.kcm& device/mycompany/myphone/tuttle2.kcm&
如果想要自定义系统的物理按键与Android系统的按键映射关系,则需要在tuttle2.kl和tuttle2.kcm的基础上进行修改,然后再修改AndroidBoard.mk的内容:
$ cp build/target/board/generic/tuttle2.kl& device/mycompany/myphone/&按键驱动名&.kl
$ cp build/target/board/generic/tuttle2.kcm& device/mycompany/myphone/&按键驱动名&.kcm&
修改device/mycompany/myphone/AndroidBoard.mk文件:
LOCAL_PATH := $(call my-dir)
file := $(TARGET_OUT_KEYLAYOUT)/
&按键驱动名&
.kl&&&&&&&&&& # Linux内核按键码布局文件
ALL_PREBUILT += $(file)
$(file) : $(LOCAL_PATH)/
&按键驱动名&
.kl | $(ACP)
&&&&&&&& $(transform-prebuilt-to-target)
include $(CLEAR_VARS)
LOCAL_SRC_FILES :=
&按键驱动名&
.kcm&&&&&&&&&&&&&&&&& #& Android按键码映射文件
include $(BUILD_KEY_CHAR_MAP)
注:kcm文件最终被编译系统的key_char_map.mk编译成xxx.kcm.bin的二进制形式,这是因为每个Android应用程序都要加载该按键映射文件,为了加快读取速度刻意而为之的。
创建新产品编译项时创建的目录与文件结构如下:
device/mycompany/&&&&&&&&&&&&&&&&&&&&&&&&& # 厂商目录
└── vendorsetup.sh&&&&&&&&&& # 添加编译项命令文件
└── myphone/&&&&&&&&&&&&&&&&&&& # 设备名目录
├── AndroidBoard.mk&&&&&&&&&&&&&&&&& # 设备属性和键值映射配置文件
├── AndroidProducts.mk&&&&&&&&&&&& # 产品列表文件
├── BoardConfig.mk&&&&&&&&& # 设备硬件配置及目标架构配置文件
├── full_product.mk&&&&&&&&&&& # 目标产品配置文件
├── system.prop&&&&&&&&&&&&&&&&&&&&&&&&& # 系统默认属性配置文件
├── tuttle2.kcm&&&&&&&&&&&&&&&&&&&&&&&&&&& # Android系统键值映射文件
├── tuttle2.kl&&&&&&&&&&&&&&&&&&&&& # Linux内核按键布局文件
确认上述目录和文件创建没有问题了,执行Android编译步骤:sourcebuild/envsetup.sh,lunch选择myproduct-eng编译项。
如果看到如下信息,说明我们已经添加新产品成功。
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.6
TARGET_PRODUCT=
TARGET_BUILD_VARIANT=
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GRK39F
============================================
8.&&&&&&常见问题
&O&问题1: lunch菜单里没有出现myproduct编译项
原因及解决方法:在执行lunch之前,要执行source build/envsetup.sh命令,确认vendorsetup.sh文件存在及其内容正确无误。
&O&问题2:选择完lunch菜单里的编译项后,出错:
*** No matches for product&myproduct&.& Stop.
** Don't have a product spec for:'myproduct'
** Do you have the right repo manifest?
原因及解决方法:编译系统找不到用户选择的编译项里的myproduct产品,确认AndroidProducts.mk文件里列出了myproduct产品的配置文件full_product.mk,并且full_product.mk文件中PRODUCT_NAME变量的值为产品名:myproduct
&O&问题3:选择完lunch菜单里的编译项后,出错:
*** No config file found for TARGET_DEVICEmyphone.& Stop.
** Don't have a product spec for:'myproduct'
** Do you have the right repo manifest?
原因及解决方法:编译系统找不到myproduct产品对应的设备myphone,确认myproduct产品的配置文件full_product.mk中PRODUCT_DEVICE变量的值为产品名:myphone,并且在device/mycompany/目录下创建了myphone的设备目录,在该目录下存在BoardConfig.mk文件。
4.3.2定制产品的意义及定制要点
Android系统是一个完全开源的系统,我们可以通过修改Linux内核代码和Android源码,定制具有独特创意的产品系统,对于产品同质化非常严重的移动市场, Android系统的细节个性化定制也可以让用户眼前一亮。另外,一些产品明确要求要修改或增加一些个性化,如:默认的Android系统开机界面是一个黄嘴的小企鹅,在Android系统启动过程中是一个ANDROID字样的动画效果,厂商一般都要求自己产品开机界面是厂商Logo,开机动画是一个能动态、鲜明表现公司活力的动画效果,我们从本节开始介绍定制产品系统的实现技术。
在整个开机过程中,屏幕上会出现三次内容,如图x-x 所示:
&O& Linux启动时画面,通常是个黄嘴的小企鹅
&O& Android系统init进程启动阶段画面,是“ANDROID”文字字样
&O& Android系统启动阶段动画,是滚动的ANDROID动画
图 x-x 开机界面与Android动画
定制系统开机动画
【实验背景知识】
Android的开机动画是由Linux本地守护程序bootanimation专门控制实现的,其代码在:frameworks/base/cmds/bootanimation/目录下,修改Android开机动画有两种方式:
&O&蒙板图片替换:
替换frameworks/base/core/res/assets/images/目录下的两个图片文件:android-logo-mask.png和android-logo-shine.png。android-logo-mask.png是镂空蒙板图片,android-logo-shine.png是镂空蒙板后面的闪光png图片。两个图片通过叠加移动来达到动画效果。
&O&逐帧动画替换:
在/data/local/或/system/media/目录创建bootanimation.zip文件,该压缩包文件里存放有逐帧动画及控制脚本。
【实验组成】
本实验分为两部分:蒙板图片替换实验和逐帧动画替换实验。
【实验内容】
分析Android系统的两种开机动画实现方式,制作并替换开机动画,最终在Android模拟器中运行定制开机动画的系统。
【实验目的】
通过实验,了解Android系统的两种开机动画实现方式,掌握如何定制产品的开机动画,并在Android模拟器中,运行定制开机动画的Android系统。
【实验平台】
拥有Android源码编译环境的Ubuntu操作系统(可以在Windows系统中虚拟Ubuntu系统)。
【蒙板图片替换实验步骤】
1.&&&&&& 使用PhotoShop等图像处理软件制作一张背景为黑色,中间镂空的png格式的图片,命名为:android-logo-mask.png,如图x-x所示。
图x-x 制作镂空动画
2.&&&&&&将android-logo-mask.png拷贝到frameworks/base/core/res/assets/images/目录下替换Android默认的图片,为了防止源码不编译图片资源,将图片时间戳更新一下。
$ cp android-logo-mask.png&&& ~/android/android_source/frameworks/base/core/res/assets/images/
$ touch ~/android/android_source/frameworks/base/core/res/assets/images/android-logo-mask.png
3.&&&&&&重新编译Android的系统资源包framework-res.apk
$ source build/envsetup.sh
$ lunch generic-eng
$ mmm frameworks/base/core/res/
4.&&&&&&生成新的system.img
$ make snod
5.&&&&&&启动Android模拟器,实验效果如图x-x所示。
$ ./run_emulator.sh
图x-x 定制开机动画效果
【逐帧动画替换实验步骤】
1.&&&&&&在/data/local/或/system/media/目录创建bootanimation.zip文件
如果放在/data/local目录下,不需要编译Android源码,直接通过adb命令或文件管理软件拷贝到目录下即可,如果集成进Android系统中,则需要放在/system/media/目录下,这时要重新编译生成system.img映像。
bootanimation.zip文件是直接由几个文件打包生成的,打包的格式是ZIP,打包时的压缩方式选择为存储。
图x-x 压缩文件方式
bootanimation.zip文件打包前的结构为:
表x-x bootanimation.zip压缩包文件结构
动画属性描述文件
第一阶段动画图片的目录
第二阶段动画图片的目录
其中part0和part1中的动画图片类似于电影胶片,两张图片之间变化较小,他们以固定的速度显示,从而产生动画效果,图片的大小和图片显示的时间控制由desc.txt文件说明。
desc.txt文件内容为:
480 250 15
p 1 0 part0
p 0 10 part1
desc.txt文件的格式为:
数据及说明
320(图片宽)
320(图片高)
15(每秒显示帧数)
第一阶段动画属性
P(默写标志符)
1(循环次数为1 )
0(进入该阶段的间隔时间)
part0(该阶段图片存放目录)
第二阶段动画属性
p(默写标志符)
0(无限循环)
10(进入该阶段的间隔时间)
part1(该阶段图片存放目录)
标识符:p&是必须的。
循环次数:指该目录中图片循环显示的次数,0表示本阶段无限循环。
每秒显示帧数:就是每秒显示的图片数量,决定每张图片显示的时间。
阶段切换间隔时间:指的是该阶段结束后间隔多长时间显示下一阶段的图片,其单位是每张图片显示的时间。
对应图片目录:就是该阶段动画的系列图片,以图片文件目录的顺序显示动画,而且图片的格式必须要为PNG。
由于逐帧动画不太方便制做,我们直接使用光盘中:章节实验/第四章定制系统开机动画/bootanimation.zip文件作为演示。
2.&&&&&&如果bootanimation.zip放到/system/media/目录下,则重新编译生成system.img
$ source build/envsetup.sh
$ lunch generic-eng
$ make snod
3.&&&&&&启动Android模拟器,查看动画效果,如图x-x和x-x所示。
$ ./run_emulator.sh
图x-x 第一阶段开机动画
图x-x 第二阶段开机动画
结论:通过实验看出,当我们使用逐帧动画时,蒙板动画就不播放了,这是因为Android系统只能使用一种启动动画方式,先判断是否使用了逐帧动画,如果没有使用逐帧动画时,才使用默认的蒙板动画。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示

我要回帖

更多关于 android 系统语言列表 的文章

 

随机推荐