当前位置:  编程技术>移动开发
本页文章导读:
    ▪andorid系统配置及编译历程        andorid系统配置及编译过程android系统正以迅雷不及掩耳之势冲击着智能手机与平板电脑市场,它颠覆了传统手机的概念,将手机与平板电脑进行了一次大洗牌,最可贵的是他的开放性(虽不是.........
    ▪ 怎么安装XCODE离线帮助        如何安装XCODE离线帮助非常讨厌XCODE的在线帮助,因为我的网络很一般,打开很慢,甚至是打不开. 为什么不能像VS那样,直接可以下载帮助安装呢? 我想肯定会有的,查了下,果然: XCODE->Preferences->.........
    ▪ fl2440的U-boot-2010.09移栽(七)LCD的支持       fl2440的U-boot-2010.09移植(七)LCD的支持一、LCD时序配置      fl2440开发板的LCD是3.5寸屏型号是WXCAT35-TG3#001,这是一款320x240分辨率的TFT LCD屏,先来了解一下TFT LCD的时序如下: 图1 TFT LCD时序 .........

[1]andorid系统配置及编译历程
    来源: 互联网  发布时间: 2014-02-18
andorid系统配置及编译过程
android系统正以迅雷不及掩耳之势冲击着智能手机与平板电脑市场,它颠覆了传统手机的概念,将手机与平板电脑进行了一次大洗牌,最可贵的是他的开放性(虽不是完全开放)吸引了一大批工程师去改造它,完善它,任何人都可以下载到它的源代码一睹它的真面目。这一节讲讲这样从头配置一个属于你的android系统,至于如何获取android源代码这里就不讲了。本文是在假设你已经从android官网上获取了其源代码的基础上讲解的。

1.Create a company directory in //vendor/.
   mkdir vendor/<company_name>

   这一步是先在vendor(供货商) 下新建一个目录,用你公司名字命名,没有的公司的就随便编一个吧(:

2.Create a products directory beneath the company directory you created in step 1.
   mkdir vendor/<company_name>/products/

   同上,创建一个目录,用你产品的名字命名吧

3.Create a product-specific makefile, called vendor/<company_name>/products/<first_product_name>.mk, that includes    at least the following code:
   $(call inherit-product, $(SRC_TARGET_DIR)/product/generic.mk)
   #
   # Overrides
   PRODUCT_NAME := <first_product_name>
   PRODUCT_DEVICE := <board_name>


 在/products/ 目录下建立一个mk文件,内容格式如上所示,拿个mini6410.mk的例子给大家看看:

 

 $(call inherit-product, $(SRC_TARGET_DIR)/product/generic.mk)

 # Overrides
 PRODUCT_MANUFACTURER := FriendlyARM
 PRODUCT_BRAND := FriendlyARM
 PRODUCT_NAME := mini6410
 PRODUCT_DEVICE := mini6410

 ***************************************************

 mini6410.mk的路径为/Android-2.2/vendor/friendly-arm/products/mini6410.mk l;这也验证了上述1,2两步。


 4.在上述*.mk文件中添加可选的定义,这个就不多说了。

 5.In the products directory, create an AndroidProducts.mk file that point to (and is responsible for finding) the          individual product make files.
#
# 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 /

 按照这个模板添加就是了。

6.Create a board-specific directory beneath your company directory that matches the PRODUCT_DEVICE variable <board_name> referenced in the product-specific make file above. This will include a make file that gets accessed by any product using this board.
mkdir vendor/<company_name>/<board_name>


 在你公司的目录下添加一个目录,名字命名为板子的名字,如:Android-2.2/vendor/friendly-arm/mini6410,其中mini6410就是开发板的名字,这个目录下的文件比较重要。接下来为了好叙述,就借用mini6410的例子吧。

 7.在Android-2.2/vendor/friendly-arm/mini6410目录下创建BoardConfig.mk文件

    先看看这个文件的内容是怎样的: 

   

[cpp] view plaincopyprint?
  • # config.mk   
  • #   
  • # Product-specific compile-time definitions.   
  • #   
  •   
  • # The generic product target doesn't have any hardware-specific pieces.   
  • TARGET_CPU_ABI := armeabi  
  • TARGET_NO_BOOTLOADER := true  
  • TARGET_NO_KERNEL := true  
  • TARGET_PROVIDES_INIT_RC := true  
  •   
  • # Customized map   
  • TARGET_PRELINKER_MAP := vendor/friendly-arm/products/prelink-linux-arm-FA.map  
  •   
  • # Hardware 3D   
  • TARGET_HARDWARE_3D := false  
  •   
  • # Audio   
  • BOARD_USES_ALSA_AUDIO := true  
  • BUILD_WITH_ALSA_UTILS := true  
  •   
  • # Camera   
  • BOARD_CAMERA_LIBRARIES := libcamera  
  • BOARD_S3CJPEG_LIBRARIES := libs3cjpeg  
  •   
  • # Wi-Fi   
  • BOARD_HAVE_LIBWIFI := true  
  • #BOARD_WPA_SUPPLICANT_DRIVER := WEXT   
  • BOARD_WPA_SUPPLICANT_DRIVER := CUSTOM  
  • #CONFIG_DRIVER_NL80211 := true   
  • WPA_BUILD_SUPPLICANT := true  
  • #WPA_SUPPLICANT_VERSION := VER_0_6_X   
  • CONFIG_CTRL_IFACE := y  
  •   
  • # Bluetooth   
  • BOARD_HAVE_BLUETOOTH := true  
  •   
  • # GPS   
  • BOARD_GPS_LIBRARIES :=libgps  
  •    BoardConfig.mk文件是干嘛的呢,从上面的例子代码中你也许能猜出来,BoardConfig.mk是用来定制你的设备具有什么功能的,比如说是否支持摄像头,GPS导航等一些板级定制。该文件是我们定制android系统中比较重要的一个文件。

    8.修改系统属性。

       该项不是必须的,但大部分情况下我们深度定制系统时都要修改系统属性。

       如何修改呢,在/Android-2.2/vendor/friendly-arm/mini6410/下创建一个system.prop文件,内如如下所示:

       # system.prop for 
       # This overrides settings in the products/generic/system.prop file
       #
       # rild.libpath=/system/lib/libreference-ril.so
       #  rild.libargs=-d /dev/ttyS0
     9.在/Android-2.2/vendor/friendly-arm/products添加AndroidProducts.mk文件,该文件下可包含多个board_name.mk文件,即多个设备。代码如下所示:

       PRODUCT_MAKEFILES := /
       $(LOCAL_DIR)/first_product_name.mk /
       $(LOCAL_DIR)/second_product_name.mk

     10.在/Android-2.2/vendor/friendly-arm/mini6410下添加Android.mk文件,该文件至少包含以下内容:

    [cpp] view plaincopyprint?
  • # 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/<company_name>/<board_name>  
  •  #   
  •  include $(CLEAR_VARS)  
  •  #   
  •  # include more board specific stuff here? Such as Audio parameters.        

  •  到此为止,初步定制基本完成,该配置部分的架构如下图所示:

     

    Android以模块的形式来组织各个系统中的部件,Eng专业点的词汇就是Module,就是各位在几乎每个目录下都能看到的Android.mk。可以简单地把Android所有的Make文件分为4种:
          1、For config
          这类文件主要来配置product,board,以及根据你的Host和Target选择相应的工具以及设定相应的通用编译选项:
          build/core/config.mk         summary of config
          build/core/envsetup.mk    generate dir config and so on
          build/target/product         product config
          build/target/board            board config
          build/core/combo              build flags config 
          这里解释下这里的board和product。borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮点运算等等。product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪个product中,哪些APK在当前product中是不提供的。
          config.mk是一个总括性的东西,它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块,比如说 BUILT_PREBUILT就定义了如何来编译预编译模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。
          2、 Module Compile
          这类文件主要定义了如何来处理Module的Android.mk,以及采用何种方式来生成目标模块,这些模块生成规则都定义在config.mk里面,我们可以看看:
          CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
          BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
          BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
          BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
          BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
          BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
          BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
          BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
          BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
          BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
          BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
          BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
          BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
          BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
          BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
          BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
          BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
          BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
          BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk
          除了CLEAR_VARS是清楚本地变量之外,其他所有的都对应了一种模块的生成规则,每一个本地模块最后都会include其中的一种来生成目标模块。大部分上面的.mk都会包含base_rules.mk,这是对模块进行处理的基础文件,建议要写本地模块的都去看看,看明白了为什么 Android.mk要这么写就会大致明白了。
          3、Local Module
          本地模块的Makefile文件就是我们在Android里面几乎上随处可见的Android.mk。Android进行编译的时候会通过下面的函数来遍历所有子目录中的Android.mk,一旦找到就不会再往层子目录继续寻找(所有你的模块定义的顶层Android.mk必须包含自己定义的子目录中的Android.mk)。
          subdir_makefiles += /
              $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
           不同类型的本地模块具有不同的语法,但基本上是相通的,只有个别变量的不同,如何添加模块在前面的帖子已经说过了,大家可以参考。
           Android通过LOCAL_MODULE_TAGS来决定哪些本地模块会不会编译进系统,通过PRODUCT和LOCAL_MODULE_TAGS来决定哪些应用包会编译进系统,如果用户不指定LOCAL_MODULE_TAGS,默认它的值是user。此外用户可以通过buildspec.mk来指定你需要编译进系统的模块。
           用户也可以通过mm来编译指定模块,或者通过make clean-module_name来删除指定模块。
           4、Package 
           这主要指的是build/core/Makefile这个文件,它定义了生成各种img的方式,包括ramdisk.img   userdata.img  system.img  update.zip  recover.img等。我们可以看看这些img都是如何生成的,对应着我们常用的几个make goals:

    在实际的过程中,我们也可以自己编辑out目录下的生成文件,然后手工打包相应生成相应的img,最常用的是加入一些需要集成进的prebuilt file。
           
           所有的Makefile都通过build/core/main.mk这个文件组织在一起,它定义了一个默认goals:droid,当我们在TOP目录下敲Make实际上就等同于我们执行make droid。当Make include所有的文件,完成对所有make我文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。

           基本上Android building system就是以这样一种方式组织在一起的了,下面说一点闲散的东西。首先是如何来加快Android的编译过程,因为每次Android都要遍历所有的Android.mk,不管是编译整个工程还是只编译某个模块。所以可以将遍历的结果保存下来,下次直接从文件读就好了,但是这里容易出错,所以一定要确认是否正确包含了所有的.mk,当新加入文件的时候确认将原来保存的文件删除。下面是我写的加快编译的一个makefile,将下面的语句替换掉 main.mk中的相应部分就可以了:
           FROM:
           subdir_makefiles += /
               $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
           TO:
           ifneq ($(ONE_SHOT_MAKEFILE),)
           else
           ifneq ($(CASH_MK),true)
           subdir_makefiles += /
               $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
          else
         subdir-makefiles-cash := $(shell cat build/subdir_mk_cash)
         ifeq ($(subdir-makefiles-cash),)
         $(warning No .mk cash ,create now !)
         subdir_makefiles += /
               $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
         mk-to-file := $(shell echo $(subdir_makefiles) > build/subdir_mk_cash) 
         else
        $(warning Using cash mk !)
        subdir_makefiles := $(shell cat build/subdir_mk_cash)
        endif
        endif
        endif
           通过CASH_MK=true来打开快速编译的功能,因为没有对错误进行检测的操作,所以使用的时候一定要特别小心。

           最后一个是扩展SDK API的问题,Android可以编译出自己的SDK,并扩展相应的SDK API,现在没有仔细的研究,只了解一个粗暴的方法就是在frameworks/base/core/java中添加相应的类。


        
    [2] 怎么安装XCODE离线帮助
        来源: 互联网  发布时间: 2014-02-18
    如何安装XCODE离线帮助

    非常讨厌XCODE的在线帮助,因为我的网络很一般,打开很慢,甚至是打不开.

    为什么不能像VS那样,直接可以下载帮助安装呢?

    我想肯定会有的,查了下,果然:

    XCODE->Preferences->Downloads->Documents

    兴致勃勃的点了install........

    N分钟后,进度条动了下.........

    这样是受不了的

    要用迅雷下载,直接安装 

    选择你要下载的文档,点下下方的按钮


    看到类似下方的内容

    http://developer.apple.com/rss/com.apple.adc.documentation.AppleiPhone5_0.atom
    就是文档的URL,OK放到SAFARI中打开


    复制最新这个链接到迅雷里就可以下载了


    下载完成后把文件复制到

    /Developer/Documentation/DocSets

    在终端里用下面命令解压和修改所有者

    sudo xar –xf  com.apple.adc.documentation.AppleiOS5_0.iOSLibrary

    sudo chown -R -P devdocs com.apple.adc.documentation.AppleiOS5_0.iOSLibrary.docset

    OK,再打开XCODE,看到这个文档已经安装好了,没有INSTALL的提示了



        
    [3] fl2440的U-boot-2010.09移栽(七)LCD的支持
        来源: 互联网  发布时间: 2014-02-18
    fl2440的U-boot-2010.09移植(七)LCD的支持

    一、LCD时序配置

         fl2440开发板的LCD是3.5寸屏型号是WXCAT35-TG3#001,这是一款320x240分辨率的TFT LCD屏,先来了解一下TFT LCD的时序如下:

    图1 TFT LCD时序

    (1)VSYNC信号来一个脉冲时,表示一帧的开始

    (2) VSPW表示VSYNC信号的脉冲宽度为(VSPW+1)个HSYNC信号周期,即(VSPW+1)行,这(VSPW+1)行的数据无效。

    (3)VSYNC信号脉冲之后,还要经过(VBPD+1)个(HSYNC)信号周期,有效的行数据才出现。所以,在VSYNC信号有效之后,总共还要经过(VSPW+1+VBPD+1)个无效行,

    (4)随后连续发出(LINEVAL+1)行的有效数据

    (5)最后是(VFPD+1)个无效行,完整的一帧结束,紧接着就是下一帧的数据了(即下一个VSYNC信号)。

    (6)HSYNC信号有效时,表示一行数据的开始

    (7) HSPW表示HSYNC信号的脉冲宽度为(HSPW+1)个VCLK信号周期,即(HSPW+1)个像素,这(HSPW+1)个像素的数据无效。

    (8)HSYNC信号脉冲之后,还要经过(HBPD+1)个VCLK信号周期,有效的像素数据才会出现。所以,在HSYNC信号有效之后,总共还要经过(HSPW + 1 + HBPD + 1)个无效的像素,第一个有效像素才出现。

    (9)随后即连续发出(HOZVAL+1)个像素的有效数据。

    (10)最后是(HFPD+1)个无效的像素,完整的一行结束,紧接着就是下一行的数据了(即下一个HSYNC信号)。

    TFT LCD的正常工作主要需要配置S3C2440的寄存器LCDCON1~LCDCON5。

    二、u-boot支持LCD的配置工作

    首先要添加一个文件,driver/video/s3c2410_fb.c,其内容为:

    修改driver/video/videomodes.h文件第25行左右为:

    紧接着修改driver/video/videomodes.h第81行左右为:

    在driver/video/videomodes..c文件struct ctfb_vesa_modes vesa_modes定义中添加(第78行左右)本开发板LCD的相关配置:

    在driver/video/videomodes..c文件struct ctfb_res_modes res_mode_init定义中添加(第100行左右)本开发板LCD的相关配置:

    紧接着修改driver/video/Makefile文件,在41行后添加:

    最后,修改文件board/fl2440/fl2440.c,在文件最后添加:

    最后还需要在开发板配置文件中添加LCD屏支持的宏定义,修改文件include/configs/fl2440.h文件,在文件中添加:


    重新上电后,uboot的输出就都显示在LCD上了,我们的输入还是选择的串口输入,输入信息也都显示在LCD屏之上效果图如下:

    我把uboot的原始显示图片给替换掉了,故显示如上,图片上有些个人信息被我抹掉了。

        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    编程技术 iis7站长之家
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3