定制android平台系统开发_android定制系统开发 - CSDN
  • 现在 ROM 有很多,最新的有第三方Android 4.03版本,但这些ROM的制作者都会跟据自已的个人喜欢会增加和增少相应的功能或是界面,但我们往往不喜欢这些ROM的某些小方面,所以随着而来面对的问题就是怎样把这个ROM修改...

    速度与华丽,你喜欢那个。是不是想要一个又够速度又华丽的ROM呢?我是一个追求新鲜的人,对于手机的ROM,我又追求稳定、精简、美观、省电。现在 ROM 有很多,最新的有第三方Android 4.03版本,但这些ROM的制作者都会跟据自已的个人喜欢会增加和增少相应的功能或是界面,但我们往往不喜欢这些ROM的某些小方面,所以随着而来面对的问题就是怎样把这个ROM修改成为一个自已真正需要的ROM呢?以往一直是依靠“大杀器”来解决,但觉得还是过于麻烦,所以寻求办法自己动手修改ROM。于是有了本文。废话少说,进入正题。

          

        本教程主要内容有:Android系统文件夹结构解析、应用软件说明、定制精简、ROM签名打包等内容。刷机有风险,出问题自负。本文有部份内容来自于网络。


    一、Android系统文件夹结构
    一个完整的ROM根目录会有以下几个文件夹及文件:
    data
    META-IN
    system
    boot.img

    系统目录说明

    1. 应用程序安装目录
    1) 系统应用程序所在目录
    /system/app/*.apk
    2)用户安装应用程序所在目录
    /data/app/*.apk
    3) 注意:
    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 –该文本夹里的文件可以全删,也可以自由添加自已所需安装的应用软件,刷机安装后可以自由删除。
    system/app –在这个文件夹下的程序为系统默认的组件,可以看到都是以APK格式结尾的文件,但有些自制的ROM里面还有和APK文件名对应的odex文件。我们主要是针对该文件夹里的文件进行精简,如果有odex文件的,删除APK文件名时同时也删除与其对应的odex文件。


    虽然一般定制时只是对以上两个文件夹里的文件做相应的增减,但我们还是一起来了解system相应目录相应文件的用途吧。(rom版本不同里面的APK也会不一样)

    \\system\\app

    \\system\\app\\AlarmClock.apk 闹钟
    \\system\\app\\Browser.apk 浏览器
    \\system\\app\\Bugreport.apk Bug报告
    \\system\\app\\Calculator.apk 计算器
    \\system\\app\\Calendar.apk 日历
    \\system\\app\\CalendarProvider.apk 日历提供
    \\system\\app\\Camera.apk 照相机
    \\system\\app\\com.amazon.mp3.apk 亚马逊音乐
    \\system\\app\\Contacts.apk 联系人
    \\system\\app\\DownloadProvider.apk 下载提供
    \\system\\app\\DrmProvider.apk DRM数字版权提供
    \\system\\app\\Email.apk 电子邮件客户端
    \\system\\app\\FieldTest.apk 测试程序
    \\system\\app\\GDataFeedsProvider.apk GoogleData提供
    \\system\\app\\Gmail.apk Gmail电子邮件
    \\system\\app\\GmailProvider.apk Gmail提供
    \\system\\app\\GoogleApps.apk 谷歌程序包
    \\system\\app\\GoogleSearch.apk 搜索工具
    \\system\\app\\gtalkservice.apk GTalk服务
    \\system\\app\\HTMLViewer.apk HTML查看器
    \\system\\app\\HtcTwitter.apk 集成Twitter客户端PEEP
    \\system\\app\\IM.apk 即使通讯组件包含MSN、yahoo通
    \\system\\app\\ImCredentialProvider.apk
    \\system\\app\\ImProvider.apk
    \\system\\app\\Launcher.apk 启动加载器
    \\system\\app\\HtcNaviPanel.apk 导航软件
    \\system\\app\\Maps.apk 电子地图
    \\system\\app\\MediaProvider.apk 多媒体播放提供
    \\system\\app\\Mms.apk 短信、彩信
    \\system\\app\\Music.apk 音乐播放器
    \\system\\app\\MyFaves.apk T-Mobile MyFaves程序
    \\system\\app\\NewsReader.apk 新闻阅读器
    \\system\\app\\PackageInstaller.apk apk安装程序
    \\system\\app\\Phone.apk 电话拨号器
    \\system\\app\\Settings.apk 系统设置
    \\system\\app\\SettingsProvider.apk 设置提供
    \\system\\app\\SetupWizard.apk 设置向导
    \\system\\app\\SoundRecorder.apk 录音工具
    \\system\\app\\Street.apk 街景地图
    \\system\\app\\Sync.apk 同步程序
    \\system\\app\\Talk.apk 语音程序
    \\system\\app\\TelephonyProvider.apk 电话提供
    \\system\\app\\Updater.apk 更新程序
    \\system\\app\\VpnServices.apk VPN服务
    \\system\\app\\Vending.apk 制造商信息
    \\system\\app\\VoiceDialer.apk 语音拨号器
    \\system\\app\\VoiceSearch.apk 语音搜索
    \\system\\app\\YouTube.apk Youtube视频

    \\system\\bin

    这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件,Android手机网就主要文件做下简单的分析介绍:
    \\system\\bin\\akmd
    \\system\\bin\\am
    \\system\\bin\\app_process 系统进程
    \\system\\bin\\dalvikvm Dalvik虚拟机宿主
    \\system\\bin\\dbus-daemon 系统BUS总线监控
    \\system\\bin\\debuggerd 调试器
    \\system\\bin\\debug_tool 调试工具
    \\system\\bin\\dexopt DEX选项
    \\system\\bin\\dhcpcd DHCP服务器
    \\system\\bin\\dumpstate 状态抓取器
    \\system\\bin\\dumpsys 系统抓取器
    \\system\\bin\\dvz
    \\system\\bin\\fillup
    \\system\\bin\\flash_image 闪存映像
    \\system\\bin\\hciattach
    \\system\\bin\\hcid HCID内核
    \\system\\bin\\hostapd
    \\system\\bin\\hostapd_cli
    \\system\\bin\\htclogkernel
    \\system\\bin\\input
    \\system\\bin\\installd
    \\system\\bin\\itr
    \\system\\bin\\linker
    \\system\\bin\\logcat Logcat日志打印
    \\system\\bin\\logwrapper
    \\system\\bin\\mediaserver
    \\system\\bin\\monkey
    \\system\\bin\\mountd 存储挂载器
    \\system\\bin\\netcfg 网络设置
    \\system\\bin\\ping Ping程序
    \\system\\bin\\playmp3 MP3播放器
    \\system\\bin\\pm 包管理器
    \\system\\bin\\qemud QEMU虚拟机
    \\system\\bin\\radiooptions 无线选项
    \\system\\bin\\rild RIL组件
    \\system\\bin\\sdptool
    \\system\\bin\\sdutil
    \\system\\bin\\service
    \\system\\bin\\servicemanager 服务管理器
    \\system\\bin\\sh
    \\system\\bin\\ssltest SSL测试
    \\system\\bin\\surfaceflinger 触摸感应驱动
    \\system\\bin\\svc 服务
    \\system\\bin\\system_server
    \\system\\bin\\telnetd Telnet组件
    \\system\\bin\\toolbox
    \\system\\bin\\wlan_loader
    \\system\\bin\\wpa_cli
    \\system\\bin\\wpa_supplicant

    \\system\\etc

    从文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。
    \\system\\etc\\apns-conf.xml APN接入点配置文件
    \\system\\etc\\AudioFilter.csv 音频过滤器配置文件
    \\system\\etc\\AudioPara4.csv
    \\system\\etc\\bookmarks.xml 书签数据库
    \\system\\etc\\dbus.conf 总线监视配置文件
    \\system\\etc\\dhcpcd
    \\system\\etc\\event-log-tags
    \\system\\etc\\favorites.xml 收藏夹
    \\system\\etc\\firmware 固件信息
    \\system\\etc\\gps.conf GPS设置文件
    \\system\\etc\\hcid.conf内核HCID配置文件
    \\system\\etc\\hosts 网络DNS缓存
    \\system\\etc\\init.goldfish.sh
    \\system\\etc\\location 定位相关
    \\system\\etc\\mountd.conf 存储挂载配置文件
    \\system\\etc\\NOTICE.html 提示网页
    \\system\\etc\\permissions.xml 权限许可
    \\system\\etc\\pvplayer.conf
    \\system\\etc\\security
    \\system\\etc\\wifi WLAN相关组件
    \\system\\etc\\dhcpcd\\dhcpcd-hooks
    \\system\\etc\\dhcpcd\\dhcpcd-run-hooks
    \\system\\etc\\dhcpcd\\dhcpcd.conf
    \\system\\etc\\dhcpcd\\dhcpcd-hooks\\01-test
    \\system\\etc\\dhcpcd\\dhcpcd-hooks\\20-dns.conf
    \\system\\etc\\dhcpcd\\dhcpcd-hooks\\95-configured
    \\system\\etc\\firmware\\brf6300.bin
    \\system\\etc\\location\\gps
    \\system\\etc\\location\\gps\\location 定位相关
    \\system\\etc\\location\\gps\\nmea GPS数据解析
    \\system\\etc\\location\\gps\\properties
    \\system\\etc\\security\\cacerts.bks
    \\system\\etc\\security\\otacerts.zip OTA下载验证
    \\system\\etc\\wifi\\Fw1251r1c.bin
    \\system\\etc\\wifi\\tiwlan.ini
    \\system\\etc\\wifi\\wpa_supplicant.conf WPA验证组件

    \\system\\fonts

    字体文件夹,除了标准字体和粗体、斜体外可以看到文件体积最大的可能是中文字库,或一些unicode字库,从T- Mobile G1上可以清楚的看到显示简体中文正常,其中DroidSansFallback.ttf文件大小
    \\system\\fonts\\DroidSans-Bold.ttf
    \\system\\fonts\\DroidSans.ttf
    \\system\\fonts\\DroidSansFallback.ttf
    \\system\\fonts\\DroidSansMono.ttf
    \\system\\fonts\\DroidSerif-Bold.ttf
    \\system\\fonts\\DroidSerif-BoldItalic.ttf
    \\system\\fonts\\DroidSerif-Italic.ttf
    \\system\\fonts\\DroidSerif-Regular.ttf

    \\system\\framework

    framework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架。
    \\system\\framework\\am.jar
    \\system\\framework\\am.odex
    \\system\\framework\\android.awt.jar AWT库
    \\system\\framework\\android.awt.odex
    \\system\\framework\\android.policy.jar
    \\system\\framework\\android.policy.odex
    \\system\\framework\\android.test.runner.jar
    \\system\\framework\\android.test.runner.odex
    \\system\\framework\\com.google.android.gtalkservice.jar GTalk服务
    \\system\\framework\\com.google.android.gtalkservice.odex
    \\system\\framework\\com.google.android.maps.jar 电子地图库
    \\system\\framework\\com.google.android.maps.odex
    \\system\\framework\\core.jar 核心库,启动桌面时首先加载这个
    \\system\\framework\\core.odex
    \\system\\framework\\ext.jar
    \\system\\framework\\ext.odex
    \\system\\framework\\framework-res.apk
    \\system\\framework\\framework-tests.jar
    \\system\\framework\\framework-tests.odex
    \\system\\framework\\framework.jar
    \\system\\framework\\framework.odex
    \\system\\framework\\input.jar 输入库
    \\system\\framework\\input.odex
    \\system\\framework\\itr.jar
    \\system\\framework\\itr.odex
    \\system\\framework\\monkey.jar
    \\system\\framework\\monkey.odex
    \\system\\framework\\pm.jar 包管理库
    \\system\\framework\\pm.odex
    \\system\\framework\\services.jar
    \\system\\framework\\services.odex
    \\system\\framework\\ssltest.jar
    \\system\\framework\\ssltest.odex
    \\system\\framework\\svc.jar 系统服务
    \\system\\framework\\svc.odex

    \\system\\lib

    lib目录中存放的主要是系统底层库,如平台运行时库。
    \\system\\lib\\libaes.so
    \\system\\lib\\libagl.so
    \\system\\lib\\libandroid_runtime.so Android运行时库
    \\system\\lib\\libandroid_servers.so 系统服务组件
    \\system\\lib\\libaudio.so 音频处理
    \\system\\lib\\libaudioeq.so EQ均衡器
    \\system\\lib\\libaudioflinger.so 音频过滤器
    \\system\\lib\\libbluetooth.so 蓝牙组件
    \\system\\lib\\libc.so
    \\system\\lib\\libcamera.so 超相机组件
    \\system\\lib\\libcameraservice.so
    \\system\\lib\\libcorecg.so
    \\system\\lib\\libcrypto.so 加密组件
    \\system\\lib\\libctest.so
    \\system\\lib\\libcutils.so
    \\system\\lib\\libdbus.so
    \\system\\lib\\libdl.so
    \\system\\lib\\libdrm1.so DRM解析库
    \\system\\lib\\libdrm1_jni.so
    \\system\\lib\\libdvm.so
    \\system\\lib\\libexif.so
    \\system\\lib\\libexpat.so
    \\system\\lib\\libFFTEm.so
    \\system\\lib\\libGLES_CM.so
    \\system\\lib\\libgps.so
    \\system\\lib\\libhardware.so
    \\system\\lib\\libhgl.so
    \\system\\lib\\libhtc_ril.so
    \\system\\lib\\libicudata.so
    \\system\\lib\\libicui18n.so
    \\system\\lib\\libicuuc.so
    \\system\\lib\\liblog.so
    \\system\\lib\\libm.so
    \\system\\lib\\libmedia.so
    \\system\\lib\\libmediaplayerservice.so
    \\system\\lib\\libmedia_jni.so
    \\system\\lib\\libnativehelper.so
    \\system\\lib\\libnetutils.so
    \\system\\lib\\libOmxCore.so
    \\system\\lib\\libOmxH264Dec.so
    \\system\\lib\\libpixelflinger.so
    \\system\\lib\\libpvasf.so
    \\system\\lib\\libpvasfreg.so
    \\system\\lib\\libpvauthor.so
    \\system\\lib\\libpvcommon.so
    \\system\\lib\\libpvdownload.so
    \\system\\lib\\libpvdownloadreg.so
    \\system\\lib\\libpvmp4.so
    \\system\\lib\\libpvmp4reg.so
    \\system\\lib\\libpvnet_support.so
    \\system\\lib\\libpvplayer.so
    \\system\\lib\\libpvrtsp.so
    \\system\\lib\\libpvrtspreg.so
    \\system\\lib\\libqcamera.so
    \\system\\lib\\libreference-ril.so
    \\system\\lib\\libril.so
    \\system\\lib\\librpc.so
    \\system\\lib\\libsgl.so
    \\system\\lib\\libsonivox.so
    \\system\\lib\\libsoundpool.so
    \\system\\lib\\libsqlite.so
    \\system\\lib\\libssl.so
    \\system\\lib\\libstdc++.so
    \\system\\lib\\libsurfaceflinger.so
    \\system\\lib\\libsystem_server.so
    \\system\\lib\\libthread_db.so
    \\system\\lib\\libUAPI_jni.so
    \\system\\lib\\libui.so
    \\system\\lib\\libutils.so
    \\system\\lib\\libvorbisidec.so
    \\system\\lib\\libwbxml.so
    \\system\\lib\\libwbxml_jni.so
    \\system\\lib\\libwebcore.so
    \\system\\lib\\libwpa_client.so
    \\system\\lib\\libxml2wbxml.so
    \\system\\lib\\libz.so
    \\system\\lib\\modules
    \\system\\lib\\modules\\wlan.ko

    \\system\\media

    铃声音乐文件夹,除了常规的铃声外还有一些系统提示事件音
    \\system\\media\\audio
    \\system\\media\\audio\\alarms 闹铃音
    \\system\\media\\audio\\notifications 提示音
    \\system\\media\\audio\\ringtones 铃声
    \\system\\media\\audio\\ui 界面操作事件音
    \\system\\media\\audio\\alarms\\Alarm_Beep_01.ogg
    \\system\\media\\audio\\alarms\\Alarm_Beep_02.ogg
    \\system\\media\\audio\\alarms\\Alarm_Beep_03.ogg
    \\system\\media\\audio\\alarms\\Alarm_Buzzer.ogg
    \\system\\media\\audio\\alarms\\Alarm_Classic.ogg
    \\system\\media\\audio\\alarms\\Alarm_Rooster_02.ogg
    \\system\\media\\audio\\notifications\\Beat_Box_Android.ogg
    \\system\\media\\audio\\notifications\\CaffeineSnake.ogg
    \\system\\media\\audio\\notifications\\DearDeer.ogg
    \\system\\media\\audio\\notifications\\DontPanic.ogg
    \\system\\media\\audio\\notifications\\F1_MissedCall.ogg
    \\system\\media\\audio\\notifications\\F1_New_MMS.ogg
    \\system\\media\\audio\\notifications\\F1_New_SMS.ogg
    \\system\\media\\audio\\notifications\\Heaven.ogg
    \\system\\media\\audio\\notifications\\Highwire.ogg
    \\system\\media\\audio\\notifications\\KzurbSonar.ogg
    \\system\\media\\audio\\notifications\\OnTheHunt.ogg
    \\system\\media\\audio\\notifications\\TaDa.ogg
    \\system\\media\\audio\\notifications\\Tinkerbell.ogg
    \\system\\media\\audio\\notifications\\Voila.ogg
    \\system\\media\\audio\\ringtones\\BeatPlucker.ogg
    \\system\\media\\audio\\ringtones\\BentleyDubs.ogg
    \\system\\media\\audio\\ringtones\\BirdLoop.ogg
    \\system\\media\\audio\\ringtones\\CaribbeanIce.ogg
    \\system\\media\\audio\\ringtones\\CrazyDream.ogg
    \\system\\media\\audio\\ringtones\\CurveBall.ogg
    \\system\\media\\audio\\ringtones\\DreamTheme.ogg
    \\system\\media\\audio\\ringtones\\EtherShake.ogg
    \\system\\media\\audio\\ringtones\\FriendlyGhost.ogg
    \\system\\media\\audio\\ringtones\\GameOverGuitar.ogg
    \\system\\media\\audio\\ringtones\\Growl.ogg
    \\system\\media\\audio\\ringtones\\InsertCoin.ogg
    \\system\\media\\audio\\ringtones\\LoopyLounge.ogg
    \\system\\media\\audio\\ringtones\\LoveFlute.ogg
    \\system\\media\\audio\\ringtones\\MidEvilJaunt.ogg
    \\system\\media\\audio\\ringtones\\MildlyAlarming.ogg
    \\system\\media\\audio\\ringtones\\NewPlayer.ogg
    \\system\\media\\audio\\ringtones\\Noises1.ogg
    \\system\\media\\audio\\ringtones\\Noises2.ogg
    \\system\\media\\audio\\ringtones\\Noises3.ogg
    \\system\\media\\audio\\ringtones\\OrganDub.ogg
    \\system\\media\\audio\\ringtones\\Ring_Classic_02.ogg
    \\system\\media\\audio\\ringtones\\Ring_Digital_02.ogg
    \\system\\media\\audio\\ringtones\\Ring_Synth_02.ogg
    \\system\\media\\audio\\ringtones\\Ring_Synth_04.ogg
    \\system\\media\\audio\\ringtones\\RomancingTheTone.ogg
    \\system\\media\\audio\\ringtones\\SitarVsSitar.ogg
    \\system\\media\\audio\\ringtones\\SpringyJalopy.ogg
    \\system\\media\\audio\\ringtones\\T-Jingle.ogg
    \\system\\media\\audio\\ringtones\\Terminated.ogg
    \\system\\media\\audio\\ringtones\\TwirlAway.ogg
    \\system\\media\\audio\\ringtones\\VeryAlarmed.ogg
    \\system\\media\\audio\\ringtones\\World.ogg
    \\system\\media\\audio\\ui\\Effect_Tick.ogg

    \\system\\sounds

    默认的音乐测试文件,仅有一个test.mid文件,用于播放测试的文件。
    \\system\\sounds\\test.mid

    \\system\\usr

    用户文件夹,包含共享、键盘布局、时间区域文件等。
    \\system\\usr\\keychars
    \\system\\usr\\keylayout
    \\system\\usr\\share
    \\system\\usr\\srec
    \\system\\usr\\keychars\\qwerty.kcm.bin
    \\system\\usr\\keychars\\qwerty2.kcm.bin
    \\system\\usr\\keychars\\trout-keypad-qwertz.kcm.bin
    \\system\\usr\\keychars\\trout-keypad-v2.kcm.bin
    \\system\\usr\\keychars\\trout-keypad-v3.kcm.bin
    \\system\\usr\\keychars\\trout-keypad.kcm.bin
    \\system\\usr\\keylayout\\h2w_headset.kl
    \\system\\usr\\keylayout\\qwerty.kl
    \\system\\usr\\keylayout\\trout-keypad-qwertz.kl
    \\system\\usr\\keylayout\\trout-keypad-v2.kl
    \\system\\usr\\keylayout\\trout-keypad-v3.kl
    \\system\\usr\\keylayout\\trout-keypad.kl
    \\system\\usr\\share\\bsk
    \\system\\usr\\share\\zoneinfo
    \\system\\usr\\share\\bsk\\V_FD_speed_101.bsk
    \\system\\usr\\share\\bsk\\V_FD_std_101.bsk
    \\system\\usr\\share\\zoneinfo\\zoneinfo.dat
    \\system\\usr\\share\\zoneinfo\\zoneinfo.idx
    \\system\\usr\\srec\\config
    \\system\\usr\\srec\\config\\en.us
    \\system\\usr\\srec\\config\\en.us\\baseline.par
    \\system\\usr\\srec\\config\\en.us\\baseline11k.par
    \\system\\usr\\srec\\config\\en.us\\baseline8k.par
    \\system\\usr\\srec\\config\\en.us\\dictionary
    \\system\\usr\\srec\\config\\en.us\\g2p
    \\system\\usr\\srec\\config\\en.us\\grammars
    \\system\\usr\\srec\\config\\en.us\\models
    \\system\\usr\\srec\\config\\en.us\\dictionary\\basic.ok
    \\system\\usr\\srec\\config\\en.us\\dictionary\\cmu6plus.ok.zip
    \\system\\usr\\srec\\config\\en.us\\dictionary\\enroll.ok
    \\system\\usr\\srec\\config\\en.us\\g2p\\en-US-ttp.data
    \\system\\usr\\srec\\config\\en.us\\grammars\\VoiceDialer.g2g
    \\system\\usr\\srec\\config\\en.us\\models\\generic.swiarb
    \\system\\usr\\srec\\config\\en.us\\models\\generic11.lda
    \\system\\usr\\srec\\config\\en.us\\models\\generic11_f.swimdl
    \\system\\usr\\srec\\config\\en.us\\models\\generic11_m.swimdl
    \\system\\usr\\srec\\config\\en.us\\models\\generic8.lda
    \\system\\usr\\srec\\config\\en.us\\models\\generic8_f.swimdl
    \\system\\usr\\srec\\config\\en.us\\models\\generic8_m.swimdl


    MIUI系统可精简的GOOGLE服务

    /system/app/Gmail.apk
    /system/app/GoogleCalendarSyncAdapter.apk
    /system/app/GooglePartnerSetup.apk
    /system/app/Talk.apk
    /system/app/GoogleBackupTransport.apk
    /system/app/GoogleContactsSyncAdapter.apk
    /system/app/GoogleServicesFramework.apk
    /system/app/MarketUpdater.apk
    /system/app/Vending.apk

    最好不要删除GoogleServicesFramework.apk,网络定位的NetworkLocation.apk需要它,除非你把NetworkLocation.apk一起删除。
    删除之后再OTA不会受影响,如果安装完整包,需要重新删除这些文件。


    OK,了解Android系统文件夹结构和相应文件的作用后,我们进行下一步真正定制工作。


    二、定制简单流程:


    1、下载相应的ROM
    2、下载签名工具,并且解压。我这里解压成生的文件夹名为:“APKMake”。
    工具下载:签名打包.zip
    3、把ROM内的所有文件用WinZip或是WinRAR解压到某一文件夹,为教程容易明白,我将这文件夹在这里起名为“NewsROM”,你自已喜欢怎样起名都无所谓。
    4、进入NewsROM文件夹,再进入data\app目录,看这里是否有你所需的程序,不需要的请删除。你还可以添加你需要的默认安装软件。如:搜狗输入法,只需要把SogouIme.apk文件直接拖放到压缩包\data\app目录内即可。
    5、进入NewsROM文件夹,再进入system\app删除你不想要的组件、或是添加你需要的组件。由于有一些组件与其它组件是有依赖的,所以删除时请注意。但也不要怕,如果你删除的组件不对,刷机时最多是无法进入系统,你用完整ROM重新刷一次既可。一般不会变成砖的。
    6、删除、添加软件完毕,然后把 ROM 文件夹(NewsROM)拖动到APKMake/APKMake.bat 即可(重新打包、自动签名)。在APKMake目录里打包签名完成后自动会生成NewsROM.zip(刚才文件夹起名不同,这里生成文件名也不同),这个就是我们已精简的ROM了。


    三、刷ROM

    请如果 Recovery 已经准备好。请按严格安装以下步骤操作刷入 ROM:

    1. 把 ROM 文件复制到 SD 卡,重命名为update.zip。
    2. 系统更新选择重启
    Recovery或关机,然后按住电源键+音量向上启动手机,进入 Recovery 模式。

    3. 清除所有用户数据
    4. 在 Recovery 中选择将update.zip刷入系统一。
    4. 重新启动到系统一即可。


    四、定制注意事项


    1、细心、细心、细心
    2、为安全起见,建议只对data/app和system/app这两个文件夹内的文件做删除、添加。
    3、不知或是不太清楚要删除的文件是干啥的,那请保留不要删除。
    4、本文中的Android系统文件夹结构可能比较旧,如果碰到不知该文件是干什么的,建议搜索一下找答案。


    按照本教程来定制ROM,如果在定制过程自已失误删除相应的软件,那造成的后果最多也是无法进入系统,重新刷一个完整  的ROM一般解决问题。还是那句话:刷机有风险,出问题自负。

    展开全文
  • 第四章、Android编译系统定制Android平台系统 4.1Android编译系统Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同目录下,对于这个大的一个工程,...

    第四章、Android编译系统与定制Android平台系统

     

    4.1Android编译系统

    Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同目录下,对于这个大的一个工程,Android通过自己的编译系统完成编译过程。

    4.1.1 Android编译系统介绍

    Android和Linux一样,他们的编译系统都是通过Makefile工具来组织编译源码的。Makefile工具用来解释和执行Makefile文件,在Makefile文件里定义好工程源码的编译规则,通过make命令即可以完成对整个工程的自动编译。因此分析makefile文件是理解编译系统的关键。

    在Android中,下面几个主要的makefile文件构成了Android编译系统。

    图x-x Android编译系统组成

     

    ①   Makefile:编译系统的入口Makefile文件,它只有一行代码,包含build/core/main.mk

    ②   build/core/main.mk:主要Makefile,定义了Android编译系统的主线

    ③   build/core/config.mk:根据用户输入的编译选项导出配置变量,影响编译目标

    ④   build/core/envsetup.mk:定义大量全局变量,用户编译配置

    ⑤   build/core/product_config.mk:根据用户选择的目标产品,定义编译结果输出目录

    ⑥   device/*/$(TARGET_DEVICE)/BoardConfig.mk:根据用户选择的目标产品找到对应的设备TARGET_DEVICE,加载设备的板级配置

    ⑦   build/core/definitions.mk:定义编译过程中用到的大量变量和宏,是编译系统的函数库

    ⑧   MODULES_DIR/Android.mk :每个模块的规则定义文件,它出现在每个要编译的目录下,如图x-x所示,我们可以自己向Android系统中添加自己的模块,来达到定制系统的目的。


    图x-x 模块中的Android.mk文件

    ⑨   build/core/Makefile:Android编译目标规则定义文件,最终编译结果在该文件中定义,如system.img、ramdisk.img、boot.img、userdata.img等

    4.1.2 Android.mk文件

    在Android源码中,大量的源码按照功能通过目录来分类,同一功能的代码通常被编译成一个目标文件,目标文件不仅仅包含可执行C/C++应用程序,还包含动态库、静态库、Java类库、Android应用程序等,在Android编译系统中,每个被编译的目标文件被称为一个模块(module),在每个模块的源码目录中必须创建一个Android.mk文件作为编译规则,这些Android.mk文件在编译时被编译系统中的findleaves.py脚本包含进去。

    @build/core/main.mk

    489 subdir_makefiles := \

    490    $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git$(subdirs) Android.mk)                              

    491

    492 include $(subdir_makefiles)

    注:findleaves.py由Python语言编译的脚本,Python是一种执行效率比较高的面向对象的脚本,上述脚本意思是返回subdirs目录下的Android.mk文件,但是会跳过out、.reop、.git目录。

    通常编译一个模块时编译器需要知道以下内容:

    Ø 编译什么文件?(指定源码目录和源码文件)

    Ø 编译器需要哪些编译参数?

    Ø 编译时需要哪些库或头文件?

    Ø 如何编译?(编译成动态库、静态库、二进制程序、Android应用还是Java库?)

    Ø 编译目标

    Android.mk的语法不同于Makefile,Android.mk语法更简洁,用户只需在Android.mk中定义出一些编译变量,Android的编译系统会根据Android.mk文件中变量的值进行编译。

    比如Zygote进程app_process模块中的Android.mk如下面代码所示:

    @ frameworks/base/cmds/app_process/Android.mk

      1LOCAL_PATH:= $(call my-dir)              #指定源码目录

      2include $(CLEAR_VARS)                     #包含清除编译变量的mk文件,防止影响本次编译

      3

      4LOCAL_SRC_FILES:= \                      #指定被编译源码

      5     app_main.cpp

      6

      7LOCAL_SHARED_LIBRARIES := \               #指定编译Zygote时用到的其它动态库

      8     libcutils \

      9     libutils \

     10     libbinder \

     11     libandroid_runtime

     12

     13LOCAL_MODULE:= app_process                #指定被编译模块的名字

     14

     15include $(BUILD_EXECUTABLE)                  #指定编译方式,编译成可执行程序

    再比如Camera应用程序中的Android.mk:

    @ packages/apps/Camera/Android.mk

      1LOCAL_PATH:= $(call my-dir)                        #指定源码目录

      2include $(CLEAR_VARS)                              #包含清除编译变量的mk文件,防止影响本次编译

      3

      4LOCAL_MODULE_TAGS := optional                      #指定应用程序标签

      5

      6LOCAL_SRC_FILES := $(call all-java-files-under, src)      #指定被编译源码

      7

      8LOCAL_PACKAGE_NAME := Camera                   #指定Android应用程序名

      9LOCAL_SDK_VERSION := current                        #指定该应用程序依赖的SDK版本

     10

     11LOCAL_PROGUARD_FLAG_FILES := proguard.flags    #指定混淆编译配置文件

     12

     13include $(BUILD_PACKAGE)                        #指定模块编译方式,这儿编译成Android应用程序

     14

     15 # Usethe following include to make our test apk.

     16include $(call all-makefiles-under,$(LOCAL_PATH))        # 包含当前目录下子目录中的Android.mk文件,向下编译

    通过上面两个例子可以看出来,Android.mk文件结构很简单,每个模块的Android.mk文件必须完成以下操作:

    Ø 指定当前模块的目录

    通过调用$(call my-dir)命令包(一些Makefile的集合),来获得当前模块目录。

    Ø 清除所有的LOCAL_XX变量

    通过include命令包含clear_vars.mk文件来清除所有的LOCAL_XX变量,防止影响本次编译结果,clear_vars.mk文件由变量CLEAR_VARS来定义

    Ø 指定源码文件

    通过LOCAL_SRC_FILES变量指定源码文件,对于C/C++文件,要将它们全部列出来赋值给LOCAL_SRC_FILES(见上面程序代码),对于Java源码,可以通过调用命令包$(callall-java-files-under, src)来实现,它会在src目录下查找所有的Java文件,将其罗列出来。

    Ø 指定编译细节

    在编译时可能需要修改编译器参数、需要链接其它的库、需要其它路径下的头文件等编译细节。

    Ø 指定目标模块名

    如果是C/C++库、可执行程序或Java类库,通过LOCAL_MODULE指定最终编译出来的模块名,如果是Android应用程序,通过LOCAL_PACKAGE_NAME变量来指定。

    Ø 指定目标模块类型

    模块最终都要进行编译,通过include 命令包含一些预定义好的变量来指定模块最终的类型,这些变量分别对应一个makefile文件,包含了模块类型的编译过程。主要的预定义编译变量如下:

    编译变量

    功能

    BUILD_SHARED_LIBRARY

    将模块编译成共享库

    BUILD_STATIC_LIBRARY

    将模块编译成静态库

    BUILD_EXECUTABLE

    将模块编译成可执行文件

    BUILD_JAVA_LIBRARY

    将模块编译成Java类库

    BUILD_PACKAGE

    将模块编译成Android应用程序包

    注:上述编译变量的定义在build/core/definitions.mk中。

    在Android.mk中,主要编译变量如下表所示:

    编译变量

    功能

    LOCAL_PATH

    指定编译路径

    LOCAL_MODULE

    指定编译模块名

    LOCAL_SRC_FILES

    指定编译源码列表

    LOCAL_SHARED_LIBRARIES

    指定使用的C/C++共享库列表

    LOCAL_STATIC_LIBRARIES

    指定使用的C/C++静态库列表

    LOCAL_STATIC_JAVA_LIBRARIES

    指定使用的Java库列表

    LOCAL_CFLAGS

    指定编译器参数

    LOCAL_C_INCLUDES

    指定C/C++头文件路径

    LOCAL_PACKAGE_NAME

    指定Android应用程序名

    LOCAL_CERTIFICATE

    指定签名认证

    LOCAL_JAVA_LIBRARIES

    指定使用的Java库列表

    LOCAL_SDK_VERSION

    指定编译Android应用程序时的SDK版本

    注:其它的编译变量见附录。

    4.1.3实验:编译HelloWorld应用程序

    【实验内容】

    在Ubuntu系统中使用eclipse开发环境编写简单的HelloWorld应用程序,然后使用Android编译系统进行编译,最终将HelloWorld应用程序作为系统应用集成到Android系统中。

    【实验目的】

    通过实验,学员掌握在Android源码的编译系统中编译Android应用程序、库、可执行程序,了解Android系统应用程序的定制过程,最终在Android模拟器中,运行自己通过编译系统编译的Android应用程序。

    【实验平台】

    拥有Android源码的Ubuntu操作系统(可以在Windows系统中虚拟Ubuntu系统)。

    【实验步骤】

    1.      打开eclipse开发环境,创建一个Android应用程序:HelloWorld:

    $ cd ~/android/eclipse

    $./eclipse &

     

    2.      将新创建的HelloWorld工程拷贝到源码目录中的packages/apps目录下:

    $ cp -rf HelloWorld/~/android/android_source/packages/apps

    在HelloWorld工程目录下删除由eclipse开发环境自动生成的文件和目录,仅保留如图x-x所示工程目录结构:


    3.      编译HelloWorld工程的Android.mk文件,我们可以仿照Android里自带的应用程序的Android.mk文件,例如Camera工程中的Android.mk文件:

    将Camera工程中的Android.mk文件拷贝到HelloWorld工程中:

    $ cp  ../Camera/Android.mk./

    修改Android.mk文件,删除没必要的编译变量:

    LOCAL_PATH:= $(call my-dir)

    include $(CLEAR_VARS)

     

    LOCAL_MODULE_TAGS := optional

     

    LOCAL_SRC_FILES := $(call all-java-files-under,src)

     

    LOCAL_PACKAGE_NAME := HelloWorld

    LOCAL_SDK_VERSION := current

     

    include $(BUILD_PACKAGE)

    4.      编译HelloWorld工程:

    Ø 切换到Android源码目录下:

    $ cd ~/android/android_source/

    Ø 加载编译函数:

    $ source build/envsetup.sh

    Ø 选择编译目标项:

    $ lunch generic-eng

    Ø 通过mmm命令编译HelloWorld工程:

    $ mmm packages/apps/HelloWorld/

    Ø 编译生成模拟器映像system.img:

    $ make snod

    注:我们也可以直接通过make命令来编译HelloWorld工程并生成system.img映像文件,但是这种方式耗时比较长,所以我们使用上面的编译方式,能节省实验时间,关于Android源码编译的细节,请查看2.3.2编译Android章节。

     

    5.      启动模拟器,查看HelloWorld应用程序运行效果:

    $ ./run_emulator.sh

    注:run_emulator.sh是快速运行模拟器的脚本,详细说明请查看2.5定制Android模拟器章节。




    展开全文
  • 摘要: 本设计是实现Android底层驱动开发并裁剪定制Android操作系统。其大概流程是在linux系统上借助于gcc编译器编写调试驱动代码,在Android源码中编写APP应用程序、中间件的共享库代码、Android.mk文件、利用javah...

     

     

     

     

     

     

    毕业论文

     

    题   目  实现Android底层驱动开发并裁剪定制Android操作系统           

    学   院         电子信息与电气工程学院      

    姓   名                     牛xxx民           

    专   业         电子信息科学与技术          

    学   号               2012xxxxxxx         

    指导教师           逯xxx胜教授           

    提交日期           2016.05.10         


     

    原创性声明

     

    本人郑重声明:本人所呈交的论文是在指导教师的指导下独立进行研究所取得的成果。学位论文中凡是引用他人已经发表或未经发表的成果、数据、观点等均已明确注明出处。除文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的科研成果。

    本声明的法律责任由本人承担。

     

     

    论文作者签名:      年  月  日 

     

    论文指导教师签名:

     

     

     

     

     

    实现Android底层驱动开发并裁剪定制Android操作系统

    牛xxx民

    (电子信息与电气工程学院 电子信息科学与技术,甘肃,天水,741000)

     

    摘要: 本设计是实现Android底层驱动开发并裁剪定制Android操作系统。其大概流程是在linux系统上借助于gcc编译器编写调试驱动代码,在Android源码中编写APP应用程序、中间件的共享库代码、Android.mk文件、利用javah工具生成头文件,并实现对底层驱动的调用,在这里只实现led的点亮与熄灭,其目的是更注重理解整个Android底层驱动开发的过程,达到举一反多的效果。在官网上下载Android5.0源码,并进行代码的删减和增加,在整个Android系统中加入自己的东西,配置好Android系统编译环境,并在linux平台编译成镜像文件,完成定制Android操作系统,利用烧写工具更新到平板上,最终展现出来。

    关键词:配置环境,驱动开发,定制系统,删减增加

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    Android underlying driver development and tailor custom Android operating system

    Jianmin Niu

    (Electronic information and electrical engineering college Electronic information science and technology,tianshui,gansu,741000

     

    AbstractThis design is to realize the Android underlying driver development and tailor custom Android operating system.Its process is probably on a Linux system using GCC compiler debugging driver code, write the APP in the Android source code application, middleware, Shared library code, Android. Mk files, header files generated by the javah tools,, and implement the calls to the underlying driver, here only led the lighting and extinguishing of, its purpose is to pay more attention to understand the whole Android underlying driver development process, for more than a reverse effect.In the official website to download Android5.0 source code, and code of cuts and increase, add their own things, in the whole Android configured Android compilation environment, and compile the Linux platform into image file, complete custom Android operating system, using burning tools update to the tablet, eventually.

       Keywords:configuration environment,driver development, custom system,Cut to increase

     

     

     

     

     

     

     

     

     

    目录

    目录 4

    1 引言 6

    2 文献综述 6

    2.1国内外研究现状与发展 6

    2.2研究的目的及意义 7

    3 研究方法 7

    3.1技术特点 7

    3.2实现方案 8

    4 裁剪定制Android操作系统 9

    4.1理解Android系统总框架 9

    4.1.1 Android系统总框架 10

    4.1. 2Android 运行时 10

    4.2配置搭建开发环境 11

    4.2.1首先获得Android源码 11

    4.2.2.编译环境硬件要求 12

    4.3 Android 系统源代码目录结构解析 12

    4.4 Android 系统移植流程 13

    4.4.1 Android 系统移植流程概述 13

    4.4.2 Android Kernel移植过程 14

    4.2.3 Android 编译系统配置 15

    4.5添加Android新平台 16

    4.5.1 梳理框架 16

    4.5.3具体修改过程 17

    4.6定制Android系统图标 17

    4.7 Android系统启动过程 17

    5 应用层控制底层硬件设备 19

    5.1 控制方案 19

    5.2.1 硬件电路设计 22

    5.2.2利用方案一实现 22

    5.2.3利用方案二实现 25

    5.2.4利用方案三实现 25

    6 结束语 26

    致  谢 26

    参考文献 27

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    1 引言

         当今,在电子行业,特别是在庞大的手机市场Android操作系统已经占领主导地位,Android可以说是无处不在。整个Android系统又被叫做一个生态系统,可以说涉及了所有嵌入式相关的内容,从最底层的linux系统到上层的APP应用开发,包含C、C++、java等多种编程语言,可以说是把能涉及到的相关知识都涉及到了,其综合性能不言而喻。所以,学好Android操作系统,对于电子行业的人来说至关重要。本人在这里就其Android操作系统,进行了从底层硬件到中间件,直至上层应用的开发,并对整个流程进行了详细阐述,从官方下载Android源码来进行裁剪,对源码进行删减和添加,定制成符合自己的一个精简Android操作系统,并编写了一个点亮LED灯的驱动代码以及上层应用程序代码,实现上层对底层的调用,最终来点亮LED灯。

    2 文献综述

    2.1国内外研究现状与发展

     Android操作系统最初由Andy Rubin开发,主要支持手机20059月由Google收购注资。200712月,Google85家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后GoogleApache开源许可证的授权方式,发布了Android的源代码。200811月第一部Android智能手机发布。Android逐渐扩展到平板电脑及其他领域,如数码相机游戏机等。2011年,Android在全球的市场份额首次超过塞班系统,跃居全球第一。20128月美国科技博客网站BusinessInsider评选出二十一世纪十款最重要电子产品,Android操作系统榜上有名。2013年的第四季度,Android平台手机的全球市场份额已经达到79%2013年全世界采用这款系统的设备数量已经达到近10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.9%,首度超越iOS2015年在移动设备的市场份额中Android排名第一,应用的下载次数达到500亿;每天有16万台的Android设备售出,并仍以每年49.2%的速度在增长[5]

         Android具有平台开放性,开发的平台允许任何移动终端厂商加入到Android联盟中来;Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生,其前景一片光明;跟iPhone相比,它更具有广泛的开发群体;从技术角度而言,android手机比iPhone等其他手机更强调搜索功能,界面更强大,可以说是一种融入了全部web应用的平台。android的版本很多,随着版本的更新,从普通的联系人到现在的数据同步,从最初的触屏到现在的多点触摸,从简单的Google Map到现在的导航系统,这都说明android已经逐渐稳定,而且功能越来越强大。另外,android不仅支持JavaCC++等主流编程语言,还支持RubyRython等脚本语言,甚至Google专门为android应用开发推出simple语言,这使得android有着非常广泛的开发群体;从安全角度来讲,以后手机在生活中的地位会越来越重要,而一些手机病毒也会越来越多,以后智能手机也会成为黑客攻击的一部分,android平台是基于Linux的,安全性相对其他系统更可靠[9]

        Android在中国的前景十分广阔,首先是有成熟的消费者,在国内,android社区十分红火,这些社区为android在中国的普及做了很好的推广作用。国内厂商和运营商也纷纷加入了android阵营,包括中国移动,中国联通,华为通讯,联想,TCL等大企业,同时不仅仅局限于手机,国内厂家也陆续推出了采用android系统的其它产品[6]

        总之,Android在国内外都有着很好的发展势头,其发展前景一片良好。

    2.2研究的目的及意义

    由于Android基于Linux内核且具有开源性、高度模块化、广泛的硬件支持、很好的安全性和可靠性、良好的用户体验以及开放性较强的特点,加上Android Market和众多第三方应用商店做后盾,在应用方面的资源也非常丰富,由于其适应了移动互联网的发展趋势,切合了移动互联网产业链各方的发展变化需求,所以使得它迅速得到众多厂商和广大爱好者的支持,取得了迅猛的发展[6]

    综上可知,对Android操作系统的研究与开发,是作为一个从事移动互联网行业的软件工程师而言必不可少的一部分,它也将会是一个最有前景的选择。

    3研究方法

    3.1技术特点

     对于Android操作系统的定制,全世界各大移动厂商都在使用Google公司提供的Android源码,由于每一个厂商所设计的硬件千差万别,并且客户需求也有所不同,这就要求每一个厂商都要根据自己的硬件设备和相关要求去重新定制符合自己的Android操作系统,虽然Google公司提供的Android源码一般来说都可以直接使用,因为它是跨平台的,但是该源码几乎包含了各个移动设备的所有能实现的公共的东西,使得它占用内存资源特别的大,一般都在30G左右,所以不能直接使用它而是要重新定制,最终使得它符合自己需求并且极大的减少内存资源,一般经过定制之后最终生成的镜像文件只占用手机的700M左右的内存。

     在本设计中,本人可以随意的对Android源码进行裁剪,在这里使用Android5.0源码,虽然Android源码在不断的升级,但其代码目录结构和相关功能不变,所以即使升级到任何版本也是能够随意的进行定制。主要是在底层驱动环节增加和删除设备相关信息,对不需要的设备信息进行删除,对需要添加的设备信息进行代码编写,对相关配置文件进行相关修改,在上层应用界面也可以随意的添加和修改应用程序,最终定制出一套符合自己的精简Android操作系统。该设计过程所添加的应用程序与我们平时直接在操作系统上安装APK应用软件有极大的区别,平时安装的APK应用软件可以随意的进行删除和添加,但如果把它添加定制到操作系统里就不能直接删除,如果要删除也可以,则必须要获得root权限才可以。

    3.2实现方案

        一般的,一个系统软件都会进行分层设计。对于linux系统又包含大的三部分:bootloader、linux内核、根文件系统。其中bootloader又由应用层、逻辑层、驱动层组成;linux内核又由系统调用接口层、逻辑层、驱动层组成。虽然整个linux系统的代码很庞大,但我们也会仅仅因为功能需求而进行选配,对编译系统而言,所谓的选配就是哪些要编译,哪些不编译。在这里主要工作就是熟悉bootloader和linux内核的目录结构,进行Makefile的编写,修改源代码,代码大部分可用,但是有一部分因为硬件变化或逻辑功能变化,需要进行代码修改,对于那些设备驱动不全的,也需要添加驱动代码。该过程所需要的工具有交叉编译工具链、tftp服务、NFS服务等,搭建好linux平台,实现linux系统移植。

        编写一个led驱动程序,中间件共享库代码,上层APP应用程序,实现led点亮。首先要熟悉模块化驱动的编写,再熟悉平台驱动的编写,对于led驱动属于字符设备驱动,要按照字符设备的驱动程序去编写。

    裁剪定制出一个精简的Android操作系统,首先要到官网上下载Android源码,其次,要熟悉Android源码目录结构,在编译Android源码之前先进行厂商定制,添加好自己的代码,对于不需要的进行行裁剪,保留其精华即可,使得系统不过于太庞大。该过程所需要的工具有,linux系统、java SDK、相关的动态库、JNI共享库等。

    4裁剪定制Android操作系统

    4.1理解Android系统总框架

     

    图4-1 Google Android 软件架构

     

    图4-2  Android系统总框架图

    4.1.1 Android系统总框架

     Android系统总框架图包括Android--应用层、Android--应用程序框架、Android---库(系统运行库)、Android--硬件抽象层、Android-Linux内核层,共5层。应用层包含所有的用JAVA语言编写的应用程序。应用程序框架是核心应用程序所使用的API(应用程序编程接口)框架,包含隐藏在每个应用后面的一系列的服务和系统。系统运行库是一些核心库,该核心库提供了JAVA编程语言核心库的大多数功能,包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。硬件抽象层作为硬件和软件栈之间的抽象层,起着承上启下的作用。内核层是Android 的核心系统服务所必需依赖的,如安全性,内存管理,进程管理,网络协议栈和驱动模型。

    4.1. 2Android运行时

     所谓的Android 运行时,每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成同时高效地运行多个DVM实例的虚拟系统。 Dalvik虚拟机执行(.dex)的是Dalvik可执行文件,该格式文件针对内存使用做了优化。

    同时DVM虚拟机是基于寄存器(Stack-based)的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 "dx" 工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

    对于一个应用,一个虚拟机实例,一个进程之间的关系而言。每一个android应用都运行在一个dalvik虚拟机实例中,而每一个虚拟机都是在一个独立的进程空间。虚拟机的进程机制内存分配和管理、mutex等的实现都依赖于底层操作系统。所有android应用的线程都对应于一个Linux线程,虚拟机因而可以更多地依赖于操作系统的线程调度和管理机制。不同的应用在不同的空间里运行,对不同来源的应用都使用不同的Linux用户来运行,可以最大程度地保护应用的安全和独立运行。

    Dalvik虚拟机有两个特征:

    1.专有的dex文件格式。我们都知道dalvik虚拟机使用的是dex文件格式,那么为什么它要弃用字节码文件而是使用专有的dex文件格式呢?有如下原因,<1>.每个应用中会定义很多类,编译完成后即会有很多相应的class文件,class文件中会有大量冗余信息,而dex文件格式会把所有的class文件内容整合到一个文件中,这样,除了减少整体的文件尺寸和I/O操作外,也提高了类的查找速度。<2>.增加了对新的操作码的支持。<3>.文件结构尽量简洁,使用等长的指令,借以提高解析速度。<4>.尽量扩大只读结构的大小,借以提高跨进程的数据共享

    2.dex的优化,为了调整所有字段的字节码(LITILE_ENDIAN)和对齐结构中的每一个域,验证DEX文件中的所有类,并对一些特定的类和方法里的操作码进行优化,它是基于寄存器相对于一些基于堆栈的虚拟机,基于寄存器的虚拟机在硬件、通用性上要差一些,但是在代码的执行效率上却更上一筹。

    4.2配置搭建开发环境

    4.2.1首先获得Android源码

    1.获得Android源码的路径有很多种,如:

    (1).从官网上获得(现在不行了,现在提供了一些镜像网站)

    http://source.android.com/source/downloading.html

    (2).可以从方案提供商要

    (3).从Soc开源社区获取:www.linaro.org

    2.从官网获取源码的具体命令:

    $repo init –u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 下载一个特定的源码分支,下载库文件(注意repo是一个工具)

    $ repo sync同步下载 ,真正把源码同步到本地,初始化同步版本

    4.2.2.编译环境硬件要求

    1.编译的硬件环境

    由于下载源码约10GB,编译源码约30GB,至少拥有1.5GB的物理内存 ,内存要尽可能的大,不然再编译过程中会死掉,内存不够时它会杀掉部分编译进程,这样就出问题了。

    2.编译的软件环境:

        (1).使用Ubuntu (10.04) LTS(长期支持版)以上版本,JDK5 以上的java运行环境(本设计安装的是jdk6), 对于Android5.0(2.3及以上版本)需要使用64位系统编译,使用gcc 4.4 编译器,必须确认编译器版本是否匹配。

     (2).配置软件环境具体命令

    1>.安装JDK

    $ sudo apt-get install sun-java6-jdk   //安装并设置环境变量

    2>. 安装一系列必要工具

    $ sudo apt-get install git-core gnupg flex bison gperf build-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 tofrodos  python-markdown  libxml2-utils  xsltproc  (例如:bison是进行语法分析的,g++-multilib是32位、64位库相互转换等等)。

    4.3 Android系统源代码目录结构解析

     

    图4-3 Android 系统源码目录结构

        在Android 系统源码目录结构中,abi定义了函数参数的执行顺序相关代码。art是第三方的工具,支持应用层的一些工具。bionic里面是一些基础的库的源代码 ,即它把标准C库重新写了一遍。bootloader/legacy是启动引导相关代码,这个我们基本上不用,嵌入式设备有自己专门的启动代码。build目录中存放的是编译系统mk文件,包含编译规则和generic通用类产品基础配置文件。cts是Android兼容性测试套件标准 。dalvik是JAVA虚拟机相关代码,不存在跨平台,只与使用的类相关。development包含程序开发所需要的模板和工具 ,如AVD,示例源码 。device是设备相关代码(最重要的目录),与定制厂商有关的,内部包括厂商目录和产品目录。frameworks是核心Android应用框架库,核心框架——java及C++语言。Hardware主要是硬件适配层HAL代码 ,硬件抽象层代码。ndk是Android本地开发包相关代码 ,一个JNI接口,具体是java如何调C的代码。Out目录是编译后生成的目录,编译完成后的代码输出到这个目录,它不会产生中间代码。Prebuilt:支持Linux and Mac OS builds x86和arm架构下预编译(预先提供的)的一些资源 ,如图片等等。packages包含Android的各种系统级应用程序 ,Android原生的应用层程序,如计算机源码。sdk 包含工具源码及qemu相关源码(与ndk区别:只能运行纯java程序)。system是Android根文件系统相关源码,如:init、adb、toolbox及一些库,库代码。Docs是介绍开源的相关文档。external是允许第三方开源的,Android使用的一些开源的模块代码,通用的东西,如waifi。libcore是与核心库相关的代码。

    4.4 Android系统移植流程

    4.4.1 Android 系统移植流程概述

    图4-4 Android 系统移植流程解析

    1. 编译生成bootloader

    2. 获得支持Android的Android Linux Kernel

    3. 基于Android Kernel移植设备驱动

    4. 下载与Android Kernel匹配的Android Source

    5. 编译Android Source生成并定制Android文件系统

    4.4.2 Android Kernel移植过程

    1.修改kernel .config(基于Android的一些驱动),即选配Android原生的一些驱动。参考目录为kernel-3.18/Documentation/android.txt(具体目录会随具体公司的项目而有所变动)。

     

    图4-5 kernel .config样例

     

    图4-6 kernel .config内容样例

    2.编译针对Android的linux内核

    进入linux源码目录“lichee”下,第一次编译需要执行:

    $ ./build.sh config

    执行上面命令后会出现一系列菜单选项,按提示选择相应的选项,选配符合自己的环境,配置完成后自动进入uboot和内核的编译,第一次完成配置编译后,若以后再执行,只需执行以下命令:

    $ ./build.sh

    每次执行这条命令后,都会按照第一次的配置来编译uboot和内核。

    4.2.3 Android编译系统配置

    1.修改几个重要的makefile。

    Android.mk:编译源码mk文件,每个module和package目录下有这么一个文件,很多地方都有这个东西,它的内容就是告诉编译器本层的哪些需要编译哪些不需要编译。

    main.mk:定义了编译全部代码的依赖关系。

    config.mk:用于配置编译系统,决定如何编译。

    envsetup.mk:定义了编译环境配置。

    product_config.mk:读取AndrodProducts.mk生成TARGET_DEVICE目标设备变量。

    AndroidProducts.mk:定义某厂商所有产品文件列表

    BoardConfig.mk:定义开发板软件相关配置项,对具体硬件的说明。

    2.编译修改后的Android 5.0源码并生成最终镜像。

    进入androidL目录,执行命令$source build/envsetup.sh导出环境变量,加载编译用到的环境变量,添加产品相应配置,然后执行命令$lunch选择相应的产品,列出所有系统编译项,让用户选择编译平台 ,之后再执行命令$extract-bsp,拷贝内核和模块到Android 中,最后执行编译Android系统de命令$make -j2,在当前目录执行编译,–j2表示2个线程同时编译(仅多核CPU),它会执行一系列.mk,会生成很多镜像文件,如boot.img、ramdisk.img、system.img、system.img、recovery.img。执行命令$pack -d 打包生成最终可烧写镜像文件,会把/system/vendor/modules/下的.ko打包成一个总的img的镜像。

    4.5添加Android新平台

    4.5.1梳理框架

    Android源码可以被编译成不同的平台系统,为了方便对源码分类管理,所有平台相关代码放到device目录下,不同的厂商在device下对应不同目录,同一厂商可能有多个产品(TARGET_PRODUCT),这些产品都通过产品配置文件来描述其产品细节(<PRODUCT_NAME>.mk),同一厂商的多个产品由产品列表文件AndroidProducts.mk说明,同一厂商的产品可能使用相同的主板设备 (TARGET_DEVICE)

    图4-7 平台设备目录架构

     

    注:在Android5.0中AndroidProducts.mk也放到了产品目录下面了,在5.0之前是放在厂商目录下的。

    4.5.3具体修改过程

       1.在 device/目录下创建公司目录。

       2.创建一个产品名目录,用来存放产品相关文件。

       3.创建设备相关目录 【这一步省略】注:通常device_name和product_name一样 。

      4.在具体的产品目录下所要修改的内容有

      (1).创建一个product_name.mk文件。

      (2).创建AndroidProducts.mk文件。

          (3).创建 BoardConfig.mk文件,用来配置硬件设备相关信息。

      (4).添加AndroidBoard.mk文件。

       5.如果需要修改系统属性,要在board目录下添加system.prop 文件。

       6.最后,将新的平台的编译选项添加到lunch菜单中,创建vendorsetup.sh 。

       7.在产品目录下新建一个具体的<产品.mk>文件,定义具体的软件相关的东西。

    4.6定制Android系统图标

    在平板开机过程中,屏幕上可能会显示4种形式内容:

    (1)在硬件Boot时出现Boot Logo画面

    (2)Linux启动时画面,可能会显示Linux Logo

    (3)Android系统本地启动阶段画面,可能显示定制画面

    (4)Android系统显示系统启动阶段,可以显示滚动字体或逐帧动画

       

       图4-8 Boot Logo画面    图4-9 Android系统本地启动阶段画面

    4.7 Android系统启动过程

    1.Android系统启动过程(几乎和linux系统启动过程一样):

        Android系统启动有4个阶段;

    1.硬件BOOT、加载Linux内核并挂载Rootfs

    2.init进程启动及Native服务启动

    3.System Server及Android服务启动

    4.Home桌面启动

        2.总体启动框架图

     

    图4-10 总体启动框架图

    3.总体启动流程图

    图4-11 总体启动流程图

    5应用层控制底层硬件设备

    5.1控制方案

    方案一:在早期的Android系统软件架构中,还没有HAL层,在这种情况下,上层APP通过JNI(java本地接口)调用在LIBRARIES层用C代码写好的.SO的共享库,之后,动态库会通过系统调用接口到内核层调用一个写的比较简单的驱动代码,进而到硬件层。

    注:.SO的共享库会通过makefile(modules.mk)被拷贝到根文件系统当中,最终被打包到Android镜像中。

                                  图5-1 实现流程图

        方案二:在后期的Android系统软件架构中,有了HAL层,在HAL层包括两部分代码,首先是谷歌写好的通用代码为上层提供一个通用接口,另外是自己写的驱动代码,这部分是为了与硬件紧密相关。上层APP应用程序通过调用HAL层谷歌的通用代码然后去调用在HAL层的自己写好的相对复杂的驱动代码,进而去调用kernel层相对简单的驱动代码。

                                      图5-2 实现流程图

        方案三:在后期的Android系统软件架构中,不仅有了HAL层,还包含了应用框架层代码,该层的代码是为了单独实现应用层具体的类以及运行一个对应的服务管理器供应用层代码调用,从而使得应用层代码实现完全的与底层独立,上层APP应用程序通过调用应用框架层服务,再让应用框架层代码去调用HAL层谷歌的通用代码然后去调用在HAL层的自己写好的相对复杂的驱动代码,进而去调用kernel层相对简单的驱动代码。

                                   图5-3 实现流程图

    5.2 如何用应用程序去控制一个灯

    5.2.1硬件电路设计

    1.LED模块框图

     

    图5-4 LED模块框图

    2.LED对应的CPU控制接口图

     

    图5-5 LED对应的CPU控制接口图

    5.2.2利用方案一实现

    利用方案一,首先在linux内核层(linux源码目录中)写一个比较简单的驱动代码,这个驱动代码被编译成.ko文件,之后在Android源码中执行extract-bsp命令就会把这个.ko文件拷贝到Androidde 源码中,再通过makefile(modules.mk)拷贝到根文件系统当中,最终被打包到Android镜像中,在.rc文件(init.sun8.rc)中来指定加载的驱动,并改变其权限;其次,在LIBRARIES层写C代码,把它最终编译成一个.so共享库,它是用来调用底层驱动程序并对上层提供一个接口,起到承上启下的作用。最后写一个APP应用程序。

    1.程序流程框图

    5-6 程序流程框图

    2.编写厂商自定义的初始化脚本文件

    如果我们想让自己添加的设备即定制的东西在Android启动时就加载进来,则必须在初始化脚本文件中对它进行声明并改变它的所有者、权限等信息。本人让硬件定制了一个LED灯,在lichee目录下添加了具体的驱动代码,编译出来后拷贝到device目录下,又经过makefile中的命令把它放到/system/vendor/mudules/中,值得注意的是这个驱动是一定能自动创建设备节点的。

    具体修改目录,androidL/device/softwinner/fspad-733/init.sun8i.rc

    3.linux底层驱动代码

    编写驱动代码是软件环节的重中之重,它是硬件的灵魂,没有它一切操作都是无用。本人在此只添加了led驱动代码,如果要添加其它的设备相关驱动,方法一样,在这里只需达到举一反三的效果即可。

    具体修改目录,lichee/linux-3.4/drivers/char/fspad723_led.c(fspad723_led.h)

    4.编写底层驱动代码对应目录的kconfig和makefile文件

        要想让编写的驱动代码在内核编译后生成.ko文件,则必须添加此代码,在该文件中本人只加了一条指令,obj-m += fspad723_led.o,表示直接指定把它编译成模块。

    具体修改目录,lichee/linux-3.4/drivers/char/makefile

    具体修改目录,lichee/linux-3.4/drivers/char/kconfig

    5.编写APP应用程序

        要想实现手机启动之后用界面图标去控制底层驱动代码进而控制硬件LED的亮灭就必须添加此代码。改APP代码可以在PC机上deeclipse软件里编写,之后生成APK文件即可。

    具体修改目录,androidL/hardware/farsight/LedDemo/led_java

    6.编写中间件的共享库代码

        要想把上层应用程序与底层驱动联系起来必须添加此代码,它起着承上启下的作用。对于Android系统来说,把中间件的实现放在库libraries当中,要么放在HAL层当中。对于中间件的代码存放位置Android中比较随意,没有具体的位置,可以放在任何目录下面,至于它会把它排在哪个层次这个是由makefile决定,在这里把中间库代码实现在具体设备目录fspad-733下面,在这个目录下自己创建了一个目录hardware.

    具体修改目录,androidL/device/softwinner/fspad-733/harware/legacy

    在legacy目录下面有一个com_farsight_ledlegacy_legacy.h文件该头文件使用javah工具生成的,由于上层是用java语言而下层使用c语言写的,对于两种不同的语言要建立通信,则必须要有一中翻译机制,即javah(jdk开发包中提供的一个工具)。要生成com_farsight_ledlegacy_legacy.h文件,在PC机运行里打开DOS窗口,进入工程源码目录E\androidL/Eclipse/ledlegacy工程目录执行命令,javah -classpath bin/class -d jni -jni com.farsight.ledlegacy.legacy,执行之后会在android/Eclipse/ledlegacy/

    Jni目录生成一个.h头文件,把它复制到androidL/device/softwinner/

    fspad-733/harware/legacy目录即可。

    7.编写底层驱动代码对应目录的Android.mk文件

    该文件用来指定代码如何编译的。

    8.总述运行流程

        应用程序运行的时候,先去创建类的对象,在创建该对象的时候就加载了“legacy”共享库,然后就可以在java主运行界面mainActivity.java中调用这个类,最终来打开设备,执行关灯和灭灯操作。

    9.用串口调试去测试驱动代码

        在平台驱动时,有一个sysfs目录,在sys/class/farsight_led/led/下面会生成一个属性为enable的文件。

    在终端下执行:

    1.获取权限:$chmod 777 /sys/class/farsight_led/led/enable

    2.若第一步不行,则执行:$su root

    3.执行“亮灯”命令:$echo “1” > /sys/class/farsight_led/led/enable  

    4.执行“灭灯”命令:$echo “0” > /sys/class/farsight_led/led/enable

    5.2.3利用方案二实现

    1.程序流程框图

                         5-7  程序流程框图

    2.具体实现代码步骤(略)

    5.2.4利用方案三实现

    1.程序流程框图

    图5-8 程序流程框图

    2.具体实现代码步骤(略)

    6 结束语

        本设计通过在Android5.0源码中添加和删除了诸多的代码,最终完成了Android操作系统的裁剪与定制,并且实现了底层驱动代码的添加,对整个Android操作系统流程与架构有了深刻的理解。通过此次毕业设计,使得我在以后的工作当中可以实现对任意升级的Android源码进行定制,最终达到与具体硬件的完美匹配。

    致  谢

         首先衷心的感谢我的指导老师逯宗胜教授,在本次设计中给予了我莫大的的帮助和关怀,在完成设计的过程当中悉心的教导了我并给予了诸多的建议,使我受益匪浅。在大学的四年里,逯老师凭借渊博的专业知识并时刻本着负责任的态度去完成每一件事,让我影响深远,我相信,他的师德和人格将会伴随我的一生,让我去更好的走向成功的道路。

    在本次毕业设计中,用到了各方面的专业知识,对自己有了新的认识,感谢学校对我四年来的辛勤培养,完善的实验平台,在大学四年里能有机会在实验室里认真的学习,感谢给予我帮助的老师们,感谢在一起相互学习的伙伴,感谢陪我度过四年的和给予我帮助的所有同学。最后衷心感谢各位评审的专家对我论文的审阅。

     牛建民

                                                      2016519日

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    参考文献

    [1] 韦东山.嵌入式Linux应用开发完全手册.人民邮电出版社,2008.08

    [2] 周庆国.Android底层开发实战.机械工业出版社,2015.10

    [3] 陈强.Android底层接口与驱动开发技术详解.中国铁道出版社,2014.05

    [4] 明日科技.Android从入门到精通.清华大学出版社,2012.09

    [5]计算机研讨_百度文库

    [6]国内安卓手机的发展现状与前景趋势分析

    [7] 康华光等.电子技术基础模拟部分(第五版).高等教育出版社.2008

    [8] 康华光等.电子技术基础数字部分(第五版).高等教育出版社.2008

    [9] 李刚.疯狂Android讲义(第3版).电子工业出版社.2015

    [10] 宋宝华.Linux设备驱动开发详解(第2版).人民邮电出版社.2010

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 4.3定制Android平台系统通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品,从本节开始,我们从最原始的Android源码系统里一步一步定制出自己的Android系统。本节主要内容...

    4.3定制Android平台系统

    通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品,从本节开始,我们从最原始的Android源码系统里一步一步定制出自己的Android系统。本节主要内容包含:根据Android源码,添加新产品编译项,定制系统启动界面和文字,定制系统启动动画和声音,定制系统桌面。

    4.3.1 添加新产品编译项

    Android系统的源代码是一个逻辑结构非常独立工程,在一套Android源码中可以编译出多个产品映像,在需要编译某一个产品系统时,只要通过lunch命令选择产品编译项即可。本节我们介绍如何在Android源码中创建新产品编译项并定制编译出该产品系统。

    在创建新产品编译项时,要先了解下面几个概念:

    Ø 目标产品:具体指某个最终用户买到的Android设备,如:iPhone5,乐PhoneS2,小米手机等。

    Ø 产品系列:开发手机的团队通常由同一团队打造,在研发出一款产品后,往往要继续在其基础上研发出新产品,新产品往往是在老产品的硬件或软件基础上做一些升级,这些产品们就是一个产品系列。比如:联想的乐Phone系列手机包含:乐PhoneS1和乐PhoneS2,他们同属于一个系列。

    Ø 目标设备:目标设备可以理解为手机主板,它是指手机设备硬件配置信息的集合体,每个手机产品都有设备硬件配置,一个设备硬件配置可能被不同产品使用,同一手机有高配置版本和低配置版本,如乐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 \

       ro.com.android.dateformat=MM-dd-yyyy \

       ro.com.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文件。

    Ø 创建AndroidBoard.mk和BoardConfig.mk文件

    $ touch AndroidBoard.mk BoardConfig.mk

    Ø 添加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中。

    Ø 添加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的框架,二者之间通过两个键值布局文件来进行键值的映射。

    Ø Keylayout文件:按键布局文件,以kl后缀命名,该文件用来定义按键驱动里上报的键值号(数字)和Linux内核中通过event事件上报的键值(字符)之间的映射关系。kl文件要放在/system/usr/keylayout/目录下或/data/usr/keylayout/目录下。

    Ø 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=myproduct

    TARGET_BUILD_VARIANT=eng

    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.      常见问题

    Ø 问题1: lunch菜单里没有出现myproduct编译项

    原因及解决方法:在执行lunch之前,要执行source build/envsetup.sh命令,确认vendorsetup.sh文件存在及其内容正确无误。

    Ø 问题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

    Ø 问题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 所示:

    Ø  Linux启动时画面,通常是个黄嘴的小企鹅

    Ø  Android系统init进程启动阶段画面,是“ANDROID”文字字样

    Ø  Android系统启动阶段动画,是滚动的ANDROID动画


    图 x-x 开机界面与Android动画

    定制系统开机动画

    【实验背景知识】

    Android的开机动画是由Linux本地守护程序bootanimation专门控制实现的,其代码在:frameworks/base/cmds/bootanimation/目录下,修改Android开机动画有两种方式:

    Ø 蒙板图片替换:

    替换frameworks/base/core/res/assets/images/目录下的两个图片文件:android-logo-mask.png和android-logo-shine.png。android-logo-mask.png是镂空蒙板图片,android-logo-shine.png是镂空蒙板后面的闪光png图片。两个图片通过叠加移动来达到动画效果。

    Ø 逐帧动画替换:

    在/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压缩包文件结构

    文件

    说明

    desc.txt

    动画属性描述文件

    part0/

    第一阶段动画图片的目录

    part1/

    第二阶段动画图片的目录

    其中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系统只能使用一种启动动画方式,先判断是否使用了逐帧动画,如果没有使用逐帧动画时,才使用默认的蒙板动画。




    展开全文
  • Android系统定制

    2018-01-12 14:00:12
    深入浅出 - Android系统移植与平台开发(1)- Android系统的定制 http://blog.csdn.net/mr_raptor/article/details/30113417?utm_source=tuicool 4.3定制Android平台系统 通常产品厂商在拿到Android源码后会...
  • 在开始研究Android系统之前,我们要准备好一些开发的资料,比如Ubuntu,源码,开发资料等,Android系统本身来说,非常的庞大,应用使用的是JAVA语言,底层使用C/C++,所以,如果条件允许的话,尽可能的多掌握一些吧...
  • android系统的简单定制

    2017-02-26 17:08:56
    简单基础的定制android系统,使第一次开机就安装系统应用和一般应用,加载服务工具和其它文件,开机启动画面,设置默认输入法、屏幕亮度等等。 如何简单的定制android系统?这里有两种方法: 第一是使用蘑菇ROM助手...
  • 一般情况下,一款基于Android的设备,会根据需求定制系统APP,定制的规格往往需要依据设备的具体应用场景。比如,面向通信的设备,那么需要预装phone、tablets、browser、TeleCom等APP或者服务;而面向可穿戴的设备...
  • Android系统定制和源码开发以及源码编译
  • 写在前面的 这是我最近两年的Android开发的经验总结,断断续续的写了几个月了,欢迎大家砖头,有不对的地方,或需要改进的地方,请指出来,先贴出来目录来看看。第一章、 概述... 51.1 Android 操作系统介绍.... ...
  • http://www.jianshu.com/p/46c63dfd5c89 欢迎关注微信公众号:DroidMind 精品内容独家发布平台 呈现与博客不一样的技术干货
  • 一、 修改化定制Android4.0系统 Android系统启动时,先加载Linux内核,在Linux的framebuffer驱动里可以定制开机界面,Linux内核启动成功后,挂载根文件系统,启动Android系统,这个时候设备屏幕上开始出现滚动的...
  • 1、环境搭建:进入www.android.com 2、找到developer Resource 3、http://source.android.com/source/initializing.html当前历史时间的连接
  • 定制Android平台系统 添加新产品编译项定制产品的意义及定制要点定制系统开机动画 4.3定制Android平台系统 通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品...
  • 何为系统服务做Android APP开发的过程中,会经常需要调用类似于下面这样的函数:...这个WifiManagerService就是运行在Android系统后台,为应用提供接口支持的系统服务。这些系统服务在开机的过程中启动,运行于
  • 刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结。首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码工程目录如下: 当然了除了用eclipse...
  • 首页 > 精品文库 > android系统镜像裁剪定制---实战篇  android系统裁剪优化一直是各个厂商定制产品的关键步骤,包括浅层次的去除不必要的apk(android apk裁剪定制 )和深层次的裁剪整个编译系统和框架...
  • 从毕业后到做开发已经两年多了,刚开始学习android时,觉的它很新奇,基本上朋友每个人都有一部手机,深深了解这个专业后,发现做一名Android开发师真的挺自豪的,是IT让我有了新的人生方向,毕业后知道自己以后要做...
1 2 3 4 5 ... 20
收藏数 45,123
精华内容 18,049
关键字:

定制android平台系统开发