一、首先,搞明白ROM的概念。
廣義上對於ROM,有兩種定義:
1.官方原廠ROM。
就是官方適配的ROM,無修改,原汁原味由品牌廠商自己定制開發的ROM。
2.第三方定制ROM。
意思很明確,就是經過第三方修改定制的系統,可以是在官方原廠ROM的基礎上修改、定制功能;也可以移植其他OS,比如MIUI、Flyme、EMUI等等;其次,還可以是基於源碼插樁移植,編譯適配的ROM,比如MIUI\Color OS的patchrom項目,或者一些其他的魔趣、CM等等
由於技術的復雜程度以及內容繁多,在這里不一一闡述。
參考/資料來源:ROM開發者社區-入門到精通
如果是想自己動手制作刷機包的,下面簡單講一下ROM定制、ROM開發教程的類目:
第二、開發教程科目
包含內容:第一期主要為技術資料,提供一些工具為主 ,偶爾附加一些必要的教程。第二期會針對技術教程,細分知識點,重點剖析、解釋,形成一系列的知識文檔供,目前大綱已列出。
第一期---技術資料:
1.書籍-Android系統級深入開發——移植與調試
2.開發工具-Android-Kitchen
3.boot解包打包修改工具
4.adb-fastboot最新編譯工具
5.apktool反編譯工具
6.卡刷轉線刷工具,dat轉img
7.CM編譯參考教程,教你如何快速編譯自己的ROM
8.Flymeos源碼同步更新以及插樁適配教程
9.Odex合並工具
10.高通命令進入9008端口方式匯總和機型整理
11.ROM移植的思路和方法
第二期---技術教程(教學大綱):
一、認識ROM開發
概念
涉及知識面
包含內容和方向
二、環境安裝
Windows環境
Linux環境
三、基礎知識
安卓系統結構
系統模式和分區
四、解包打包
卡刷、線刷包工具解包打包
三星tar格式打包工具
注意事項
五、定制修改
修改機型信息
定制開機動畫
系統布局修改和美化
多國語言(三星篇)
六、進階知識
Boot內核修改
Recovery移植與編譯
Odex合並原理以及教程
逆向APK反編譯修改教程
ADB經典用法和高效率使用調試教程
系統優化,游戲與性能優化
源碼編譯,Patch ROM項目教程
七、線刷包開發與制作
如何從手機中提取備份分區鏡像
Boot校驗去除和修改
定制線刷ROM以及將黑磚救活
解屏幕鎖、賬戶鎖
八、高級定制
ROOT原理分析和操作教程
Xposed框架集成與玩法介紹
設置添加作者信息和鏈接&專屬高級設置APP定制
ROM移植教程與過程分析
破網絡鎖與案例分析
--------------------------------------------華麗分割線-------------------------------------------
第三、對於本文主題,個人覺得還是得從基礎入手,以下是一些基礎的知識點:
1、Android系統是什么?
Android是Google公司於2007年發布的基於Linux的移動終端系統平台。
之所以說是移動終端,是因為現如今手機、MID、Tablet等之間的差距越來越小,而不再存在不可逾越的鴻溝。
憑借Google服務的優勢、各移動設備制造商的配合以及Android系統本身對於開發者良好的親和性,
Android系統很快就在移動設備操作系統領域占有了舉足輕重的地位。
說到底,Android也就是基於Linux的操作系統,而所謂基於Linux,指的即是基於Linux內核。
其實,在移動終端領域,Android不是第一個這樣做的,也不是最后一個。
如Web OS、Maemo、Moblin、Bada、Meego等
基於Linux內核就意味着這些系統會有本質的相通之處,也意味着有更多的開放性、會吸引更多的開發者。
所以,拋開硬件限制,一代神機HD2能夠跑Android也就注定能跑Unbuntu和Meego等。(不過可能會涉及的驅動開發以及CPU、存儲容量的制約)
2、Android系統結構
接下來就說一說Android系統的結構,對於Android系統結構的了解對於Android軟件開發和ROM制作都很重要。
只有當你真正了解了Android是怎樣的構成的時候,才能更深刻的理解之后每一步做的是什么,也才能明白出了問題可能是哪里的問題。
(1)宏觀
Android是基於Linux內核的,
Linux內核是什么不知道?簡單地說就是Linux是一個操作系統,Linux Kernel就是這個系統最最基本的部分,是核心。
好比用戶數最多的Windows系統,你看道的那些窗口啊、畫圖計算器掃雷那些附件啊什么的,不過是架在Windows的內核之上而已。
所謂內核,就是供上層用戶庫、用戶程序調用的核心。就好比計算所得稅有一個公式,而其核心是加減乘除四則運算……扯遠了……
簡單地說Android就是:Linux內核+第三方庫(如sqlite、webkit等)+Android核心庫+Java虛擬機+定義提供的一些接口
只要把上邊每個詞搞懂是啥了,基本就搞懂Android是怎樣工作的了。
Android在宏觀上的結構如下
從上至下依次為:應用程序層、應用程序框架層(提供給應用程序對低層接口)、支持庫及Android運行時環境(含核心庫及Java虛擬機)、Linux內核
(2)模塊
Android各功能系統模塊(看其他部分時可能結合這塊看):
(3)Android源代碼目錄結構
|-- Makefile
|-- bionic (bionic C庫)
|-- bootable (啟動引導相關代碼)
|-- build (存放系統編譯規則及generic等基礎開發包配置)
|-- cts (Android兼容性測試套件標准)
|-- dalvik (dalvik JAVA虛擬機)
|-- development (應用程序開發相關)
|-- external (android使用的一些開源的模組)
|-- frameworks (核心框架——java及C++語言)
|-- hardware (主要保護硬解適配層HAL代碼)
|-- libcore
|-- ndk
|-- device
|-- out (編譯完成后的代碼輸出與此目錄)
|-- packages (應用程序包)
|-- prebuilt (x86和arm架構下預編譯的一些資源)
|-- sdk (sdk及模擬器)
|-- system (文件系統庫、應用及組件——C語言)
`-- vendor (廠商定制代碼)
bionic 目錄
|-- libc (C庫)
| |-- arch-arm (ARM架構,包含系統調用匯編實現)
| |-- arch-x86 (x86架構,包含系統調用匯編實現)
| |-- bionic (由C實現的功能,架構無關)
| |-- docs (文檔)
| |-- include (頭文件)
| |-- inet
| |-- kernel (Linux內核中的一些頭文件)
| |-- netbsd (?netbsd系統相關,具體作用不明)
| |-- private (?一些私有的頭文件)
| |-- stdio (stdio實現)
| |-- stdlib (stdlib實現)
| |-- string (string函數實現)
| |-- tools (幾個工具)
| |-- tzcode (時區相關代碼)
| |-- unistd (unistd實現)
| `-- zoneinfo (時區信息)
|-- libdl (libdl實現,dl是動態鏈接,提供訪問動態鏈接庫的功能)
|-- libm (libm數學庫的實現,)
| |-- alpha (apaha架構)
| |-- amd64 (amd64架構)
| |-- arm (arm架構)
| |-- bsdsrc (?bsd的源碼)
| |-- i386 (i386架構)
| |-- i387 (i387架構?)
| |-- ia64 (ia64架構)
| |-- include (頭文件)
| |-- man (數學函數,后綴名為.3,一些為freeBSD的庫文件)
| |-- powerpc (powerpc架構)
| |-- sparc64 (sparc64架構)
| `-- src (源代碼)
|-- libstdc++ (libstdc++ C++實現庫)
| |-- include (頭文件)
| `-- src (源碼)
|-- libthread_db (多線程程序的調試器庫)
| `-- include (頭文件)
`-- linker (動態鏈接器)
`-- arch (支持arm和x86兩種架構)
bootable 目錄
|-- bootloader (適合各種bootloader的通用代碼)
| `-- legacy (估計不能直接使用,可以參考)
| |-- arch_armv6 (V6架構,幾個簡單的匯編文件)
| |-- arch_msm7k (高通7k處理器架構的幾個基本驅動)
| |-- include (通用頭文件和高通7k架構頭文件)
| |-- libboot (啟動庫,都寫得很簡單)
| |-- libc (一些常用的c函數)
| |-- nandwrite (nandwirte函數實現)
| `-- usbloader (usbloader實現)
|-- diskinstaller (android鏡像打包器,x86可生產iso)
`-- recovery (系統恢復相關)
|-- edify (升級腳本使用的edify腳本語言)
|-- etc (init.rc恢復腳本)
|-- minui (一個簡單的UI)
|-- minzip (一個簡單的壓縮工具)
|-- mtdutils (mtd工具)
|-- res (資源)
| `-- images (一些圖片)
|-- tools (工具)
| `-- ota (OTA Over The Air Updates升級工具)
`-- updater (升級器)
build目錄
.
|-- core (核心編譯規則)
|-- history (歷史記錄)
|-- libs
| `-- host (主機端庫,有android “cp”功能替換)
|-- target (目標機編譯對象)
| |-- board (開發平台)
| | |-- emulator (模擬器)
| | |-- generic (通用)
| | |-- idea6410 (自己添加的)
| | `-- sim (最簡單)
| `-- product (開發平台對應的編譯規則)
| `-- security (密鑰相關)
`-- tools (編譯中主機使用的工具及腳本)
|-- acp (Android "acp" Command)
|-- apicheck (api檢查工具)
|-- applypatch (補丁工具)
|-- apriori (預鏈接工具)
|-- atree (tree工具)
|-- bin2asm (bin轉換為asm工具)
|-- check_prereq (檢查編譯時間戳工具)
|-- dexpreopt (模擬器相關工具,具體功能不明)
|-- droiddoc (?作用不明,java語言,網上有人說和JDK5有關)
|-- fs_config (This program takes a list of files and directories)
|-- fs_get_stats (獲取文件系統狀態)
|-- iself (判斷是否ELF格式)
|-- isprelinked (判斷是否prelinked)
|-- kcm (按鍵相關)
|-- lsd (List symbol dependencies)
|-- releasetools (生成鏡像的工具及腳本)
|-- rgb2565 (rgb轉換為565)
|-- signapk (apk簽名工具)
|-- soslim (strip工具)
`-- zipalign (zip archive alignment tool)
dalvik目錄 dalvik虛擬機
.
|-- dalvikvm (main.c的目錄)
|-- dexdump (dex反匯編)
|-- dexlist (List all methods in all concrete classes in a DEX file.)
|-- dexopt (預驗證與優化)
|-- docs (文檔)
|-- dvz (和zygote相關的一個命令)
|-- dx (dx工具,將多個java轉換為dex)
|-- hit (?java語言寫成)
|-- libcore (核心庫)
|-- libcore-disabled (?禁用的庫)
|-- libdex (dex的庫)
|-- libnativehelper (Support functions for Android's class libraries)
|-- tests (測試代碼)
|-- tools (工具)
`-- vm (虛擬機實現)
development 目錄 (開發者需要的一些例程及工具)
|-- apps (一些核心應用程序)
| |-- BluetoothDebug (藍牙調試程序)
| |-- CustomLocale (自定義區域設置)
| |-- Development (開發)
| |-- Fallback (和語言相關的一個程序)
| |-- FontLab (字庫)
| |-- GestureBuilder (手勢動作)
| |-- NinePatchLab (?)
| |-- OBJViewer (OBJ查看器)
| |-- SdkSetup (SDK安裝器)
| |-- SpareParts (高級設置)
| |-- Term (遠程登錄)
| `-- launchperf (?)
|-- build (編譯腳本模板)
|-- cmds (有個monkey工具)
|-- data (配置數據)
|-- docs (文檔)
|-- host (主機端USB驅動等)
|-- ide (集成開發環境)
|-- ndk (本地開發套件——c語言開發套件)
|-- pdk (Plug Development Kit)
|-- samples (演示程序)
| |-- AliasActivity ()
| |-- ApiDemos (API演示程序)
| |-- BluetoothChat (藍牙聊天)
| |-- BrowserPlugin (瀏覽器插件)
| |-- BusinessCard (商業卡)
| |-- Compass (指南針)
| |-- ContactManager (聯系人管理器)
| |-- CubeLiveWall** (動態壁紙的一個簡單例程)
| |-- FixedGridLayout (像是布局)
| |-- GlobalTime (全球時間)
| |-- HelloActivity (Hello)
| |-- Home (Home)
| |-- JetBoy (jetBoy游戲)
| |-- LunarLander (貌似又是一個游戲)
| |-- MailSync (郵件同步)
| |-- MultiResolution (多分辨率)
| |-- MySampleRss (RSS)
| |-- NotePad (記事本)
| |-- RSSReader (RSS閱讀器)
| |-- SearchableDictionary (目錄搜索)
| |-- **JNI (JNI例程)
| |-- SkeletonApp (空殼APP)
| |-- Snake (snake程序)
| |-- SoftKeyboard (軟鍵盤)
| |-- Wiktionary (?維基)
| `-- Wiktionary**(?維基例程)
|-- scripts (腳本)
|-- sdk (sdk配置)
|-- simulator (?模擬器)
|-- testrunner (?測試用)
`-- tools (一些工具)
external 目錄
.
|-- aes (AES加密)
|-- apache-http (網頁服務器)
|-- astl (ASTL (Android STL) is a slimmed-down version of the regular C++ STL.)
|-- bison (自動生成語法分析器,將無關文法轉換成C、C++)
|-- blktrace (blktrace is a block layer IO tracing mechanism)
|-- bluetooth (藍牙相關、協議棧)
|-- bsdiff (diff工具)
|-- bzip2 (壓縮工具)
|-- clearsilver (html模板系統)
|-- dbus (低延時、低開銷、高可用性的IPC機制)
|-- dhcpcd (DHCP服務)
|-- dosfstools (DOS文件系統工具)
|-- dropbear (SSH2的server)
|-- e2fsprogs (EXT2文件系統工具)
|-- elfcopy (復制ELF的工具)
|-- elfutils (ELF工具)
|-- embunit (Embedded Unit Project)
|-- emma (java代碼覆蓋率統計工具)
|-- esd (Enlightened Sound Daemon,將多種音頻流混合在一個設備上播放)
|-- expat (Expat is a stream-oriented XML parser.)
|-- fdlibm (FDLIBM (Freely Distributable LIBM))
|-- freetype (字體)
|-- fsck_msdos (dos文件系統檢查工具)
|-- gdata (google的無線數據相關)
|-- genext2fs (genext2fs generates an ext2 filesystem as a normal (non-root) user)
|-- giflib (gif庫)
|-- googleclient (google用戶庫)
|-- grub (This is GNU GRUB, the GRand Unified Bootloader.)
|-- gtest (Google C++ Testing Framework)
|-- icu4c (ICU(International Component for Unicode)在C/C++下的版本)
|-- ipsec-tools (This package provides a way to use the native IPsec functionality )
|-- iptables (防火牆)
|-- jdiff (generate a report describing the difference between two public JavaAPIs.)
|-- jhead (jpeg頭部信息工具)
|-- jpeg (jpeg庫)
|-- junit (JUnit是一個Java語言的單元測試框架)
|-- kernel-headers (內核的一些頭文件)
|-- libffi (libffi is a foreign function inte**ce library.)
|-- libpcap (網絡數據包捕獲函數)
|-- libpng (png庫)
|-- libxml2 (xml解析庫)
|-- mtpd (一個命令)
|-- netcat (** Unix utility which reads and writes dataacross network connections)
|-- netperf (網絡性能測量工具)
|-- neven (看代碼和JNI相關)
|-- opencore (多媒體框架)
|-- openssl (SSL加密相關)
|-- openvpn (VPN開源庫)
|-- oprofile (OProfile是Linux內核支持的一種性能分析機制。)
|-- ping (ping命令)
|-- ppp (pppd撥號命令,好像還沒有chat)
|-- proguard (Java class file shrinker, optimizer, obfuscator, and preverifier)
|-- protobuf (a flexible, efficient, automated mechanism for serializing structured data)
|-- qemu (arm模擬器)
|-- safe-iop (functions for performing safe integer operations )
|-- skia (skia圖形引擎)
|-- sonivox (sole MIDI solution for Google Android Mobile Phone Platform)
|-- speex (Speex編/解碼API的使用(libspeex))
|-- sqlite (數據庫)
|-- srec (Nuance 公司提供的開源連續非特定人語音識別)
|-- strace (trace工具)
|-- svox (Embedded Text-to-Speech)
|-- tagsoup (TagSoup是一個Java開發符合SAX的HTML解析器)
|-- tcpdump (抓TCP包的軟件)
|-- tesseract (Tesseract Open Source OCR Engine.)
|-- tinyxml (TinyXml is a **, small, C++ XML parser)
|-- tremor (I stream and file decoder provides an embeddable,integer-only library)
|-- webkit (瀏覽器核心)
|-- wpa_supplicant (無線網卡管理)
|-- xmlwriter (XML 編輯工具)
|-- yaffs2 (yaffs文件系統)
`-- zlib (a general purpose data compression library)
frameworks 目錄 (核心框架——java及C++語言)
.
|-- base (基本內容)
| |-- api (都是xml文件,定義了java的api)
| |-- awt (AWT庫)
| |-- build (空的)
| |-- camera (攝像頭服務程序庫)
| |-- cmds (重要命令:am、app_proce等)
| |-- core (核心庫)
| |-- data (字體和聲音等數據文件)
| |-- docs (文檔)
| |-- graphics (圖形相關)
| |-- include (頭文件)
| |-- keystore (和數據簽名證書相關)
| |-- libs (庫)
| |-- location (地區庫)
| |-- media (媒體相關庫)
| |-- obex (藍牙傳輸庫)
| |-- opengl (2D-3D加速庫)
| |-- packages (設置、TTS、VPN程序)
| |-- sax (XML解析器)
| |-- services (各種服務程序)
| |-- telephony (電話通訊管理)
| |-- test-runner (測試工具相關)
| |-- tests (各種測試)
| |-- tools (一些叫不上名的工具)
| |-- vpn (VPN)
| `-- wifi (無線網絡)
|-- opt (可選部分)
| |-- com.google.android (有個framework.jar)
| |-- com.google.android.googlelogin (有個client.jar)
| `-- emoji (standard message elements)
`-- policies (Product policies are operating system directions aimed at specific uses)
`-- base
|-- mid (MID設備)
`-- phone (手機類設備,一般用這個)
hardware 目錄 (部分廠家開源的硬解適配層HAL代碼)
|-- broadcom (博通公司)
| `-- wlan (無線網卡)
|-- libhardware (硬件庫)
| |-- include (頭文件)
| `-- modules (Default (and possibly architecture dependents) HAL modules)
| |-- gralloc (gralloc顯示相關)
| `-- overlay (Skeleton for the "overlay" HAL module.)
|-- libhardware_legacy (舊的硬件庫)
| |-- flashlight (背光)
| |-- gps (GPS)
| |-- include (頭文件)
| |-- mount (舊的掛載器)
| |-- power (電源)
| |-- qemu (模擬器)
| |-- qemu_tracing (模擬器跟蹤)
| |-- tests (測試)
| |-- uevent (uevent)
| |-- vibrator (震動)
| `-- wifi (無線)
|-- msm7k (高通7k處理器開源抽象層)
| |-- boot (啟動)
| |-- libaudio (聲音庫)
| |-- libaudio-qsd8k (qsd8k的聲音相關庫)
| |-- libcamera (攝像頭庫)
| |-- libcopybit (copybit庫)
| |-- libgralloc (gralloc庫)
| |-- libgralloc-qsd8k (qsd8k的gralloc庫)
| |-- liblights (背光庫)
| `-- librpc (RPC庫)
|-- ril (無線電抽象層)
| |-- include (頭文件)
| |-- libril (庫)
| |-- reference-cdma-sms (cdma短信參考)
| |-- reference-ril (ril參考)
| `-- rild (ril后台服務程序)
`-- ti (ti公司開源HAL)
|-- omap3 (omap3處理器)
| |-- dspbridge (DSP橋)
| |-- libopencorehw (opencore硬件庫)
| |-- liboverlay (overlay硬件庫)
| |-- libstagefrighthw (stagefright硬件庫)
| `-- omx (omx組件)
`-- wlan (無線網卡)
prebuilt 目錄 (x86和arm架構下預編譯的一些資源)
.
|-- android-arm (arm-android相關)
| |-- gdbserver (gdb調試器)
| `-- kernel (模擬的arm內核)
|-- android-x86 (x86-android相關)
| `-- kernel (空的)
|-- common (通用編譯好的代碼,應該是java的)
|-- darwin-x86 (drawin x86平台)
| `-- toolchain (工具鏈)
| |-- arm-eabi-4.2.1
| |-- arm-eabi-4.3.1
| `-- arm-eabi-4.4.0
|-- darwin-x86_64 (drawin x86 64bit平台)
|-- linux-x86 (linux x86平台)
| `-- toolchain (工具鏈,我們應該主要用這個)
| |-- arm-eabi-4.2.1
| |-- arm-eabi-4.3.1
| |-- arm-eabi-4.4.0
| `-- i686-unknown-linux-gnu-4.2.1 (x86版編譯器)
|-- linux-x86_64 (linux x86 64bit平台)
|-- windows (windows平台)
`-- windows-x86_64 (64bit windows平台)
system 目錄 (底層文件系統庫、應用及組件——C語言)
.
|-- Bluetooth (藍牙相關)
|-- core (系統核心工具盒接口)
| |-- adb (adb調試工具)
| |-- cpio (cpio工具,創建img)
| |-- debuggerd (調試工具)
| |-- fastboot (快速啟動相關)
| |-- include (系統接口頭文件)
| |-- init (init程序源代碼)
| |-- libacc (輕量級C編譯器)
| |-- libctest (libc測試相關)
| |-- libcutils (libc工具)
| |-- liblog (log庫)
| |-- libmincrypt (加密庫)
| |-- libnetutils (網絡工具庫)
| |-- libpixelflinger (圖形處理庫)
| |-- libsysutils (系統工具庫)
| |-- libzipfile (zip庫)
| |-- logcat (查看log工具)
| |-- logwrapper (log封裝工具)
| |-- mkbootimg (制作啟動boot.img的工具盒腳本)
| |-- netcfg (網絡配置netcfg源碼)
| |-- nexus (google最新手機的代碼)
| |-- rootdir (rootfs,包含一些etc下的腳本和配置)
| |-- sh (shell代碼)
| |-- toolbox (toolbox,類似busybox的工具集)
| `-- vold (SD卡管理器)
|-- extras (額外工具)
| |-- latencytop (a tool for software developers ,identifying system latency happen)
| |-- libpagemap (pagemap庫)
| |-- librank (Java Library Ranking System庫)
| |-- procmem (pagemap相關)
| |-- procrank (Java Library Ranking System相關)
| |-- showmap (showmap工具)
| |-- showslab (showslab工具)
| |-- sound (聲音相關)
| |-- su (su命令源碼)
| |-- tests (一些測試工具)
| `-- timeinfo (時區相關)
`-- wlan (無線相關)
`-- ti (ti網卡相關工具及庫)
packages 目錄
.
|-- apps (應用程序庫)
| |-- AlarmClock (鬧鍾)
| |-- Bluetooth (藍牙)
| |-- Browser (瀏覽器)
| |-- Calculator (計算器)
| |-- Calendar (日歷)
| |-- Camera (相機)
| |-- CertInstaller (在Android中安裝數字簽名,被調用)
| |-- Contacts (撥號(調用)、聯系人、通話記錄)
| |-- DeskClock (桌面時鍾)
| |-- Email (Email)
| |-- Gallery (相冊,和Camera類似,多了列表)
| |-- Gallery3D (3D相冊)
| |-- GlobalSearch (為google搜索服務,提供底層應用)
| |-- GoogleSearch (google搜索)
| |-- HTMLViewer (瀏覽器附屬界面,被瀏覽器應用調用,同時提供存儲記錄功能)
| |-- IM (即時通訊,為手機提供信號發送、接收、通信的服務)
| |-- Launcher (登陸啟動項,顯示圖片框架等等圖形界面)
| |-- Launcher2 (登陸啟動項,負責應用的調用)
| |-- Mms (彩信業務)
| |-- Music (音樂播放器)
| |-- PackageInstaller (安裝、卸載程序的響應)
| |-- Phone (電話撥號程序)
| |-- Provision (預設應用的狀態,使能應用)
| |-- Settings (開機設定,包括電量、藍牙、設備信息、界面、wifi等)
| |-- SoundRecorder (錄音機,可計算存儲所需空間和時間)
| |-- Stk (接收和發送短信)
| |-- Sync (空) -------○1
| |-- Updater (空)
| `-- VoiceDialer (語音識別通話)
|-- inputmethods (輸入法)
| |-- LatinIME (拉丁文輸入法)
| |-- OpenWnn (OpenWnn輸入法)
| `-- PinyinIME (拼音輸入法)
|-- providers (提供器,提供應用程序、界面所需的數據)
| |-- ApplicationsProvider (應用程序提供器,提供應用程序啟動項、更新等)
| |-- CalendarProvider (日歷提供器)
| |-- ContactsProvider (聯系人提供器)
| |-- DownloadProvider (下載管理提供器)
| |-- DrmProvider (創建和更新數據庫時調用)
| |-- GoogleContactsProvider (聯系人提供器的子類,用以同步聯系人)
| |-- GoogleSubscribedFeedsProvider(設置信息提供器)
| |-- ImProvider (空)
| |-- ManagementProvider (空)
| |-- MediaProvider (媒體提供器,提供存儲數據)
| |-- TelephonyProvider (彩信提供器)
| |-- UserDictionaryProvider (用戶字典提供器,提供用戶常用字字典)
| `-- WebSearchProvider (空)
|-- services
| |-- EasService (空)
| `-- LockAndWipe (空)
`-- wall**s (牆紙)
|-- Basic (基本牆紙,系統內置牆紙)
|-- LivePicker (選擇動態壁紙)
|-- MagicSmoke (壁紙特殊效果)
`-- MusicVisualization (音樂可視化,圖形隨音樂而變化)
vendor 目錄 (廠家定制內容)
|-- aosp (android open source project)
| `-- products (一些板級規則)
|-- htc (HTC公司)
| |-- common-open (通用部分)
| | `-- akmd (解壓img用的工具)
| |-- dream-open (G1開放部分)
| |-- prebuilt-open (預編譯開放部分)
| `-- sapphire-open (sapphire這款型號開放內容)
|-- pv-open (沒東西)
|-- qcom (里面基本是空的)
`-- sample (google提供的樣例)
|-- apps (應用)
| |-- client (用戶)
| `-- upgrade (升級)
|-- frameworks (框架)
| `-- PlatformLibrary (平台庫)
|-- products (產品)
|-- sdk_addon (sdk添加部分)
`-- skins (皮膚)
`-- WVGAMedDpi (WVGA適用的圖片)
SDK和OUT目錄沒有列出
(4)ROM結構
ROM(不論模擬還是直刷)主要由initrd、zImage、system組成。
initrd負責的就是啟動,其本質就是一個臨時的系統,在引導時使用。
zImage即為Linux內核鏡像,所謂的Android基於Linux內核,事實上也就是基於它。
在直刷中,很多人通常把這兩項單獨打包成boot.img,也就是統成為引導鏡像。
至於常出現的system.img、system.bin、system.ext2,即為system。
對應的就是那些原生機的卡刷用的update.zip中的system目錄,這里面的一切成就了Android的各種特性。
在這部分,先只重點分析一下system目錄結構
(補充,用戶安裝程序會存在data目錄,sd卡被掛載在sdcard目錄):
system/app
–在這個文件夾下的程序為系統默認的組件,可以看到都是以APK格式結尾的文件,但有些自制的ROM里面還有和APK文件名對應的odex文件。
\\system\\etc
從文件夾名稱來看保存的都是系統的配置文件,比如APN接入點設置等核心配置。
\\system\\fonts
字體文件夾
\\system\\lib
lib目錄中存放的主要是系統底層庫,如平台運行時庫。
\\system\\media
媒體文件夾,除了常規的鈴聲外還有一些系統提示事件音以及開機動畫(bootanimation.zip)等
\\system\\sounds
默認的音樂測試文件,僅有一個test.mid文件,用於播放測試的文件。
\\system\\usr
用戶文件夾,包含共享、鍵盤布局、時間區域文件等。
4、ROM制作的第一步——編譯
如果只是定制ROM而不是自己從頭做ROM(太費精力,一是麻煩,而是沒必要,一般這樣的工作都由大神級人物替咱們完成),
那么這部分是沒有必要看的。
說白了,Generic Android系統的編譯很簡單,都有makefile了,還說什么呢?直接make一下不就輸出編譯了嗎?
(寫給小白:makefile即編譯腳本文件,其內容配置了源碼目錄、庫目錄、編譯命令以及編譯選項等。
欲了解詳細內容請百度或參考SUN出的makefile用戶手冊。make命令即是依據makefile進行自動化編譯。)
不過難點就在於,對於不同的機型需要修改源碼、編譯選項等……
而如果什么都不修改(如上),編譯出來的實際上就是一個通用的,這個通用並不是所有手機都能用的含義。
另外需要指出,由於源碼量很大,一次編譯需要N小時,並且產生上G的數據
編譯之后產生的目錄結構如下面文件里所述:
上面這是敘述的android系統的編譯,即從Google開放的源碼到大家用的system.img的過程。
目前Google是開放Android源碼的,那個編完之后出的就是最原始的所謂無Sense版……
另外,前面也提到了zImage,那是Linux內核,是運行的底層。
(大家刷完機后用ES之類的看一下根目錄下就會發現除了system.img中的文件,還多了很多其他在system鏡像中沒有的東西。)
在zImage的編譯中同樣需要注意配置。
上面的Android編譯完了生成有相關目錄和鏡像,然后再由其進行打包(或創建鏡像盤寫入)而得到system.img或bin或ext2等
其實上面描述的都是基本的方法,這些方法是通用的,也就是說並未量身定做。
所以,單純的按上面編譯,可由代碼變成刷機需要的原始文件(即zImage和前面樓層所講的Android ROM的目錄結構)
但是,注定會出這樣那樣的問題,甚至無法運行(卡死或反復重啟)。問題何在?就在於配置。
至於如何配置,那就是需要摸索了,這也是為什么編譯出問題的地方(重點在那些so文件容易出問題,在lib下)
而由於zImage是整體的(單個文件),所以一出問題就意味着整體替換
經常遇到ROM出各種各樣的問題,比如不能用照相機。