Android系统移植讲解

合集下载

Android5.1-7.1系统(framework)定制、修改、移植、总结-上篇

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解包和打包

安卓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制作,精简及移植教程本教程主要内容有: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移植教程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技术学习

任意安卓移植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详细移植过程

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简单移植

安卓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 启动镜像必须使用自己手机的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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专业类网 站。
相关文档
最新文档