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= android@android.com' 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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值