Android系统移植技术详解
- 格式:pdf
- 大小:324.29 KB
- 文档页数:73
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应用程序。
安卓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移植的成功率要高很多。
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的朋友有所帮助,同时欢迎高手指正。
Android操作系统分析与移植Android操作系统是目前应用最为广泛的智能手机操作系统之一,其强大的功能以及开放的生态系统备受用户青睐。
对于开发人员来说,了解Android操作系统的内部工作原理以及进行移植是分外有用的技能。
本文将对Android操作系统进行分析,并说明如何进行移植。
Android操作系统接受Linux内核作为底层,并在其之上构建了一套完整的软件框架,包括运行时库、应用程序框架和应用程序接口(API)。
其中,运行时库负责管理应用的启动、调度和销毁,应用程序框架提供了开发Android应用程序所需的各种工具和组件,而API则是开发人员使用的编程接口。
在分析Android操作系统时,我们起首需要了解其软件架构。
Android接受了四层软件架构,分别为应用层、应用程序框架层、系统服务层和Linux内核层。
应用层包括各种应用程序,如联系人、短信、浏览器等。
应用程序框架层提供了开发这些应用程序所需的各种工具和组件,如窗口管理器、资源管理器、通知管理器等。
系统服务层提供了各种系统级服务,如电源管理、毗连管理、位置管理等。
Linux内核层则负责底层硬件的驱动和管理。
在详尽操作系统移植方面,我们需要依据目标设备的硬件平台进行适配和调整。
起首,我们需要选择合适的Linux内核版本,并对其进行配置和编译,以支持目标设备的硬件。
然后,我们需要将Android操作系统的源代码下载到开发机器上,并进行编译和构建。
在编译过程中,我们需要配置编译选项,并选择需要的组件和功能进行编译。
编译完成后,我们将生成的系统镜像烧录到目标设备上,并进行测试和调试。
移植Android操作系统还需要进行设备驱动的适配。
在Android中,设备驱动是通过HAL(硬件抽象层)来实现的。
HAL是Android的核心组件之一,其作用是屏蔽硬件平台的差异,使Android操作系统能够适配不同的硬件平台。
因此,我们需要依据目标设备的硬件特性编写相应的设备驱动,将其集成到HAL中,以实现对硬件的访问和控制。
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移植概述d id潘友华版权❝华清远见嵌入式培训中心版权所有;❝未经华清远见明确许可,不能为任何目的以任何形式复制或传播此文档的任何部分;❝本文档包含的信息如有更改,恕不另行通知;❝保留所有权利。
2内容提纲❝1、android简介移植方法概述❝2、移植方法概述❝3、android分区❝4、android源码结构❝5、android编译系统❝6、厂商定制❝7、初始化脚本android简介❝Android是一种基于Linux内核的开源、免费的操作系统,由Google公司和开放手机联盟主持开发。
主流应用是智能终端,如智能手机、平板电脑、机顶盒、智能家居、穿戴设备。
目前也开始在一些工业控制领域的得到应用。
❝Android操作系统最初由Andy Rubin开发,主要支持手机。
2005年8月由Google 收购注资。
2007年11月,Google与84家硬件制造商、软件开发商及电信营运商收购注资月家硬件制造商软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。
随后Google以Apache开源许可证的授权方式,发布了Android的源代码。
2013A d id岁生日全世界采用这❝年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。
❝Android在正式发行之前,有两个内部测试版本,分别是:阿童木(AndroidBeta),发条机器人(Android 1.0)。
后来由于涉及到版权问题,谷A d id)发条机器人(A d id10)后来由于涉及到版权问题谷歌将其命名规则变更为用甜点作为它们系统版本的代号的命名方法。
从Android 1.5发布的时候,代表每个版本代表的甜点的尺寸越变越大,分别是:纸杯蛋糕(Android 1.5),甜甜圈(Android 1.6),松饼(Android 2.0/2.1),A d id15)甜甜圈(A d id16)松饼(A d id20/21)冻酸奶(Android 2.2),姜饼(Android 2.3),蜂巢(Android 3.0),冰激凌三明治(Android 4.0),果冻豆(Jelly Bean,Android4.1和Android 4.2)。
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,漫长的下载过程。
(6)编译代码cd /work/android-froyo-r2makeUbuntu下使用S D mba服务实现局域网内文件共享Ubuntu下安装S D mba服务器将linux电脑上的内容共享,同一局域网内的另外一台Windows PC即可访问其共享内容,从而实现Windows电脑向访问本地文件一样访问Linux文件系统的内容。
(1)安装S D maba服务器sudo apt-get install samba(2)安装samba图形化配置软件sudo apt-get install system-config-samba(3)创建一个Simba专用用户从“系统”—“系统管理”—“用户和组”,来创建。
如图,先点击“解锁”,然后“添加新用户”然后输入新用户名字(如Simba)和密码(如111111),然后在“高级”里面,选择“主组”为sambashare后点击"确定"即可一句话来概括,就是创建一个主组为sambashare的用户(4)配置samba共享从“系统”—“系统管理—”samba“,运行配置界面然后”首选项“—”服务器设置“。
点击:安全性,在最后的”来宾帐号“里面,选择我们新建立的那个用户simba后点击确定(5)修改samba配置文件打开/etc/samba/smb.conf,修改valid users = XXXX为valid users = simba(6)重启samba服务sudo /etc/init.d/samba restart(7)添加共享文件从“系统”—“系统管理—”samba“,运行配置界面点击"添加"来添加共享文件夹,点击"浏览"来选择需要共享的文件夹,选择"可擦写"和"显示",点击"访问"可以设置访问权限,最好设置成"允许所有用户访问"Ubuntu下tftp服务器的创建实验平台:Ubuntu9.04(1)安装tftp服务sudo apt-get install tftp tftpd openbsd-inetd(2)在根目录下创建文件夹 tftpboot文件夹并修改权限cd /sudo mkdir tftpbootsudo chmod 777 tftpboot(3)修改/etc/inetd.conf文件如下:tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot(4)开启tftp服务sudo /etc/init.d/openbsd-inetd reloadsudo in.tftpd -l /tftpboot(5)重启电脑,然后将测试文件放入/tftpboot目录下即可开始测试,出现问题可能一般都是权限问题/tftpboot目录下的文件访问权限改成0777创建一个新的Android产品项目从google网站上下载的android源代码编译时默认是编译google设定的产品,如果要开发自己的产品,则需要重新定义一个产品项目,过程如下:首先我们定义产品的规格,举例如下:公司名称 ardent产品名称 MTP主板名称 merlin然后安装下面的步骤新建产品项目:(1)在源代码目录下创建一个用户目录mkdir vendor(2)在用户目录下创建一个公司目录mkdir vendor/merlin(3)在公司目录下创建一个products目录mkdir vendor/merlin/products(4)在上面创建的products下创建一个产品makefile文件MTP.mk,内容如下:PRODUCT_PACKAGES := \AlarmClock \Email \Fallback \Launcher2 \Music \Camera \Settings \LatinIME \NotePad \SoundRecorder \Bluetooth \CertInstaller \DeskClock$(call inherit-product, $(SRC_TARGET_DIR)/product/core.mk)## OverridesPRODUCT_MANUFACTURER := ardentPRODUCT_BRAND := ardentPRODUCT_NAME := MTPPRODUCT_MODEL := MultiMedia Touch PhonePRODUCT_DEVICE := merlinPRODUCT_LOCALES := zh_CN产品makefile文件的编写有一套规则,详细情况见此文后面的补充内容。
(5)在vendor/merlin/products目录下创建一个AndroidProducts.mk文件,定义Android产品配置文件的路径,具体如下:PRODUCT_MAKEFILES := \$(LOCAL_DIR)/MTP.mk(6)在公司目录下创建一个主板目录mkdir vendor/ardent/merlin(7)在主板目录下新建一个主板配置文件BoardConfig.mk,内容如下:TARGET_NO_BOOTLOADER := trueTARGET_NO_KERNEL := trueTARGET_CPU_ABI := armeabiBOARD_USES_GENERIC_AUDIO := trueUSE_CAMERA_STUB := true(8)如果你希望修改系统属性,则可以在主板目录下新建一个system.prop文件,该文件中可以修改系统属性,举例如下:# system.prop for# This overrides settings in the products/generic/system.prop file## rild.libpath=/system/lib/libreference-ril.so# rild.libargs=-d /dev/ttyS0(9)在主板目录下建议一个Android的主板配置文件AndroidBoard.mk,此文件是编译系统接口文件,内容如下:# make file for new hardware from#LOCAL_PATH := $(call my-dir)## this is here to use the pre-built kernelifeq ($(TARGET_PREBUILT_KERNEL),)TARGET_PREBUILT_KERNEL := $(LOCAL_PATH)/kernelendiffile := $(INSTALLED_KERNEL_TARGET)ALL_PREBUILT += $(file)$(file): $(TARGET_PREBUILT_KERNEL) | $(ACP)$(transform-prebuilt-to-target)## no boot loader, so we don't need any of that stuff..#LOCAL_PATH := vendor/ardent/merlininclude $(CLEAR_V ARS)## include more board specific stuff here? Such as Audio parameters.#(10)编译新的项目. build/envsetup.shmake PRODUCT-MTP-user补充内容:(1)上面的新建的几个文件的编写可以参考build/target/board/generic目录下的AndroidBoard.mk,BoardConfig.mk和system.prop(2)产品makefile的编写规则,变量定义解释如下:PRODUCT_NAME 终端用户可见的产品名称,对应到“Settings“中的“About the phone”信息PRODUCT_MODEL End-user-visible name for the end productPRODUCT_LOCALES 1个以空格分隔开的两个字母的语言码加上2字节的国家码的列表,影响到"Settings"中的语言,时间,日期和货币格式设置,举例:en_GB de_DE es_ES fr_CAPRODUCT_PACKAGES 需要安装的APK应用程序列表PRODUCT_DEVICE 工作设计名称,即主板名称PRODUCT_MANUFACTURER 生产厂家PRODUCT_BRAND 软件设计针对的客户品牌PRODUCT_PROPERTY_OVERRIDES 以"key=value"为格式的属性列表PRODUCT_COPY_FILES 文件复制列表,格式为“原文件路径:目的文件路径”,编译过程中会按照此规则复制文件PRODUCT_OTA_PUBLIC_KEYS 产品的OTA公共密匙列表PRODUCT_POLICY 声明此产品使用的政策PRODUCT_PACKAGE_OVERLAYS 指示是否使用默认资源或添加任何产品特定的资源,例如:vendor/acme/overlayPRODUCT_CONTRIBUTORS_FILE HTML文件中包含项目的贡献者PRODUCT_TAGS 以空格分隔开的指定产品关键词列表本文来自CSDN博客,转载请标明出处:ttp:///jiajie961/archive/2010/11/07/5993126.aspx制作ubifs文件系统1,安装相关的软件包apt-get install liblzo2-dev2,获取相关的工具mkfs.ubifs和ubinize这两个工具是制作ubifs文件系统的时候用到,它们是mtd-utils工具包中的内容,mtd-utils工具包你可以从下面的网站下载和编译出来:官方网站:/index.html资源下载网站:/3,创建一个create-ubifs.sh脚本,主要是调用mkfs.ubifs和ubinize工具和相关参数来制作ubifs文件系统,内容如下:#!/bin/bash########################################################### Script to generate ubifs filesystem image. ################################################################ ubinize configuration fileconfig_file=rootfs_ubinize.cfg##### Function to check result of the commandcheck_result() {if [ $? -ne 0 ]thenecho "FAILED"elseecho "SUCCESSFUL"fi}###### Function to check whether an application existscheck_program() {for cmd in "$@"dowhich ${cmd} > /dev/null 2>&1if [ $? -ne 0 ]thenechoecho "Cannot find command \"${cmd}\""echoexit 1fidone}if [ $# -ne 5 ]thenechoecho 'Usage: create-ubifs.sh [page_size_in_bytes] [pages_per_block] [partition_size_in_bytes] [blocks_per_device] [path_to_rootfs]'echoexitfipage_size_in_bytes=$1echo "Page size [$page_size_in_bytes]bytes." pages_per_block=$2echo "Pages per block [$pages_per_block]"partition_size_in_bytes=$3echo "File-system partition size [$partition_size_in_bytes]bytes."blocks_per_device=$4echo "Blocks per device [$blocks_per_device]"path_to_rootfs=$5# wear_level_reserved_blocks is 1% of total blcoks per devicewear_level_reserved_blocks=`expr $blocks_per_device / 100`echo "Reserved blocks for wear level [$wear_level_reserved_blocks]"#logical_erase_block_size is physical erase block size minus 2 pages for UBIlogical_pages_per_block=`expr $pages_per_block - 2`logical_erase_block_size=`expr $page_size_in_bytes \* $logical_pages_per_block`echo "Logical erase block size [$logical_erase_block_size]bytes."#Block size = page_size * pages_per_blockblock_size=`expr $page_size_in_bytes \* $pages_per_block`echo "Block size [$block_size]bytes."#physical blocks on a partition = partition size / block sizepartition_physical_blocks=`expr $partition_size_in_bytes / $block_size`echo "Physical blocks in a partition [$partition_physical_blocks]"#Logical blocks on a partition = physical blocks on a partitiion - reserved for wear levelpatition_logical_blocks=`expr $partition_physical_blocks - $wear_level_reserved_blocks`echo "Logical blocks in a partition [$patition_logical_blocks]"#File-system volume = Logical blocks in a partition * Logical erase block sizefs_vol_size=`expr $patition_logical_blocks \* $logical_erase_block_size`echo "File-system volume [$fs_vol_size]bytes."echoecho "Generating configuration file..."echo "[rootfs-volume]" > $config_fileecho "mode=ubi" >> $config_fileecho "image=rootfs_ubifs.img" >> $config_fileecho "vol_id=0" >> $config_fileecho "vol_size=$fs_vol_size" >> $config_fileecho "vol_type=dynamic" >> $config_fileecho "vol_name=system" >> $config_fileecho# Note: Check necessary program for installation#echo -n "Checking necessary program for installation......"#check_program mkfs.ubifs ubinize#echo "Done"#Generate ubifs imageecho -n "Generating ubifs..."./mkfs.ubifs -x lzo -m $page_size_in_bytes -e $logical_erase_block_size -c $patition_logical_blocks -o rootfs_ubifs.img -d $path_to_rootfscheck_resultecho -n "Generating ubi image out of the ubifs..."./ubinize -o ubi.img -m $page_size_in_bytes -p $block_size -s $page_size_in_bytes $config_file -vcheck_resultrm -f rootfs_ubifs.imgrm -f $config_file(4)将mkfs.ubifs和ubinize以及create-ubifs.sh放置在同一目录下,然后调用create-ubifs.sh即可创建ubifs 文件系统,create-ubifs.sh用法如下:create-ubifs.sh page_size_in_bytes(页大小) pages_per_block(每个扇区的页数量) partition_size_in_bytes(分区大小) blocks_per_device(扇区数量) path_to_rootfs(文件系统路径)举例如下:./create-ubifs.sh 2048 64 83886080 4096 ./rootfs上面命令的意思是调用create-ubifs.sh将当前目录下的rootfs文件夹的内容制作成ubifs文件系统,nand flash 的页大小为2k,每个扇区有64页,总共有4096个扇区,要制作的文件系统的大小为83886080字节。