天天看點

Android平台開發指導(Android Porting Guide)(一)

Android平台開發指導(Android Porting Guide)(一)

2011年02月24日

  沒有比這 http://www.netmite.com/android/mydroid/development /pdk/docs/index.html 更官方的android開發指導材料了,閑着無事就翻譯了。

  [b]本文為[/b][b]Android[/b][b]平台開發人員和[/b][b]Android[/b][b]裝置制造商提供了底層開發指導。如果你對[/b][b]Android[/b][b]的上層應用開發很感興趣,請通路[/b][b]Android Developers Site[/b][b]。 [/b]

  [b]關于這份指導書 [/b]

  [b]這份指導書按照邏輯劃分為幾個部分(見目錄)。在一個持續的開發過程中,[/b][b]Android[/b][b]是一個複雜的工程項目,随着版本和[/b][b]API[/b][b]的改變,這份指導書将會不斷更新。 [/b]

  [b]至使用者 [/b]

  [b]對于精通嵌入式[/b][b]Linux[/b][b]的工程師而言,這本書非常有價值。但是,它的重點并不在普通的嵌入式[/b][b]Linux[/b][b]開發,而是更多提供[/b][b]Android[/b][b]平台的特色。 [/b]

  [b]初學[/b][b]Android [/b]

  [b]對于初識[/b][b]Android[/b][b]的人而言,建議閱讀以下文檔: [/b]

  [b]Android Develop site[/b][b]:這個網頁提供了高版本的[/b][b]SDK[/b][b]文檔; [/b]

  [b]Android Open Source Project site[/b][b]:這個網頁指導你如何擷取源代碼,建立開發環境和從事簡單的工程開發。 [/b]

  [b]如果你準備在你的目标系統上定制和移植[/b][b]Android[/b][b]系統,請閱讀系統編譯概述。 [/b][b]Android[/b][b]用一個定制的編譯系統産生一系列工具,編譯檔案和文檔。這一小節概述了[/b][b]Android[/b][b]編譯系統和如何建立一個簡單的編譯環境。 [/b]

  [b]Android[/b][b]的編譯系統是以[/b][b]GNU Make[/b][b]為基礎,并且要求最新的版本(注意:[/b][b]Android[/b][b]所使用的最新的[/b][b]GNU Make[/b][b]規則可能并不會出現在[/b][b]GNU Make[/b][b]的網頁上)。在開始之前,首先通過"[/b][b]make -v"檢查下你的編譯環境的版本。如果你不是[/b][b]3.80[/b][b]或者更高版本的話,你需要更新你的[/b][b]GNU Make[/b][b]版本。 [/b]

  [b]了解[/b][b]makefile [/b]

  [b]makefile[/b][b]檔案定義了如何去建立一個系統的編譯規則。典型的[/b][b]makefile[/b][b]包含以下一些元素: [/b][b]1. 名稱:為你的編譯目标取一個名稱(LOCAL_MODULE := )[/b][b]; [/b]

  [b]2. 局部變量:用[/b][b]CLEAR_VARS清除[/b][b]局部變量[/b][b]([/b][b]include $ (CLESR_VARS)); [/b]

  [b]3. 所需要編譯的檔案:注明你的目标需要連結哪些源檔案(LOCAL_SRC_FILES := main.c); [/b]

  [b]4. 标記:編譯選項(LOCAL_MODULE_TAGS := eng development)[/b][b]; [/b]

  [b]5. 庫:定義你的目标所需要連結的庫檔案(LOCAL_SHARED_LIBRARIES := cutils); [/b]

  [b]6. 模闆檔案:所包含的這些模闆檔案定義了生成目标的類型,同時包含了生成此種目标的編譯工具(include $(BUILD_EXECUTABLE))。 [/b]

  [b]下面一段代碼舉例說明一個典型的[/b][b]makefile[/b][b]: [/b]LOCAL_PATH := $(my-dir) include $(CLEAR_VARS) LOCAL_MODULE := LOCAL_SRC_FILES := main.c LOCAL_MODULE_TAGS := eng development LOCAL_SHARED_LIBRARIES := cutils include $(BUILD_EXECUTABLE) (HOST_)EXECUTABLE,(HOST_)JAVA_LIBRARY,(HOST_)PREBU ILT, (HOST_)SHARED_LIBRARY,(HOST_)STATIC_LIBRARY,PACKAG E,JAVADOC, RAW_EXECUTABLE, RAW_STATIC_LIBRARY,COPY_HEADERS, KEY_CHAR_MAP

  [b]為了提高代碼的可讀性,上面這段代碼中包含了一些的書寫風格。 [/b]

  [b]Layers [/b]

  [b]下表描述了編譯系統所包含的抽象層。 [/b]

  [b]每一個抽象層都是以一對多的關系和上面一層相關。例如,一種處理器架構可以運作在很多種目标闆上,而每一個目标闆又有很多裝置。你可以在給定的抽象層上定義一個元素作為同一層元素的一個特例,這樣就避免了複制和簡化了維護。 [/b][b]Layer [/b][b]Example [/b][b]Description [/b][b]Product [/b][b]myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk [/b][b]産品層定義了一個産品的詳細說明,包括編譯的子產品和配置。你可以基于一種特定的應用提供一種裝置上的幾種不同版本。例如,基于攝像技術。 [/b][b]Device [/b][b]myDevice, myDevice_eu, myDevice_eu_lite [/b][b]裝置層代表了建構在裝置上的實體層。例如,南美的可能包含[/b][b]QWERTY[/b][b]鍵盤而法國的可能包含[/b][b]AZERTY[/b][b]鍵盤。連接配接到裝置層的典型外設。 [/b][b]Board [/b][b]sardine, trout, goldfish [/b][b]開發闆層代表了一個産品的縮減版。當然你可以連接配接一些外設上去。 [/b][b]Arch [/b][b]arm (arm5te) (arm6), x86, 68k [/b][b]架構層描述了你目标系統的處理器架構 [/b][b]編譯[/b][b]Android[/b][b]系統 [/b]

  [b]這部分說明如何編譯預設的[/b][b]Android[/b][b]版本。一旦你熟悉了普通的編譯過程,你就可以嘗試着編譯一個能運作在你自己的裝置上的[/b][b]Android[/b][b]系統。 [/b]

  [b]裝置編碼 [/b]

  [b]為了做一個普通[/b][b]Android[/b][b]編譯過程,源碼中[/b][b]build/envsetup.sh[/b][b]中包含了一些環境變量和函數定義。例如: [/b][b]為了一個工程調試編譯,你也可以用[/b][b]eng[/b][b]取代[/b][b]user [/b]

  [b]這些編譯變量随着調試選項和安裝包的不同而不同。 [/b]

  [b] [/b][b]清除編譯結果 [/b]

  [b]通過執行"m clean"來清除你剛編譯産生的目标檔案。也可以通過"m clobber"來删除所有目标編譯的輸出檔案,也就相當于将整個[/b][b]/out[/b][b]目錄删除。 [/b]

  [b] [/b][b]加速重新編譯 [/b]

  [b]每一個目标系統的編譯輸出檔案都放在[/b][b]/out[/b][b]目錄下,每一次編譯都會快速的選擇目标而不需要重新編譯所有源碼。 [/b]

  [b]但是如果編譯系統沒有将改動告訴環境變量或[/b][b]makefile[/b][b],我們就有必要清除以往的編譯結果。如果這種情況經常發生,你就需要定義一個環境變量: [/b]

  [b]%make j4 PRODUCT-generic-eng [/b]

  [b] [/b][b]這樣做是為了迫使編譯系統使用[/b][b]ccache[/b][b]編譯器,它能減少源碼的重複編譯。 [/b]

  [b]ccache[/b][b]編譯器源碼已經提供([/b][b]/prebuilt[/b][b]),不需要再次安裝。 [/b]

  [b] [/b][b]問題定位 [/b]

  [b]下面的錯誤很可能是由于[/b][b]JAVA[/b][b]版本過低所導緻的: [/b]% export USE_CCACHE=1 device Dex: core UNEXPECTED TOP-LEVEL ERROR: java.lang.NoSuchMethodError: method java.util.Arrays.hashCode with signature ([Ljava.lang.Object;)I was not found. at com.google.util.FixedSizeList.hashCode(FixedSizeLi st.java:66) at com.google.rop.code.Rop.hashCode(Rop.java:245) at java.util.HashMap.hash(libgcj.so.7) [b]Dx[/b][b]是一個[/b][b]Java[/b][b]工具,首次出現在[/b][b]java1.5[/b][b]版本中。通過[/b][b]"java -version'檢查你的[/b][b]java[/b][b]版本。 [/b][b]如果你有[/b][b]java1.5[/b][b]或者更高版本,你還會遇到這樣的錯誤,檢查你的[/b][b]PATH[/b][b]變量。 [/b]

  [b] [/b][b]編譯[/b][b]Android[/b][b]的核心 [/b]

  [b]這部分介紹如何編譯[/b][b]Android[/b][b]預設的核心。一旦你熟悉了普通的[/b][b]Android[/b][b]核心編譯,你就可以嘗試着去配置你自己的[/b][b]Android[/b][b]驅動。 [/b]

  [b]為了編譯核心,選擇裝置目錄([/b][b]/home/joe/android/device[/b][b]),建立環境變量并且運作: [/b]% . envsetup.sh % partner_setup generic [b]然後選擇核心目錄[/b][b]/home/joe/android/kernel. [/b]

  [b] [/b][b]下載下傳分支 [/b]

  [b]預設的代碼分支是[/b][b]Android[/b][b]。為了下載下傳不同的分支代碼,執行: [/b]

  [b]% git checkout --track -b android-mydevice origin/android-mydevice //Branch android-mydevice set up to track remote branch % refs/remotes/origin/android-mydevice. //Switched to a new branch "android-mydevice" [/b]

  [b]為了簡化代碼的管理,讓你的分支名字和它的主幹名字相同。通過執行"git checkout "來選擇下載下傳的代碼分支。 [/b]

  [b]分支鑒定 [/b]

  [b]要找出哪一個代碼分支存在和哪一個代碼分支是可用(标有[/b][b]asterisk[/b][b]),執行: [/b]% git branch -a android * android-mydevice origin/HEAD origin/android origin/android-mydevice origin/android-mychipset [b]編譯核心 [/b]

  [b]執行: [/b]

  [b]% make j4[/b][b] [/b]

  [b] [/b][b] 編譯選項 [/b]

  [b]當我們需要針對目标系統編譯時,我們希望在最終版本中如果有幾種不同編譯選項的鏡像。下面有幾個編譯選項: [/b][b]eng [/b][b]This is the default flavor. A plain make is the same as make eng. [/b][b]Installs modules tagged with: eng, debug, user, and/or development. [/b][b]Installs non-APK modules that have no tags specified. [/b][b]Installs APKs according to the product definition files, in addition to tagged APKs. [/b][b]ro.secure=0 [/b][b]ro.debuggable=1 [/b][b]ro.kernel.android.checkjni=1 [/b][b]adb is enabled by default [/b][b]user [/b][b]make user [/b][b]This is the flavor intended to be the final release bits. [/b][b]Installs modules tagged with user. [/b][b]Installs non-APK modules that have no tags specified. [/b][b]Installs APKs according to the product definition files; tags are ignored for APK modules. [/b][b]ro.secure=1 [/b][b]ro.debuggable=0 [/b][b]adb is disabled by default. [/b][b]userdebug [/b][b]make userdebug [/b][b]The same as user, except: [/b][b]Also installs modules tagged with debug. [/b][b]ro.debuggable=1 [/b][b]adb is enabled by default. [/b][b]建立[/b][b]makefile [/b][b]如何為你的[/b][b]Android[/b][b]移動裝置建立一個[/b][b]makefile[/b][b]?步驟如下: [/b][b]1. 在[/b][b]//vendor/[/b][b]下,以産品的公司名字建立一個目錄 [/b]

  [b]2. 在公司名字目錄下再建立一個産品的目錄 [/b]

  [b]3. 建立一個産品的[/b][b]makefile[/b][b]檔案,至少包含以下代碼 [/b]

  [b]4. 将産品特性的變量添加到産品定義檔案中 [/b]

  [b]5. 在[/b][b]/products/[/b][b]目錄下,建立一個[/b][b]AndroidProducts.mk[/b][b]檔案,用于連結個别産品的[/b][b]makefile[/b][b]檔案 [/b]mkdir vendor/ mkdir vendor//products/ $(call inherit-product, $(SRC_TARGET_DIR)/product/generic.mk) # # Overrides PRODUCT_NAME := PRODUCT_DEVICE := [b]6. 在公司目錄下在建立一個目标闆的目錄,這個目錄下的[/b][b]makefile[/b][b]檔案可以被運作在目标闆的任何一個産品通路到: [/b]

  [b]7. 在目标闆目錄下建立一個[/b][b]BoardConfig.mk[/b][b]檔案: [/b][b] [/b][b] # This file should set PRODUCT_MAKEFILES to a list of product makefiles # to expose to the build system. LOCAL_DIR will already be set to # the directory containing this file. # # This file may not rely on the value of any variable other than # LOCAL_DIR; do not use any conditionals, and do not look up the # value of any variable that isn't set in this file or in a file that # it includes. PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/first_product_name.mk \[/b][b] [/b][b]8. 如果你想改進系統屬性,在[/b][b][/b][b]目錄下建立一個[/b][b]system.prop[/b][b]檔案: [/b]

  [b]9. 在[/b][b]products/AndroidProducts.mk[/b][b]中聲明[/b][b].mk [/b]

  [b]10. 一個[/b][b]Anroid.mk[/b][b]檔案([/b][b]/vendor//[/b][b])必須包含以下代碼[/b][b]: [/b][b]11. 對于同一個目标闆的第二個産品,建立第二個[/b][b]makefile[/b][b]檔案 [/b][b]vendor /companyname/product/.mk[/b][b]: [/b][b]PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/first_product_name.mk \ $(LOCAL_DIR)/second_product_name.mk # make file for new hardware from LOCAL_PATH := $(call my-dir) # this is here to use the pre-built kernel ifeq ($(TARGET_PREBUILT_KERNEL),) TARGET_PREBUILT_KERNEL := $(LOCAL_PATH)/kernel endif file := $(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// include $(CLEAR_VARS) # include more board specific stuff here? Such as Audio parameters. [/b][b] [/b][b]現在,你就有了兩個産品,[/b][b]and[/b][b]。為了驗證一個新的産品是否被成功配置,執行: [/b]

  [b] [/b][b]編譯後,你就會發現産生了一個新的目錄[/b][b]/out/target/product/[/b][b]。 [/b]

  [b]新産品的檔案結構樹 [/b]

  [b]在完成了上述步驟之後,在你的系統上你會看到如下目錄: [/b]

  [b]||-- |-- Android.mk poduct_config.mk system.prop |-- AndroidProducts.mk .mk .mk[/b][b] [/b]

  [b] [/b][b]産品變量定義檔案 [/b]

  [b]産品的屬性變量就定義在産品變量定義檔案中。一個産品的變量定義檔案可以從其他産品繼承,這樣就可以減少不必要的複制和易于代碼維護。 [/b][b]Parameter [/b][b]Description [/b][b]Example [/b][b]PRODUCT_NAME [/b][b]End-user-visible name for the overall product. Appears in the "About the phone" info [/b][b]PRODUCT_MODEL [/b][b]End-user-visible name for the end product [/b][b]PRODUCT_LOCALS [/b][b]A space-separated list of two-letter language code, two-letter country code pairs that describe several settings for the user, such as the UI language and time, date and currency formatting. The first locale listed in PRODUCT_LOCALES is is used if the locale has never been set before. [/b][b]en_GB de_DE es_ES fr_CA [/b][b]PRODUCT_PACKAGES [/b][b]Lists the APKs to install. [/b][b]Calendar Contacts [/b][b]PRODUCT_DEVICE [/b][b]Name of the industrial design [/b][b]dream [/b][b]PRODUCT_MANUFACTUER [/b][b]Name of the manufacturer [/b][b]acme [/b][b]PRODUCT_BRAND [/b][b]The brand (e.g., carrier) the software is customized for, if any [/b][b]PRODUCT_PROPERTY_OVERRIDES [/b][b]List of property assignments in the format "key=value" [/b][b]PRODUCT_COPY_FILES [/b][b]List of words like [/b][b]source_path:destination_path[/b][b]. The file at the source path should be copied to the destination path when building this product. The rules for the copy steps are defined in config/Makefile [/b][b]PRODUCT_OTA_PUBLIC_KEYS [/b][b]List of OTA public keys for the product [/b][b]PRODUCT_POLICY [/b][b]Indicate which policy this product should use [/b][b]PRODUCT_PACKAGE_OVERLAYS [/b][b]Indicate whether to use default resources or add any product specific overlays [/b][b]vendor/acme/overlay [/b][b]PRODUCT_CONTRIBUTORS_FILE [/b][b]HTML file containing the contributors to the project. [/b][b]PRODUCT_TAGS [/b][b]list of space-separated words for a given productb [/b][b]下面舉例說明一個典型的産品變量定義檔案: [/b]

  [b]Android[/b][b]編譯手冊提供簡單的執行個體代碼幫助你很快的建立一些普通的編譯任務。 [/b]

  [b]編譯一個簡單的[/b][b]APK[/b][b]檔案 [/b]

  [b]編譯一個依賴[/b][b].jar[/b][b]庫的[/b][b]APK[/b][b]檔案 [/b]

  [b]$(call inherit-product, build/target/product/generic.mk) #Overrides PRODUCT_NAME := MyDevice PRODUCT_MANUFACTURER := acme PRODUCT_BRAND := acme_us PRODUCT_LOCALES := en_GB es_ES fr_FR PRODUCT_PACKAGE_OVERLAYS := vendor/acme/overlay [/b]

  [b]編譯一個需要平台密鑰檔案簽名的[/b][b]APK[/b][b]檔案 [/b][b]編譯一個需要定制代碼密鑰檔案簽名的[/b][b]APK[/b][b]檔案 [/b]

  [b]LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # List of static libraries to include in the package LOCAL_STATIC_JAVA_LIBRARIES := static-library # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage # Tell it to build an APK include $(BUILD_PACKAGE)[/b][b] [/b]

  [b]增加一個預編譯的[/b][b]APK[/b][b]檔案 [/b][b]增加一個靜态的[/b][b]JAVA[/b][b]庫 [/b][b]Android.mk[/b][b]變量 [/b][b]下面是一些[/b][b]Android.mk[/b][b]檔案中常見的變量,按字母順序羅列。首先,注意變量的命名[/b][b]: [/b]

  [b]LOCAL_-[/b][b]這些變量被設定為單獨的每個子產品。以[/b][b]"include $(CLEAR_VARS)"為界限,可以通過它清空其他[/b][b]LOCAL_[/b][b]的聲明。大多數子產品中的變量都是[/b][b]LOCAL_[/b][b]變量; [/b]

  [b]PRIVATE_-[/b][b]這些變量用來編譯特定目标代碼。即他們僅用在子產品的指令當中。也意味着它不可能作用于定義在目前子產品後面的子產品; [/b]

  [b]HOST_[/b][b]和[/b][b]TARGET_-[/b][b]:這些變量包含對[/b][b]HOST[/b][b]和[/b][b]TARGET[/b][b]的說明和定義。在你的[/b][b]makefile[/b][b]檔案中不要使用[/b][b]HOST_[/b][b]和[/b][b]TARGET_[/b][b]; [/b]

  [b]BUILD_[/b][b]和[/b][b]CLEAR_VARS-[/b][b]這些變量包含了模闆[/b][b]makefile[/b][b]的名字。 [/b]

  [b]其它的名字你都可以任意使用在你自己的[/b][b]makefile[/b][b]檔案中。但是,記住這是一個非遞歸的編譯系統,很可能你的變量會被其它的[/b][b]Android.mk[/b][b]修改,導緻你使用的時候它變得不同了。 [/b]

  [b](表格見[/b][b]http://source.android.com/porting/build_cookbook.h tml[/b][b]) [/b][b]介紹 [/b][b]Android[/b][b]平台要求每個應用程式有密鑰檔案簽名以擷取系統權限,這樣應用程式就可以獲得共享的使用者[/b][b]ID[/b][b]或者運作在系統程序當中。[/b][b]Android[/b][b]平台使用四種密鑰檔案來維護系統的安全性: [/b]

  [b].Platform[/b][b]:關于[/b][b]package[/b][b]的平台密鑰檔案; [/b]

  [b].Shard[/b][b]:能分享[/b][b]/home/contacts[/b][b]程序的密鑰檔案; [/b]

  [b].Media[/b][b]:關于[/b][b]media/download[/b][b]中包的密鑰檔案; [/b]

  [b].Releasekey[/b][b]:除上面之外的預設的密鑰檔案。 [/b]

  [b]這些密鑰檔案為發行的[/b][b]Image[/b][b]檔案中的應用擷取數字簽名,他們并不是編譯所需要的。編譯系統使用測試密鑰檔案([/b][b]build/target/product/security/[/b][b])進行數字簽名。這個測試密鑰檔案是标準的[/b][b]Android[/b][b]平台的一部分,是以不會被其他平台産品和裝置所使用。相應的,裝置制造商們會提供他們裝置的産品密鑰檔案。 [/b]

  [b]建立一個密鑰檔案 [/b]

  [b]裝置制造商的産品密鑰檔案應該放在[/b][b]/vendor//security/[/b][b]下面。為了建立一個簡單的密鑰檔案,複制這個目錄下的[/b][b]mkkey.sh[/b][b]的腳本。為了定制你自己的密鑰檔案,修改[/b][b]AUTH[/b][b]這一行,更正你公司的資訊: [/b][b]mkkey.sh[/b][b]是一個産生密鑰檔案的腳本。注意:你輸入的密碼在你的終端上是可見的。另外,這些密碼是用于數字簽名的。 [/b]

  [b]為了産生四種密鑰檔案,需要運作[/b][b]mkkey.sh[/b][b]四次: [/b]

  [b]LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Any libraries that this library depends on LOCAL_JAVA_LIBRARIES := android.test.runner # The name of the jar file to create LOCAL_MODULE := sample # Build a static jar file. include $(BUILD_STATIC_JAVA_LIBRARY) [/b]

  [b]這樣你就有了自己的産品密鑰檔案。 [/b]

  [b]數字簽名 [/b]

  [b]數字簽名包含兩個步驟: [/b][b]1. 為需要編譯的每個部分進行數字簽名; [/b]

  [b]2. 簽名好後放回[/b][b]Image[/b][b]檔案中。 [/b][b]應用程式數字簽名 [/b]

  [b]用[/b][b]build/tools/releasetools/sign_target_files_apks[/b][b]對[/b][b]target_file[/b][b]進行數字簽名。預設情況下[/b][b]target_files[/b][b]不會編譯的,是以當你編譯是需要明确[/b][b]"dist": [/b]

  [b]這條指令在[/b][b]out/dist[/b][b]目錄下建立一個檔案[/b][b]-target_files.zip[/b][b]。這就是腳本[/b][b]sign_target_files_apks[/b][b]所需要的檔案。 [/b]

  [b]如果在編譯過程中,有些[/b][b]apk[/b][b]你不想重新簽名,你就要在你的指令行中為增加[/b][b]"-e Foo.apk="。 [/b]

  [b]Sign_target_files_apks[/b][b]有許多其他的指令選項,可以[/b][b]-h[/b][b]檢視。 [/b]

  [b]建立[/b][b]Image[/b][b]檔案 [/b]

  [b]一旦你有了[/b][b]signed-target-files.zip,[/b][b]就可以通過下面指令放到[/b][b]image[/b][b]中: [/b]

  [b]Sign-img.zip[/b][b]包含了所有的[/b][b]image[/b][b]檔案。 [/b]

  [b]啟動畫面定制 [/b]

  [b]在裝置啟動過程中,[/b][b]Android[/b][b]會顯示一幅圖檔。如果你希望更改預設的圖檔: [/b][b]#!/bin/sh AUTH='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress= [email protected]' if [ "$1" == "" ]; then echo "Create a test certificate key." echo "Usage: $0 NAME" echo "Will generate NAME.pk8 and NAME.x509.pem" echo " $AUTH" exit fi openssl genrsa -3 -out $1.pem 2048 openssl req -new -x509 -key $1.pem -out $1.x509.pem -days 10000 \ -subj "$AUTH" echo "Please enter the password for this key:" openssl pkcs8 -in $1.pem -topk8 -outform DER -out $1.pk8 -passout stdin [/b][b]網絡定制平台 [/b]

  [b] [/b][b]網絡配置 [/b]

  [b]Android[/b][b]的網絡配置資訊作為一種資源被編譯到目标檔案中。它的[/b][b]xml[/b][b]檔案在[/b][b]//android/framework/base/core/res/res/xml/apns.xml[/b][b]。這個檔案中不包括[/b][b]APNS[/b][b]配置。一般不需要修改,但是在編譯的過程中你需要配置[/b][b]APNs[/b][b]。 [/b]

  [b]編譯時[/b][b]APN[/b][b]的配置 [/b]

  [b]為一個産品配置[/b][b]APN[/b][b],你需要增加一個[/b][b]apns-conf.xml[/b][b](不需要修改系統預設的[/b][b]APNs[/b][b])。這樣就可以讓不同的産品擁有不同的[/b][b]APNs[/b][b]配置。 [/b]

  [b]為了在産品層次上配置[/b][b]APNs[/b][b],在[/b][b]vendor//products/ myphone-us.mk: [/b]

  [b]系統運作時[/b][b]APN[/b][b]配置 [/b]

  [b]系統運作時,[/b][b]Android[/b][b]從[/b][b]system/etc/apns-conf.xml[/b][b]中讀取配置。 [/b]

  [b]Android[/b][b]提供下面幾種運作時的網絡配置: [/b]

  [b]自動配置:系統啟動時,[/b][b]Android[/b][b]從[/b][b]SIM[/b][b]卡的[/b][b]MCC[/b][b]和[/b][b]MNC[/b][b]中擷取的網絡配置信心并且自動完成所有配置。 [/b]

  [b]手動配置:[/b][b]Android[/b][b]平台也支援運作時使用者手動配置。 [/b]

  [b]WAP/SMS[/b][b]配置[/b][b]:[/b][b]網絡配置是标準的[/b][b]Android[/b][b]資源。你可以通過安裝一個新的系統資源[/b][b]APK[/b][b]包來更新網絡配置。也可以通過添加一項服務,這項服務可以為[/b][b]SMS[/b][b](包含網絡配置資訊)監聽[/b][b]SMS[/b][b]端口。[/b][b] [/b]

  [b]定制預加載的應用程式 [/b]

  [b]為産品定制應用程式開發包(包括[/b][b]application[/b][b],[/b][b]inputmethods[/b][b],[/b][b]providers[/b][b],[/b][b]services[/b][b]等),需要在産品配置([/b][b]product configuration[/b][b])中設定[/b][b]PRODUCT_PACKAGES[/b][b]: [/b]

  [b]sh mkkey.sh platform # enter password sh mkkey.sh media # enter password sh mkkey.sh shared # enter password sh mkkey.sh release # enter password [/b]

  [b]程式包名應該和[/b][b]Android.mk[/b][b]中[/b][b]LOCAL_PACKAGE_NAME[/b][b]名字對應。 [/b]

  [b] [/b][b]例如:某個[/b][b]Android.mk[/b][b]檔案: [/b][b]注意:主螢幕([/b][b]Launcher.apk[/b][b])僅僅是一個[/b][b]Android[/b][b]的應用程式,可以通過修改源代碼的方式定制自己的[/b][b]HomeScreen[/b][b]。 [/b]

  [b]定制浏覽器書簽 [/b]

  [b]浏覽器書簽存儲在[/b][b]Brower[/b][b]應用程式的[/b][b]string[/b][b]資源當中:[/b][b]//android/packages/ apps/Brower/res/values/strings.xml[/b][b]。書簽被定義為一個簡單的字元串數組([/b][b]bookmarks[/b][b]),第一部分代表他的書簽名,第二部分代表他的[/b][b]URL[/b][b]: [/b][b]Android[/b][b]在平台配置的基礎上交替下載下傳[/b][b]Like[/b][b]和應用程式資源。為了給一個特定的移動網絡配置書簽,請将你的[/b][b]strings.xml[/b][b]放在[/b][b]Mobile Network Code[/b][b]的資源檔案夾下面。例如,[/b][b]Brower/res/values-mccXXX-mncYYY/strings.xml,[/b][b]其中[/b][b]XXX[/b][b]和[/b][b]YYY[/b][b]就代表[/b][b]MCC[/b][b]和[/b][b]MNC[/b][b]的值。 [/b]

  [b]EmailProvider[/b][b]定制 [/b]

  [b]預設的[/b][b]email Provider[/b][b]設定存儲在[/b][b]//android/packages/apps/Email/res/xml/ providers.xml: [/b][b]Android[/b][b]會在平台配置的基礎上交替加載所有的應用程式資源。給一個特定的移動網絡配置[/b][b]email Provider[/b][b],你需要見[/b][b]provider.xml[/b][b]放在[/b][b]Mobile Network Code[/b][b]的資源檔案下。例如,[/b][b]Email/res/xml-mccXXX-mnxYYY/providers.xml[/b][b]。 [/b]

  [b] 平台主題 [/b]

  [b]平台主題和風格在[/b][b]//android/framework/base/core/res/res/values/style s.xml[/b][b]中。 [/b]

  [b]動畫 [/b]

  [b]Android[/b][b]提供了一些視窗和視圖變換的動畫。系統的動畫放在: [/b]

  [b]//android/framework/base/core/res/res/anim[/b][b]中。 [/b]