Android系统移植讲解
Android5.1-7.1系统(framework)定制、修改、移植、总结-上篇
Android5.1-7.1系统(framework)定制、修改、移植、总结-上篇Android 5.1 - 7.1 系统(framework)定制、修改、移植、总结 - 上篇转⽬录1:修改开机logo修改开机logo有两种⽅法,⼀种直接去改c语⾔代码,第⼆种替换图⽚⽤python⽣成splash。
第⼀种⽅法我没试过,感觉挺⿇烦的,还有分辨率限制,超过多少分辨率就不能⽤第⼀种⽅法。
1. 修改的⽂件路径LINUX/android/bootable/bootloader/lk/splash2. 准备好logo图⽚(png、bmp格式)3. 查看中原图⽚的分辨率,修改logo图⽚保证分辨率⼀致4. ⽣成splash.img镜像⽂件注:图⽚分辨率很重要!很重要!很重要!⽣成splash.img 步骤1.The steps to generate a splash.img:2.3.1 sudo apt-get install python-imaging4.5.2 python ./logo_gen.py boot_001.png (*.bmp)为了减少编译时间可以直接将⽣成好的splash.img将刷机包中的⽂件替换掉。
2:Framework(SysteimUI) Android在状态栏增加⽿机拔插图标Android 4.1在拔插⽿机时,状态栏没有提⽰图标。
最近做了这个新的需求,步骤如下:1、在\frameworks\base\packages\SystemUI\res\drawable-Xdpi下增加⼀个⽿机图⽚stat_sys_headset.png。
drawable-Xdpi中的X根据⼿机的分辨率来确定,我的⼿机⽤的是drawable-hdpi;2、在\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarPolicy.java中增加下⾯的代码:1.private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {2.@Override3.public void onReceive(Context context, Intent intent) {4.String action = intent.getAction();5.if (action.equals(Intent.ACTION_ALARM_CHANGED)) {6.updateAlarm(intent);7.}8.else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {9.updateSyncState(intent);10.}11.else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||12.action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {13.updateBluetooth(intent);14.}15./*add code for adding headset icon in statusbar.*/16.else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {17.updateHeadsetState(intent);18.}19.//endelse if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||21.action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {22.updateVolume();23.}24.else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {25.updateSimState(intent);26.}27.else if (action.equals(TtyIntent.TTY_ENABLED_CHANGE_ACTION)) {28.updateTTY(intent);29.} else if (action.equals(Intent.ACTION_LOCALE_CHANGED)) {30.31.// when acceptting the locale change event,reload USB connection notification.32.boolean isUsbConnected = mStorageManager.isUsbMassStorageConnected();33.mStorageNotification.onUsbMassStorageConnectionChanged(isUsbConnected);34.}35.}36.};37.38.public PhoneStatusBarPolicy(Context context) {39.mContext = context;40.41.// init StorageNotification object42.mStorageNotification = new StorageNotification(mContext);43.mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);44.45.// listen for broadcasts46.IntentFilter filter = new IntentFilter();47.filter.addAction(Intent.ACTION_ALARM_CHANGED);48.filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);49.filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);50.filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);51.filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);52.filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);53./*add code for adding headset icon in statusbar.*/54.filter.addAction(Intent.ACTION_HEADSET_PLUG);55.//end56.filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);57.filter.addAction(TtyIntent.TTY_ENABLED_CHANGE_ACTION);58.59.// add locale change event filter60.filter.addAction(Intent.ACTION_LOCALE_CHANGED);61.mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);62.63.int numPhones = MSimTelephonyManager.getDefault().getPhoneCount();64.mSimState = new IccCard.State[numPhones];65.for (int i=0; i < numPhones; i++) {66.mSimState[i] = IccCard.State.READY;67.}68.// storage69.mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);70.mStorageManager.registerListener(mStorageNotification);71.72.// TTY status73.mService.setIcon("tty", R.drawable.stat_sys_tty_mode, 0, null);74.mService.setIconVisibility("tty", false);75.76.// Cdma Roaming Indicator, ERI77.mService.setIcon("cdma_eri", R.drawable.stat_sys_roaming_cdma_0, 0, null);78.mService.setIconVisibility("cdma_eri", false);79.80.// bluetooth status81.BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();82.int bluetoothIcon = R.drawable.stat_sys_data_bluetooth;83.if (adapter != null) {84.mBluetoothEnabled = (adapter.getState() == BluetoothAdapter.STATE_ON);85.if (adapter.getConnectionState() == BluetoothAdapter.STATE_CONNECTED) {86.bluetoothIcon = R.drawable.stat_sys_data_bluetooth_connected;87.}88.}89.mService.setIcon("bluetooth", bluetoothIcon, 0, null);90.mService.setIconVisibility("bluetooth", mBluetoothEnabled);91.92./*add code for adding headset icon in statusbar.*/93.mService.setIcon("headset", R.drawable.stat_sys_headset, 0, null);94.mService.setIconVisibility("headset", false);95.//end96.97.// Alarm clock98.mService.setIcon("alarm_clock", R.drawable.stat_sys_alarm, 0, null);99.mService.setIconVisibility("alarm_clock", false);100.101.// Sync state102.mService.setIcon("sync_active", R.drawable.stat_sys_sync, 0, null);103.mService.setIcon("sync_failing", R.drawable.stat_sys_sync_error, 0, null);104.mService.setIconVisibility("sync_active", false);105.mService.setIconVisibility("sync_failing", false);106.107.// volume108.mService.setIcon("volume", R.drawable.stat_sys_ringer_silent, 0, null);109.mService.setIconVisibility("volume", false);110.updateVolume();111.}112.113.114./*add code for adding headset icon in statusbar.*/115.private final void updateHeadsetState(Intent intent) {116.boolean mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1);117.Slog.v(TAG, "updateHeadsetState: HeadsetState: " + mIsHeadsetOn);118.119.mService.setIconVisibility("headset", mIsHeadsetOn);120.}在\frameworks\base\core\res\res\values\config.xml中加⼊⽿机图标控制字段(headset):1.<string-array name="config_statusBarIcons">2.<item><xliff:g id="id">ime</xliff:g></item>3.<item><xliff:g id="id">sync_failing</xliff:g></item>4.<item><xliff:g id="id">sync_active</xliff:g></item>5.<item><xliff:g id="id">gps</xliff:g></item>6.<item><xliff:g id="id">bluetooth</xliff:g></item>7.<item><xliff:g id="id">nfc</xliff:g></item>8.<item><xliff:g id="id">tty</xliff:g></item>9.<item><xliff:g id="id">speakerphone</xliff:g></item>10.<item><xliff:g id="id">mute</xliff:g></item>11.<item><xliff:g id="id">volume</xliff:g></item>12.<item><xliff:g id="id">wifi</xliff:g></item>13.<item><xliff:g id="id">cdma_eri</xliff:g></item>14.<item><xliff:g id="id">phone_signal_second_sub</xliff:g></item>15.<item><xliff:g id="id">data_connection</xliff:g></item>16.<item><xliff:g id="id">phone_evdo_signal</xliff:g></item>17.<item><xliff:g id="id">phone_signal</xliff:g></item>18.<item><xliff:g id="id">battery</xliff:g></item>19.<item><xliff:g id="id">alarm_clock</xliff:g></item>20.<item><xliff:g id="id">secure</xliff:g></item>21.<item><xliff:g id="id">clock</xliff:g></item>22.<item><xliff:g id="id">headset</xliff:g></item>23.24.</string-array>因为所加代码中的 mService.setIcon和mService.setIconVisibility最终会调⽤到StatusBarManagerService,它的构造函数有mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons));语句,找到config_statusBarIcons所在的配置⽂件为config.xml。
安卓Android ROM定制、移植:第六篇:boot.img、recovery解包和打包
太抱歉了,因为教程实在是有点粗浅了,其实很多东西都不知道怎么去写,这不是复制粘贴,当然很多只是一步步的走的,不过也许我自己觉得已经阐述的很清楚了,可是一旦别人看起来,还是感觉很深奥,没办法,本人就这点能力了,呵呵!大家都知道安卓的核心更换呢,那是在boot.img里面,那么如何在WINDOWS下去解开它呢,LINUX的自己略过。
首先百度BOOTIMG.EXE,然后你懂的,会出来一大堆,这得感谢制作bootimg.exe的作者,本来是为华为的机器做的分解工具,不过我们也可以拿来分解boot.img、recovery.img等,OK!先来谈谈这两个文件的基础,部分来自网络。
boot和recovery映像的文件结构boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。
此类文件的定义可以从源代码android-src/system/core/mkbootimg找到一个叫做bootimg.h的文件。
(译者的话,原文是一个叫做mkbootimg.h的文件,但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。
/*** +-----------------+** | boot header | 1 page** +-----------------+** | kernel | n pages** +-----------------+** | ramdisk | m pages** +-----------------+** | second stage | o pages** +-----------------+** n = (kernel_size + page_size - 1) / page_size** m = (ramdisk_size + page_size - 1) / page_size** o = (second_size + page_size - 1) / page_size**** 0. all entities are page_size aligned in flash** 1. kernel and ramdisk are required (size != 0)** 2. second is optional (second_size == 0 -> no second)** 3. load each element (kernel, ramdisk, second) at** the specified physical address (kernel_addr, etc)** 4. prepare tags at tag_addr. kernel_args[] is** appended to the kernel commandline in the tags.** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr** 6. if second_size != 0: jump to second_addr** else: jump to kernel_addr*/ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。
Android_ROM制作移植及精简教程
Android_ROM制作,精简及移植教程本教程主要内容有:Android系统文件夹结构解析、应用软件说明、定制精简、ROM签名把包等内容。
刷机有风险,出问题自负。
其实这个教程一早就想写的,但由于时间及本人的懒惰,一直拖着。
今晚终于静下心来写好本文,本文有部份内容来自于网络。
速度与华丽,你喜欢那个。
是不是想要一个又够速度又华丽的ROM呢?我是一个追求新鲜的人,对于手机的ROM,我又追求稳定、精简、美观、省电。
现在Hero ROM有很多,最新的有第三方Android 2.1版本,但这些ROM的制作者都会跟据自已的个人喜欢会增加和增少相应的功能或是界面,但我们往往不喜欢这些ROM的某些小方面,所以随着而来面对的问题就是怎样把这个ROM修改成为一个自已真正需要的ROM呢?以往一直是依靠“大杀器”来解决,但觉得还是过于麻烦,所以寻求办法自己动手修改ROM。
于是有了本文。
废话少说,进入题。
一、Android系统文件夹结构一个完整的ROM根目录会有以下几个文件夹及文件:dataMETA-INsystemboot.img系统目录说明1. 应用程序安装目录1) 系统应用程序所在目录/system/app/*.apk2)用户安装应用程序所在目录/data/app/*.apk3) 注意:a)在模拟器中,每重启一次,/system/app/下的应用都会被还原,有时/data/app下也会被清除b)若在/system/app和/data/app下有重名的应用,不一定会启动哪一个,尤其是在adb install杀死正在运行的程序时,有时旧的就会被启动2.用户数据所在目录/data/data/应用包名/shared_prefs 配置文件/data/data/应用包名/databases/* 库文件所在目录3. SD卡对应目录/sdcard/而我们需要处理的只是两个文件夹里面的内容:data/app –该文本夹里的文件可以全删,也可以自由添加自已所需安装的应用软件,刷机安装后可以自由删除。
安卓rom移植教程2篇
安卓rom移植教程2篇第一篇:安卓ROM移植教程ROM移植是一项技术难度较高的工作,它可以让我们将适用于一个设备的安卓系统移植到另一个设备上。
移植成功后,我们就能够在新设备上使用原本不适用的安卓系统,从而拥有更强大的功能和更好的体验。
下面,我将为大家介绍安卓ROM移植的基本步骤。
第一步:了解源ROM和目标设备在进行ROM移植之前,我们首先需要了解源ROM和目标设备的情况。
源ROM指的是我们希望移植的安卓系统,而目标设备则是我们要将源ROM移植到的设备。
我们需要获取源ROM的系统镜像文件和相关的驱动程序,同时需要了解目标设备的硬件配置和系统要求。
第二步:提取源ROM的系统镜像文件提取源ROM的系统镜像文件是进行ROM移植的关键一步。
我们可以使用一些工具,如Android Kitchen或者MTK Droid Tools等,来提取源ROM的boot.img、recovery.img以及system.img等文件。
这些文件包含了安卓系统的核心部分,我们需要将它们复制到电脑上进行后续的处理。
第三步:编译目标设备的内核编译目标设备的内核是进行ROM移植的另一个重要步骤。
我们需要根据目标设备的硬件配置和系统要求,选择合适的内核源代码,并进行相关的编译和配置工作。
这个过程可能会比较复杂,需要有一定的编程和操作系统的基础知识。
第四步:修改源ROM的配置文件在进行ROM移植之前,我们还需要对源ROM的配置文件进行修改。
这些配置文件包括了源ROM的设备树文件、启动脚本和其他一些相关文件。
我们需要根据目标设备的硬件配置和系统要求,对这些配置文件进行适当的修改和调整。
第五步:替换目标设备的驱动程序移植ROM的一个重要环节是替换目标设备的驱动程序。
我们需要将源ROM中的驱动程序替换为适用于目标设备的驱动程序,以确保ROM 能够在目标设备上正确运行。
这也是一个比较复杂的步骤,需要根据目标设备的硬件配置和系统要求,进行相应的驱动程序替换和调试工作。
安卓系统移植经验之谈,教你三分钟移植
每当我闲下来时不发Rom时,就会整理一下思路,发发教程啥的,我觉得能带动机油们自己打造、改造Rom,共同提升,才是Romer的追求。
发Rom也好,教程也好,我的宗旨是不设回复可见,如果你觉得好,回复或者评分鼓励一下,我就很开心了。
不过这样做的一个遗憾就是,我的帖子通常回复率不够高,沉得快。
好了,闲话少说,上教程。
注:可能你会觉得文字教程比较干枯,不够形象生动,但是请精心看,我会尽量讲得具体、清晰。
首先,我并不算是移植高手,这个教程只是我在自己移植过程中的的一些收获体会,一些经验之谈。
如果你觉得有什么不对或值得改进的地方,欢迎和我交流,我们一起来完善这个教程。
因为移植所涉及的机型、配置相当多变和复杂,所以我无法讲具体细节,只能讲大致的原则。
可以结合我移植U8800+的JoyOS到U8860的例子作为参考进行理解。
我把这些原则抽象出来,命名为Rom移植5步法,具有一定的通用性。
Rom移植的方向有正向和逆向之分:正向的做法通常就是,找个目标机型的底包,然后把要移植的包的app和framework提取出来替换进去。
这样的优点是改动无需太大,非常快捷;缺点是经常因为一些bin下的程序或者库文件的差异而导致成功率不够高。
逆向的做法是,拿要移植的包作为底包,把目标机型的内核、wifi驱动、传感器库文件、配置文件等替换进去。
这样做要复杂一些,需要准确两个包的差异,知道应该改哪里;优点自然是不成则已,一旦移植成功能最大限度地发挥Rom性能,因为框架、程序与底层的契合度要比正向法好。
我这个教程以逆向法为例。
另外,Rom移植有风险,刷机测试需谨慎,如有本人操作不当导致出现任何问题,本人概不负责。
Rom移植5步法:1.Rom移植涉及的东西比较偏底层,所以在移植之前必须清楚目标机型的硬件配置,分区结构。
这里的配置不是说主频多少、内存多少,这两个参数基本上不会影响移植的进行。
对于移植,最关键的因素是主板平台,通常采用同一系列的cpu的不同机型的Rom移植的成功率要高很多。
任意安卓移植ROM教程,超详细ROM技术学习
任意安卓移植ROM教程,超详细ROM技术学习相信有过刷机经历的都知道安卓系统的构造,我们讲述一下安卓的几大组成:从内核基于linux开始,整个系统就运行在一个虚拟机上,这是安卓的一大特征!!那么我们移植的时候要修改哪一部分?这就是我们这个帖子的重点了。
在刷机时,我们大多使用zip格式的升级包进行刷机,那zip 格式的升级包是怎么样的一个组成呢?一个zip升级包的完整构造,其中我们要移植所需要修改的就是META-INF里的刷机脚本。
对于这个构造,有必要完整的解释一次。
META-INF这里面主要是签名文名和刷机时执行的脚本(updater-script),移植时,我们主要要更改的就是刷机的脚本。
system这里面就是android的系统部分app这里存放的是系统的app,每个app都有两个文件,一个*.apk,一个*.odex,我们在移植时,要将这个文件合并到对应的*.apk里面去,apk文件其实就是一个zip文件,可以用WinRAR或7zip打开的,当然,合并odex文件不是把它改名直接放到apk里去这么简单的,后面具体介绍一下。
还有,这个文件夹里面的程序,刷完以后是不能通过程序管理来卸载的。
bin这里面存放的是native程序,不好意思,一下子忘掉中文怎么说了。
简单来说,apk是JAVA 程序,而这个是C/C++的程序。
etc这里面存放的是系统默认的配置文件,GPS的配置也在这里J。
fonts这个是字体文件夹,一般很少改动,除非要做美化framework这里存放的是android框架,移植MIUI,很多改动在这个文件夹里,美化ROM的话,主要改framework-res.apk就可以了。
当然,MIUI本身就有主题机制了,不用这么麻烦去改。
这个文件夹里也会有对应的odex文件。
lib一些通过的类库,一般是由app/bin里面的程序调用的。
media媒体文件,要添加系统默认的铃声就在这里了。
如果是别的ROM的话,壁纸也会放在这里面。
Android详细移植过程
apt-get 设置好后,按照下面的步骤安装相关组件Required Packages (Ubuntu 8.04)$ sudo apt-get install python2.5$ sudo apt-get install sun-java6-jdk sun-java6-bin sun-java6-jreAdd/Edit /etc/bash.bashrcexport JA V A_HOME=/usr/lib/jvm/java-6-sun-1.6.0.07$ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev zlib1g-dev zip curl valgrind libncurses5-dev build-essential$ sudo apt-get install x-dev$ sudo apt-get install libx11-dev编译Android source code$ cd ~/mydroid$ export ANDROID_JAVA_HOME=$JAVA_HOME$ cd ~/mydroid$ make编译Android KernelBuilding zImageGo into kernel directory$ cd ~/mydroid/kernel$ make msm_defconfig ARCH=arm$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm- eabi-4.2.1/bin/arm-eabi-可以在 kernel/arch/arm/boot/目录下看到build好的zImage原文地址:/archiver/tid-2413.html由于论坛改版,很多有用的资源都不见了,所以这里把自己对cupcake下载和编译方法进行详细说明,以后还会陆续发完善的开发板移植说明、内核编译说明、一些模块级的分析等,希望对刚开始做android的朋友有所帮助,同时欢迎高手指正。
安卓rom简单移植
以前移植过华为C8812的,觉得移植内容差不多,所以决定试试,毕竟N881E也有一批用户,下面列出我的一些办法,看看对中兴机子是否可行我以前移植华为的办法如下移植百度的应用层和framework 框架层(system/app system/framework system/tts这三个文件夹我用的是百度云N880E的底包)移植lib,不删减添加东西,但是其中的modules使用官方包的,用BeyondCompare 3比较多出来的用百度云的包移植system/bin 和system/xbin 文件夹全部用官方的移植system/media 文件夹整个文件夹必须使用百度的移植system/usr 文件夹把百度的keychars 和keylayout 两个文件删除,替换为官方包中的这两个文件夹移植system/etc 文件夹必须将百度云的文件夹中firmware 文件夹删除,替换为官方包中的firmware文件夹修改build.prop必须使用官方包中官方的build.prop,但是必须在build.prop 任意位置加入如下几行(对比了N880E百度和N881E官方的build.prop,发现百度修改和添加了一下prop,移植时如果官方的build.prop有这个属性,替换,没有则增加即可):ro.baidu.build.hardware=N881Ero.baidu.build.hardware.version=1.0ro.baidu.build.software=yi_3.0ro.baidu.build.version.release=2.1ro.product.manufacturer=Baidupersist.sys.emmc=/mnt/sdcard2ro.config.notification_sound=Ding.mp3ro.config.ringtone=Echo.mp3ro.config.alarm_alert=alarm.mp3删除以下几个属性ro.operator.optr=ro.operator.spec=ro.operator.seg=移植boot.imgboot.img 启动镜像必须使用自己手机的。
GT8xx多芯片模组应用于Android平台驱动移植说明书V1.5
GT8xx 多芯片模组应用于Android 平台驱动移植说明书V1.5【程序总揽】本程序针对Android2.1系统,移植的硬件平台为华天正科技开发的Real6410(基于S3C6410)。
本驱动支持多指,通过编译宏开关能够支持三种运行方式;能够在系统支持的情况下在主控进入关屏状态时自动调整GT8XX 工作状态,达到省电的目的。
1.1 系统硬件资源使用 资源类型GOODIX 演示主控配置 作用外部中断(可选,建议使用)硬件IO :S3C64XX_GPL(10)接收GT8XX 的数据中断,通知系统运行相应的坐标处理; 在GT8XX 睡眠时用作唤醒管脚 系统中断号:119((外部中断18),触发类型可通过配置信息控制IO 口(Reset )(可选)154(S3C64XX_GPF(3)),配置为输出控制控制GT8XX 运行状态,硬件复位GT8XX (低有效) I2C 适配器(SCL 、SDA )I2C-0GT8XX 控制、数据传输注:如需要支持GT8XX 的睡眠功能,则INT 管脚和Reset 必选其一。
1.2 系统运行流程为了便于移植,程序中采用了中断、中断+不定时查询和轮询三种方式,程序根据编译宏自动选择方式。
以边沿触发中断方式为例,系统的主运行流程如下所示:1. 创建GT8XX 对应的i2c_client 对象,其中完成了该适配器的相关信息设置(name ,address 等);2.加载触摸屏驱动,注意该驱动必须在I2C 总线驱动已经加载的情况下才能进行,否则I2C 通信将出错。
程序中将其加载优先级设为最低; 3.创建驱动结构体,探测GT8XX 设备,并将其挂载到I2C 总线驱动上;测试I2C 通信,注册input 设备,申请IO 口和中断资源,完成GT8XX 初始化工作; 4. 开启触摸屏中断,等待数据接收; 5. 收到触摸屏数据中断,关中断; 6. 通过I2C 传输数据,分析手指信息,;7. 更新按键信息,上报手指坐标、按键等信息,开中断; 8.重复4-7之间的循环。
android驱动开发和移植详解
android驱动开发和移植详解本文出处:《Android 底层开发技术实战详解——内核、移植和驱动》我们开发的Android 驱动程序是基于Linux 内核的,本文首先介绍移植Android 系统的基本知识和基本原理,这也是为驱动开发打下坚实基础,知其然也知其所以然;最后我们将通过深入浅出的案例学习驱动开发过程。
1.1 驱动开发需要做的工作Android 作为当前最流行的手机操作系统之一,受到了广大开发人员和商家的青睐。
Android正在逐渐形成一个蓬勃发展的产业,带来了无限商机。
既然Android 这么火爆,我们程序员可以学习它的哪一方面的内容呢?本书的驱动开发又属于哪一领域呢?接下来将为读者奉上这两个问题的答案。
Android 是一个开放的系统,这个系统的体积非常庞大,开发人员无须掌握整个Android 体系中的开发知识,只需熟悉其中某一个部分即可收获自己的未来。
从具体功能上划分,Android 开发主要分为如下三个领域。
1. 移植开发移动电话系统移植开发的目的是构建硬件系统,并且移植Android 的软件系统,最终形成手机产品。
2. Android 应用程序开发应用程序开发的目的是开发出各种Android 应用程序,然后将这些应用程序投入Android 市场,进行交易。
Android 的应用程序开发是Android 开发的另一个方面。
从开发的角度来看,这种形式的开发可以基于某个硬件系统,在没有硬件系统的情况下也可以基于Linux 或者Windows 下的Android模拟器来开发。
这种类型的开发工作在Android 系统的上层。
事实上,在Android 软件系统中,第3 个层次(Java 框架)和第4 个层次(Java 应用)之间的接口也就是Android 的系统接口(系统API)。
这个层次是标准的接口,所有的Android 应用程序都是基于这个层次的接口开发出来的。
Android 系统的第4 个层次就是一组内置的Android应用程序。
Android-WIFI移植分析—曹颖
11
配置路径和权限
A)配置init.rc文件修改out/target/product/fs100/root/init.rc, 让wifi用户拥有相关 的权限, 在 #give system access to wpa_supplicant.conf for backup and restore后面增加:
3
SDIO WIFI部分
项目负责人:曹颖 项目目标:实现WIFI上网功能、并对WIFI休眠进行改善。 项目开发流程:
硬件分析:对Marvell8686 SDIO WIFI模块硬件工作特性了解和分析 工作原理分析:对Marvel8686 SDIO WIFI工作原理进行分析 Android WIFI框架分析:对Android WIFI系统框架分析 进行源码分析、编写、修改及编译 调试、并完善 2011-9-29至2011-10-7:硬件分析、了解驱动框架 2011-10-8至2011-10-16:Android SDIO WIFI移植及工作原理分析 2011-10-17至2011-10-23:Android WIFI框架分析 2011-10-24至2011-10-30:进行源码分析 2011-10-31至2011-11-5:准备答辩就业
7
配置内核支持SDIO WIF
make
menuconfig
[*] Networking support ---> [*] Wireless ---> --- Wireless <*> Improved wireless configuration API [*] cfg80211 regulatory debugging [*] nl80211 new netlink interface support -*- Common routines for IEEE802.11 drivers Device Drivers ---> [*] Network device support ---> Wireless LAN ---> <*> Marvell 8xxx Libertas WLAN driver support <M> Marvell Libertas 8385 and 8686 SDIO 802.11b/g cards
安卓Android ROM定制、移植教程。
CyanogenMOD移植教程转自秋叶随风Ivan;乐蛙论坛等。
第一章:环境的搭建一.系统选择和安装建议使用ubuntu LTS 10.04 X64新手朋友推荐Deepin Linux 基于ubuntu定制的,适合新手使用/download系统安装教程,以下方法通用于UBUNTU官方版本U盘安装:/index.php/Unetbootin光盘安装:/index.php/光盘安装搭建android编译环境:英文好的请猛击这里:WIKI:/index.php?title=Building_from_source1.安装JDK因为ANDROID大部分东西是java写的,所以首先我们需要安装JDK 打开终端按照如下命令输入或者直接复制粘贴:编译android 2.3 或者更新的版本请使用jdk 6$ sudo add-apt-repository "deb / lucid partner"$ sudo apt-get update$ sudo apt-get install sun-java6-jdk如果你需要编译的是2.2以下的版本请使用JDK 5,因为现在大家都是使用Gingerbread 以上的系统,这里就不介绍jdk5如何安装的了,如果有需要请度娘或者google2.安装各种依赖包64位环境:依然是终端中输入$ sudo apt-get install git-core gnupg flex bison gperfbuild-essential \zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \libgl1-mesa-dev g++-multilib mingw32 tofrodospython-markdown \libxml2-utils xsltproc如果这些依赖包依然不能解决你的问题,请参考如下:/wiki/HTC_Hero_(CDMA):_Com pile_CyanogenMod_(Linux)/source/initializing.html3.下载代码打开终端:在个人目录下面使用的是android 代替我的工程,用cm7代替CM7的源码用CM9代替CM9的源码如果要更新下载CM7的源码请输入:mkdir -p ~/binmkdir -p ~/android/cm7个人目录下的bin目录是为了保存repo 等更新脚本的依然再终端输入:curlhttps:///dl/googlesource/git-repo/repo > ~/bin/repochmod a+x ~/bin/repo可以把~/bin/repo 加入到环境变量里面终端输入sudo gedit /etc/environment在PATH=“”加入PA TH="/home/ivanhuang/bin:" ivanhuang为个人目录的名称,也就是计算机登录名更改结束之后终端输入source /etc/environment就能直接在终端中使用repo 命令了。
安卓系统移植之按键移植
LOCAL_Pinclude $(CLEAR_VARS)
file :
= $(TARGET_OUT_KEYLAYOUT)/gpio-keys.kl
ALL_PREBUILT += $(file)
这一部分主要是移植
(1)Android使用标准的linux输入事件设备(/dev/input目录下)和驱动,按键定义在内核include/linux/input.h文件中,
按键定义形式如下:
#define KEY_ESC1
#define KEY_12
#define KEY_23
(2)内核中(我的平台是arch/arm/mach-mmp/merlin.c文件)中按键的定义如下形式:
.desc="O_BTN button",
.type=EV_KEY,
/* .wakeup= */
.debounce_interval=10,/* 10 msec jitter elimination */
},
[2] = {
.code=KEY_F4,
.gpio=MFP_PIN_GPIO1,
.active_low=1,/* 0 for down 0, up 1; 1 for down 1, up 0 */
(2)android按键设备由Window Manager负责,Window Manager从按键驱动读取内核按键码,然后将内核按键码转换成android按键码,转换完成
后Window Manager会将内核按键码和android按键码一起发给应用程序来使用,这一点一定要注意。
Android系统开发小知识-在android产品开发中添加新的编译模块
Android深度探索(卷1)HAL与驱动开发(总)
Android深度探索(卷1)HAL与驱动开发(总) 第⼀章Android系统移植与驱动开发概述主要讲了Android系统架构,Android系统移植的主要⼯作,查看Linux内核版本,Linux内核版本号的定义规则,如何学习Linux驱动开发,Linux设备驱动以及Linux驱动的典型例⼦:LED。
⾸先Android是⼀个⾮常优秀的嵌⼊式操作系统,经过了⼏年的快速发展,已经形成了Linux内核,c/c++代码库,Android SDK API,应⽤程序四层系统架构。
然后介绍了⼀下Android系统移植的主要⼯作,主要分为应⽤移植和系统移植两部分。
当然,移植的⼯作说多不多,说少也不少,如果要移植的Android系统提=提供了系统源代码,那就好办多了,直接根据移植的⽬标平台修改驱动代码就可以了。
并且知道了Linux2.6是⽬前使⽤最⼴泛的版本,Android就使⽤了该版本。
那么,怎样学习Linux驱动开发呢,由于Linux的内核版本更新较快,每⼀次内核的变化就意味着Linux驱动的变化,所以学习Linux驱动开发需要⼀个真正的操作系统来搭建Linux驱动的开发环境,并且在该系统下测试Linux驱动。
还有GUN C 也是学习Linux驱动的⼀个必须掌握的技术。
了解了上⾯这些,我认识到学习Linux驱动编程⼀定要了解Linux驱动只与Linux内核有关,与⽤户使⽤的Linux系统⽆关。
唯⼀可以判断Linux内核是否相同的⽅法就是Linux内核版本号。
第⼆章搭建Android开发环境主要介绍了如何搭建Android底层开发的环境,主要包括Android应⽤程序开发环境,Android NDK开发环境和交叉编译环境的搭建。
Android底层开发需要很多⼯具,例如Android SDK,Android NDK等等,搭建Android应⽤程序开发环境都是在Linux下编写和测试的。
由于Android NDK不能作为Android应⽤程序来运⾏,因此,使⽤Android NDK开发程序之前必须先安装Android SDK。
安卓ROM移植教程(史上最精最全)
目录目录 (1)第三章制作第三方移植乐蛙ROM(高通篇) (3)一、选择合适的基础包 (3)1.1选择合适的第三方ROM包 (3)1.2选择合适的乐蛙OS刷机包 (3)二、移植之前的准备工作 (3)1.保证刷机脚本的通用性 (4)2.学习使用BeyondCompare (4)三、移植过程中所需要的操作 (4)1.移植乐蛙的应用层和framework框架层 (4)1.1应用层(system/app)移植 (5)1.2framework框架层(system/framework)移植 (7)2.移植lib层 (8)3.移植system/bin文件夹 (8)4.移植system/xbin文件夹 (9)5.移植system/media文件夹 (9)6.修改build.prop (9)四、移植完成后的工作 (9)1.压缩打包为zip刷机包 (9)2.使用Recovery输入ROM包进行测试 (10)3.测试过后出现Bug的反馈机制 (10)(高通篇)第三章制作第三方移植乐蛙ROMROM(高通篇)在本文中我们将会对市面上存在的高通、德州仪器、三星、tegra四种平台的机器的移植进行介绍,今天先给大家带来高通篇。
选择合适的基础包一、选择合适的基础包一、1.1选择合适的第三方ROM包市面上高通平台的手机众多,使用高通机器的手机也有着众多的ROM,这是我们需要选择一个合适的ROM作为基础包(这这里简称Base)。
首先,本篇中我们讲的是第三方ROM的移植,不包括官方ROM和官方ROM美化版,在第一章中我们也有所介绍,关于官方ROM的移植,我们后续文章中将会有所介绍。
在这里我们推荐选用CM的ROM作为base包,选取条件如下:1)首先要找到自己机型的CM的ROM;2)所选择的ROM要尽量功能完善;3)如果为自己机型开发的ROM并不多,则尽量选取使用同一厂商同一平台的其它机器的ROM,例如U8510就可以选用C8650的ROM。
基于ARM11Android操作系统移植论文
基于ARM11的Android的操作系统的移植[摘要] android是一个专为移动设备设计的软件综合平台,凭借良好的可移植性、应用程序的硬件平台无关性及其开放性,迅速成为主流的手机平台之一。
本文重点研究了基于linux平台的开源操作系统android移植到arm11的过程。
[关键词] android 移植 arm111、引言目前,随着移动通信技术的发展,移动终端正在向多媒体化和网络化的方向发展,手机操作系统已经成为嵌入式系统发展的一个重要方向。
google与开放手机联盟联合开发的一个专为移动设备设计的软件开放平台—android。
其凭借很强的开放性、可移植性和丰富的应用程序极大的满足了用户的需要以及技术的发展。
本课题以arm11系列的s3c6400开发板为系统移植目标平台,重点分析了android的linux内核的移植过程。
2、android操作系统简介android 是google于2007 年11月宣布的基于linux平台开源手机操作系统名称,号称是首个为移动终端打造的真正开放和完整的移动软件。
google 重新设计java虚拟机和系统,使得android 的java应用更接近于底层系统效率更高;另外使用虚拟机技术使得 android的应用在被监控的情况下运行,安全性更高。
android 是一个对第三方软件完全开放的平台。
其平台采用了整合的策略思想,包括底层linux操作系统、中间层的中间件和上层的java应用程序。
操作系统的体系结构从上到下分为5个部分,分别是:应用程序、应用程序框架、程序库、android运行环境、linux核心层。
linux内核层用来提供系统的底层服务,位于硬件和其它软件层之间,采用 yaffs2文件系统。
android运行库包含一组核心库和dalvik虚拟机,android提供丰富的数据库支持且大部分为开源代码,如采用嵌入式数据库sqlite。
应用框架层为android 开发人员提供了访问框架应用程序接口的全部权限,采用结构化设计简化了组件之间的重用。
android系统移植到emmc
android系统移植到emmc历时一个月,终于成功把android系统移植到emmc上启动。
开发板:s5pv210系统:android 2.34目的:使用emmc代替 nand flash烧写命令:fastboot sdfuse分区命令: fdiskvfat格式命令:fatformatExt3格式命令:ext3format--------------------------------------------------------------------------------1:android系统移植emmc记录(1)--制作SD卡启动模式2:android系统移植emmc记录(2)--u-boot烧写emmc文件方式------------------------------------------------------------------------------------------------------------------------如果android生成的文件是ext3格式(如何生成,请网上了解,我自己的只是手动生成),则应该可以启动系统,基本移植成功。
然而,这时三星的基本移植方式,对于我手上的源码,却并不合适,测试无法启动系统,停止在 mount根文件系统后,无法找到/init 文件。
经分析,基本属于kernel没有获取到正确的ramdisk分区地址,至此开始分析u-boot源码了。
--------------------------------------------------------------------------------------------------------------------3:android系统移植emmc记录(3)--sd/mmc初始化分析4:android系统移植emmc记录(4)--fdisk命令分析5:android系统移植emmc记录(5)--fastboot命令分析6: android系统移植emmc记录(6)--sd卡烧写文件分析--------------------------------------------------------------------------------------------------------------------u-boot基本可初始化emmc和sd了,并能够通过sd来烧写emmc。
Android系统开发编译及系统移植
Android系统开发编译环境配置主机系统:Ubuntu9.04(1)安装如下软件包sudo apt-get install git-coresudo apt-get install gnupgsudo apt-get install sun-java5-jdksudo apt-get install flexsudo apt-get install bisonsudo apt-get install gperfsudo apt-get install libsdl-devsudo apt-get install libesd0-devsudo apt-get install build-essentialsudo apt-get install zipsudo apt-get install curlsudo apt-get install libncurses5-devsudo apt-get install zlib1g-devandroid编译对java的需求只支持jdk5.0低版本,jdk5.0 update 12版本和java 6不支持。
(2)下载repo工具curl /repo >/bin/repochmod a+x /bin/repo(3)创建源代码下载目录:mkdir /work/android-froyo-r2(4)用repo工具初始化一个版本(以android2.2r2为例)cd /work/android-froyo-r2repo init -u git:///platform/manifest.git -b froyo初始化过程中会显示相关的版本的TAG信息,同时会提示你输入用户名和邮箱地址,以上面的方式初始化的是android2.2 froyo的最新版本,android2.2本身也会有很多个版本,这可以从TAG信息中看出来,当前froyo的所有版本如下:* [new tag] android-2.2.1_r1 -> android-2.2.1_r1* [new tag] android-2.2_r1 -> android-2.2_r1* [new tag] android-2.2_r1.1 -> android-2.2_r1.1* [new tag] android-2.2_r1.2 -> android-2.2_r1.2* [new tag] android-2.2_r1.3 -> android-2.2_r1.3* [new tag] android-cts-2.2_r1 -> android-cts-2.2_r1* [new tag] android-cts-2.2_r2 -> android-cts-2.2_r2* [new tag] android-cts-2.2_r3 -> android-cts-2.2_r3这样每次下载的都是最新的版本,当然我们也可以根据TAG信息下载某一特定的版本如下:repo init -u git:///platform/manifest.git -b android-cts-2.2_r3(5)下载代码repo syncfroyo版本的代码大小超过2G,漫长的下载过程。
Android 移植之 iperf
1 .移植准备1 ,源代码地址:/projects/iperf/files/iperf/2.0.4%20source/iperf-2.0.4.tar.gz/download ,下载iperf-2.0.4.tar.gz ,并放到Adroid_root/external ;2 ,解压到Adroid_root/external/ iperf-2.0.4.tar.gz;tar –zxvf iperf-2.0.4.tar.gz2.创建Android.mkcat Android.mkLOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES := /compat/Thread.c /compat/error.c /compat/delay.cpp /compat/gettimeofday.c /compat/inet_ntop.c /compat/inet_pton.c /compat/signal.c /compat/snprintf.c /compat/string.cLOCAL_SRC_FILES += /src/Client.cpp /src/Extractor.c /src/Launch.cpp /src/List.cpp /src/Listener.cpp /src/Locale.c /src/PerfSocket.cpp /src/ReportCSV.c /src/ReportDefault.c /src/Reporter.c /src/Server.cpp /src/Settings.cpp /src/SocketAddr.c /src/main.cpp /src/sockets.c /src/stdio.c /src/tcp_window_size.c /src/gnu_getopt.c /src/gnu_getopt_long.c /src/service.cLOCAL_C_INCLUDES += /$(LOCAL_PATH) /$(LOCAL_PATH)/includeLOCAL_CFLAGS += -O2LOCAL_CFLAGS += -DHAVE_CONFIG_HLOCAL_LDLIBS += -lpthreadLOCAL_SHARED_LIBRARIES := libc libm libcutils libnetutils LOCAL_MODULE := iperf#LOCAL_FORCE_STATIC_EXECUTABLE := trueLOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)#LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)#LOCAL_MODULE_TAGS := eng userinclude $(BUILD_EXECUTABLE)3.先生成需要的头文件./configure –host=arm4.代码修改将external/testtools/iperf/src/Listener.cpp:382 行改成:mreq.ipv6mr_ifindex = 0;把compact/signal.c 里面的#include "util.h"改成#include “../include/util.h”把src/sockets.c 里面的#include "util.h"改成#include “../include/util.h”5.编译$cd Adroid_root$source build/envsetup.sh$mmm external/iperf-2.0.46.目标文件在Android_root/build/out/target/product/generic/symbols/system/bin/ 目录下就可以看到你刚才编译生成的文件了;这个目录里的文件是带符号信息的,方便调试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Copybit功能实现(2D加速)
• 主要包含块搬移及位图拉伸或旋转的功能,实现
copybit_device_t结构即可
• 基本调用层次关系,对于OpenGl调用补充下: • 可选宏定义LIBAGL_USE_GRALLOC_COPYBIT SglDrawArrays->drawPrimitivesTriangleFan->copybit 调用到平台Copybit函数,使用2D对surfaceFlinger 实现块搬移
Kernel移植要点
• 1、尽可能将硬件平台相关的代码从旧版移植到新版本 • 2、针对硬件平台相关的代码,以旧版本为主,毕竟旧版 的是可以正常运行的版本, • 3、非硬件平台相关代码尽量使用新版本 • 4、若遇到不知如何处理问题,先跳过,记录下该文件及 修改点,这部分需要多参考部份原码进行移植 • 5、对于配置.config文件,需要根据相关功能进行修改及配 置,可以从模拟器上拿到config.gz文件解开即可 • 6、编译及测式,采用nfs挂载根文件系统,一般遇到kernel panic错误时,打开kernel debug,printk加打印,或者 disable此功能进行调试
加速逻辑加载流程(egl.cpp)
• 全局变量gEGLImpl 定义IMPL_HARDWARE= 0, IMPL_SOFTWARE • 利用egl_init_drivers_locked填充gEGLImp数组变量, 即加载不同的动态(硬件和软件加速驱动) libGLES_android.so 软件库 【libagl】 libGLES_HWxxxxx.so 硬件库 OpenGl的函数赋值于 hooks结构 • 利用配置文件/system/lib/egl/egl.cfg 进行选择 • loader.open -> load_driver 进行函数指针赋值
关于图形部分移植
• 1、如果处理器只有2D硬件加速而没有3D硬件加 速,则可以利用opengl中的libagl, 实现封装在libagl里的copybit,即libagl + copybit • 2、如果处理器2D/3D硬件加速均有,那么可以丢 开 copybit,去实现openGL ES 2D/3D API 的加速功能 • 3、对于hisi来说,有专门的2D和3D硬件加速,但 由于3D对于数据(surfcae或者纹理)搬移速度不理 想(40ms-7ms差异),所以实现glDrawArrays实现 copybit功能实现
我的移植过程(二)
• 6、修改android源代码system/core/rootdir目录下的init.rc文 件,android默认yaffs2文件系统,所以制作system.img也是 yaffs2及linux kernel配置成支持yaffs2文件系统,首先将 android文件系统修改成可读写 mount rootfs rootfs / rw remount
硬件需求
• RAM: 512MB • FLASH:256MB • CPU: ARM平台指令集要求 ARM9 Family以上,ARMv5以上指令集, mips平台指令集要求 MIPS32 revision 2 - Little-Endian, O32
软件需求
• Linux2.6以上版本,目前froyo(v2.2)对应于 linux2.6.32 - linux2.6.35版本,最好是使用 android官方网可以下载到的代码【目前 linux2.6.23官方网下不了,最低也是 linux2.6.25】 • Android源码
接口层调用关系
HAL接口定义原则
• 1、同类设备有多个时只定义一个设备名称,调用 open函数全部打开【对于设备打开需要很多资源 的并且很少使用的可以后续分配内存,以便内存 浪费】 • 2、接口定义以效率为先,发挥平台最大性能 • 3、模块划分明确,方便调试及集成 • 4、类型的结构充分利用C Struct的数据排列特性: 基本结构体放置在最前面,本地私有放置在后面, 满足了抽象的需要,以struct hw_module_t common;及struct hw_device_t common; 置前
linux kernel
由于android系统对于linux kernel的限制,首先是要选定合 适的kernel版本,然后剩下的工作就是整个一个全新的kernel 代码,系统移植有三份kernel代码需要集成 • 1、机顶盒厂商提供的linux源码,包含有针对平台的驱动代 码及修改 • 2、官方网站下载的linux源码,与厂商的版本可能有所不同 • 3、增加了android linux driver的源码,这部分已经从linux kernel中分离开来,需要单独移植 所以首要的问题是将三份统一到一起,目标是支持 厂商驱动,支持android驱动以及更新到一定 linux内核版本(android driver +sdk driver + linux kernel ) 这部分工作需要深入到linux kernel driver层代码,一定的 技术功底+细心
HAL后续解读
• 生成的所有模块都以*.so动态库,各个动态 库之间定义了一个hal_common.so用于各个 动态间全局变量调用,对上层接口透明
• 下面直接讲解HAL层代码头文件
Linux公社
• Linux公社()于2006年9月25 日注册并开通网站,Linux现在已经成为一 种广受关注和支持的一种操作系统,IDC是 互联网数据中心,LinuxIDC就是关于Linux的 数据中心。 • 提供包括Ubuntu,Fedora, SUSE技术,以及最新IT资讯等Linux专业类网 站。
总体启动框架图示
HAL接口实现
• Android系统的移植就是kernel+HAL层接口实现 【不过这是最理想的做法了,实现上简单的这么 做难道很大的】 • Hardware Abtraction Layer,即硬件抽象层,目的 就是使用自已平台的硬件适配层为系统加速,发 挥硬件平台的最大性能,未定义则使用软实现。 • HAL层调用方式 JNI->通用硬件模块->硬件模块->内核驱动接口,即 android frameworks中JNI调用 /hardware/libhardware/hardware.c中定义的 hw_get_module函数来获取硬件模块,然后调用硬 件模块中的方法,硬件模块中的方法直接调用内 核接口完成相关功能我的移植 Nhomakorabea程(一)
• 1、移植boot-loader和linux2.6内核到目标平台上,让linux 内核可以启动起来,基本的驱动运行正常 • 2、修改内核配置文件,打开Android必须的驱动,比如 binder,logger,ashemem,pmem等 • 3、为了提高启动速度,采用ramdisk,将android文件系统 的部分内容压缩到内核中 • 4、根据分区表修改内核启动参数,例如mem=352M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 rw启动的第一个应用程序是/init • 5、确保控制台的设置和硬件保持一致,如:硬件上串口 用的是UART1,则内核启动参数中设置有console=ttyAMA0 与启动参数中保持一致
主要模块介绍
• hardware.h 通用硬件模块头文件 • gralloc.h 主要定义graphics device,至少需要双缓 冲framebuffer,硬件没有则使用ashemem或pmem 实现 • copybit.h 2D加速函数,如blit/stretch • overlay.h 加速视频数据输出,叠加于主显示区之 上,机顶盒上一般使用视频层输出 • tuner.h 锁频功能定义 • demux.h 解复用功能定义 • media.h 媒体播放功能定义,包含av dec/output, 并且虚拟定义了video window概念 • OpenGl 3D接口实现,移植平台前期可以先行使用 软件libagl.so
Android系统移植
Android从Linux系统启动有4个步骤; 1、 init进程启动 (system\core\init\中的main函数) init进程,它是一个由内核启动的用户级进程。内核自行启 动(已经被载入内存,开始运行,并已初始化所有的设备 驱动程序和数据结构等)之后,就通过启动一个用户级程 序init的方式,完成引导进程,此后android将接管所有工 作,这里涉及到两个脚本文件:init.rc 及 init.xxx.rc【arch】 2、 Native服务启动 Servicemanager和zygote进程就奠定了Android的基础。 Zygote这个进程起来才会建立起真正的Android运行空间, 主要是Zytote创建JAVA 虚拟机,装载classes等 【受精卵,典型的C/S结构,请求生产,fork子进程,ok,生 了】
LayerBuffer OpenGl
Copybit 硬件抽象层 硬件支持,hisi即为TDE层
启动步骤
3、 System Server服务循环框架 Android服务启动不停的通过Zygote fork新的进程, 并建立了一大堆服务,并add Service到service Manager,Android的所有服务循环框架都是建立 SystemServer@(SystemServer.java)上 4、 Home启动 启动完所有的Android服务后,然后启动第一个 home应用程序,即第一个启动HomeActivity 应用 程序
Android系统移植讲解
茁壮网络股份有限公司 陈华兵 2011-5-16
Linux公社
• Linux公社()于2006年9月25 日注册并开通网站,Linux现在已经成为一 种广受关注和支持的一种操作系统,IDC是 互联网数据中心,LinuxIDC就是关于Linux的 数据中心。 • 提供包括Ubuntu,Fedora, SUSE技术,以及最新IT资讯等Linux专业类网 站。