Android 智能手機企業項目

原創作品:http://write.blog.csdn.net/postedit/7956383    

歡迎大家一起交流學習,知識在與分享。

希望結交一些志同道和之士 

QQ: 474530676

[email protected]



Android 智能手機企業項目


一、 安卓系統的組成
a. 應用層
b. 應用程序框架
c. 庫和運行環境
d. 內核
e. 硬件

二、 移植的主要步驟


/*************************************************************************************/
  1)安裝sun JDK
開發環境:ubuntu 12.04 32位
a. 卸載系統中的open JDK,爲了標準我們先把系統中的open JDK卸載掉,

把從網上下載的jdk-1_5_0_22-linux-i586.bin(47M)安裝下就可以了.

b. 軟件放在" /home/up6410/android/jdk-1_5_0_22-linux-i586.bin "目錄下
//    root@ubuntu-longguopeng:/home/up6410/android# ./jdk-1_5_0_22-linux-i586.bin


   一直按回車,到底輸入"yes" 安裝好後,接下來就是要對這個配置文件進行配置。
配置的路徑是/etc/profile.d/java.sh (這裏要說明的一點是java.sh要臨時創建),
裏面配置的信息是:
// root@ubuntu-longguopeng:/# gedit /etc/profile.d/java.sh       //ubuntu
// root@ubuntu-longguopeng:/# vim /etc/bashrc                    //rehl6
// root@ubuntu-longguopeng:/# sudo gedit ~/.bashrc


/*---------------------------------------------------------
//添加如下內容:
export JAVA_HOME=/home/up6410/android/jdk1.5.0_22
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
----------------------------------------------------------*/

c. 如何檢測是否安裝好jdk 在命令行輸入:java  –version
// root@ubuntu-longguopeng:/home/up6410/android# source ~/.bashrc
// root@ubuntu-longguopeng:/home/up6410/android# java -version

/*--------------------------------------------------------------------
//顯示如下:
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) Server VM (build 1.5.0_22-b03, mixed mode)


            注意:
root@longguopeng:~/桌面# java -version
root@longguopeng:~/桌面# java –version // –號錯了
Exception in thread "main" java.lang.NoClassDefFoundError: –version


---------------------------------------------------------------------*/
若看到這個則說明成功。

d. 查看環境變量修改成功與否
在命令行中輸入:
// root@ubuntu-longguopeng:/home/up6410/android# echo $JAVA_HMOE
// root@ubuntu-longguopeng:/home/up6410/android# echo $CLASSPATH  







2) 編譯android 2.2 froyo
  文件存放在:/home/up6410/android/android-2.2_froyo
  
a. 對其進行解壓:
// root@ubuntu-longguopeng:/home/up6410/android# tar –xvf android-2.2_froyo.tar.gz    
                                             //這是把這個解壓到當前目錄
b. cd 進入到這個目錄中去:                                             
// root@ubuntu-longguopeng:/home/up6410/android# cd android-2.2_froyo  


        c. 安裝各種包
//        root@ubuntu-longguopeng:/home/up6410/android# sudo aptitude install \
//          git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev \
//          build-essential zip curl libncurses5-dev zlib1g-dev


d. 編譯 
// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# source build/envsetup.sh
// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# lunch 
// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# make -j2
                                                                                 //雙核雙線程編譯
            
首次編譯非常耗時,取決於機器配置,大約需要2-3小時。
有可能會出現:“Permission denied (權限拒絕的提示)”
請命令賦予權限:$cd 無權限文件的當前目錄 回車;  $sudo chmod -R +rwx *  回車 
完成後鏡像生成在/root/mydroid/out/target/product/generic下:android源碼編譯後得到
   system.img,ramdisk.img,userdata.img映 像文件。 
            -->ramdisk.img是emulator的文件系統,
            -->system.img包括了主要的包、庫等文件,
-->userdata.img包括了一些用戶數 據,emulator加載這3個映像文件後,
  會把 system和 userdata分別加載到 ramdisk文件系統中的system和 userdata目錄下。
  
            主要一點是要把上步的那個JDK裝好後遇到的問題就比較的少,我在編譯個過程中遇到的問題也就是一些命令
            提醒說沒有安裝而已,我用apt-get install  xxx安裝下就可以了。
編譯完後再會告訴你編譯的東西出來東西在哪,而且也不會報錯,也不會報警告。
                                                                                                           








/*******************************************************************************************************/
// 第六章 編譯完成,模擬器運行Android


1)編譯完成後,模擬器的實現與運行  

a.模擬器的實現
把類文件系統目錄下out/target/product/generic/system複製到out/target/product/generic/root下面去

//         root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# 
//                     cp -rf out/target/product/generic/root/* /home/up6410/nfsroot
// cp -rf out/target/product/generic/data   /home/up6410/nfsroot
// cp -rf out/target/product/generic/system /home/up6410/nfsroot




設置環境變量
在 /etc/profile.d/java.sh最後加入那麼一句  
// root@ubuntu-longguopeng:/# vim /etc/profile.d/java.sh


/*-------------------------------------------------------------------------------------
//添加如下內容:
export JAVA_HOME=/home/up6410/android/jdk-1_5_0_22-i586.bin
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export PATH=$PATH:/home/up6410/android/android-2.2_froyo/out/host/linux-x86/bin //這裏
--------------------------------------------------------------------------------------*/


b.模擬器運行

  命令行中輸入:emulator –shell
// root@ubuntu-longguopeng:/# emulator -skin 800x600

// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo/out/target/product/generic# which emulator
ANDROID_PRODUCT_OUT='pwd'/out/target/product/generic emulator










4)實現編譯器的靜態鏈接
先下載一個軟件:arm-none-linux-gcc的軟件,先對它進行解壓後進入/bin目錄下就有這條命令(arm-none-linux-gnueabi-gcc),arm-none-linux-gnueabi-gcc –static test.c –o test,
Cp test out/target/product/generic/system/bin
Mkyaffs2image system system.img
Emulator –shell
#test   這就會出現剛纔你新建的命令中寫的東西
5)實現android自帶的編譯器
cd <android home>
. build/envsetup.sh //點後面記得要有空格
mmm <你想編譯的目錄>
在做上幾步之前要先做這步:
首先要先創建Android.mk文件,裏面填寫內容如下:
LOCAL_PATH   := $(call my-dir)
include $(BUILD_JAVA_SHARED_LIBRARY)
LOCAL_SRC_FILE := test.c
LOCAL_MODULE   := test
LOCAL_SHARED_LIBRAYR  := libc
include $(BUILD_EXECTALE)










//=========================================================================================
// 第十四章 燒寫Bootloader開發板


 編譯定製 u-boot:


第一步:
//         [root@longguopeng:/#] tar -vxf /home/up6410/src/u-boot-1.1.6.tar.bz2 
// [root@longguopeng:/#] cd /home/up6410/src/u-boot-1.1.6


第二步:
    進到u-boot-1.1.6 定製u-boot 文件
        1. 刪除不需要的文件
            留下:
                arm-config.mk
                config.mk
Makefile
MAKEALL
mkconfig

mknand  //沒有
                mkmovi  //沒有
write-sd //沒有
tags     //沒有

README
                rules.mk
                System.map
                                                            
                u-boot
                u-boot.map
                u-boot.bin
                u-boot.dis               
                u-boot.sre.c


                board //進到samsung,留下smdk6410,其他的全部刪除
common
cpu
disk
drivers
dtt
examples
fs
                include
lib-arm
lib-generic
nand-spl
                net               
                post
                rtc
                tools               
        
         2. 刪除完畢,改u-boot-1.1.6_smdk6410 下的Makefile
//         [root@longguopeng:/#] cd /home/up6410/src/u-boot-1.1.6/
//         [root@ubuntu-longguopeng:/home/up6410/src/u-boot-1.1.6#] vim Makefile
         ---------------------------------------------------------------------------
                將193行改爲 
                 193:      ARCH             := arm
  CROSS_COMPILE    := arm-linux-
                                         (記得最後面不要加空格!)
-----------------------------------------------------------------------------

// [root@longguopeng:/home/up6410/src/u-boot-1.1.6#] gedit include/configs/up6410_sd.h 


         3. 增加run 命令:
  171: CFG_CMD_RUN| \   調到  165: CFG_CMD_RUN| \
 
                ubuntu@longguopeng # set wnf .......


         4. 可以修改環境變量:
---------------------------------------------------------------------------------------------
182: #define CONFIG_BOOTARGS"root=/dev/nfs rw nfsroot=10.1.0.168:/home/up6410/nfsroot    ip=10.1.0.168:10.1.0.167:10.1.0.255:255.255.255.0:www.longguopeng.com:eth0:off                           console=ttySAC0,115200 mem=128M" 
 183: #define CONFIG_ETHADDR     00:16:41:AA:90:48 //max地址
#define CONFIG_NETMASK      255.255.255.0 
#define CONFIG_IPADDR   10.1.0.167//開發板
#define CONFIG_SERVERIP10.1.0.168   //pc機
#define CONFIG_GATEWAYIP10.1.0.255   //網關

 203:PTF-PROMPT  "ubuntu@longguopeng #"         改工作環境的顯示的名稱
---------------------------------------------------------------------------------------------
//          SD啓動
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make up6410_sd_config
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cp  u-boot.bin /home/up6410/tftpboot/
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cd /home/up6410/tftpboot/
[root@longguopeng:/home/up6410/tftpboot/#] cp u-boot.bin u-boot-sd.bin 

// NVND啓動
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make up6410_nand_config
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cp u-boot.bin /home/up6410/tftpboot/
            [root@longguopeng:/#] cd /home/up6410/tftpboot/
   [root@longguopeng:/home/up6410/tftpboot#] cp u-boot.bin u-boot-nand.bin cd 

寫u-boot到nand flash:
        uboot下操作:
ubuntu@longguopeng # nand erase 0 0x40000
ubuntu@longguopeng # tftp 0x50000000 u-boot-nand.bin
ubuntu@longguopeng # nand write 0x50000000 0 0x40000
//=====================================================================================================


第十五章 構建Android系統到S3C6410開發板


編譯內核




修改makefile
191 ARCH           ?=   arm           //平臺
      CROSS_COMPILE  ?=   ...eabi-   //交叉編譯器的前綴
     
      //android-kernel-2.6.35.tar
  [root@longguopeng android-kernel-2.6.35]# rm up6410_config* //刪除
  [root@longguopeng android-kernel-2.6.35]# cp .config android_config
  [root@longguopeng android-kernel-2.6.35]# make
 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/    
   bootm 50008000  
   
構建NFS 修改方便
    
      [root@longguopeng android-kernel-2.6.35]# vim /etc/export
 --------------------------------------------------------       
//寫入:           
/home/up6410/nfsroot  *(rw,no_root_squash)
       ---------------------------------------------------------

生成根文件系統
    
    //android-2.2_froyo.tar
    
  在這個文件裏 /home/android/android-2.2_froyo
    [root@longguopeng /]# mkdir /home/android/nfsroot
    [root@longguopeng/]# cd /home/android-2.2_froyo/out/target/product/generic/
   
 拷貝文件
     [root@longguopeng generic]# cp -rf root/* /home/android/nfsroot
      [root@longguopeng generic]# cp -rf system /home/android/nfsroot
      [root@longguopeng generic]# cp -rf data /home/android/nfsroot
      
   下載內核
      將編譯好的內核拷貝到tftpboot
      [root@longguopeng android-kernel-2.6.35]# cp arch/arm/boot/zImage  /tftpboot
      
   啓動uboot (在uboot下)
      longguopeng @ # bootm   
      
      出現企俄說明內核沒有問題
      filesystem could mount  //沒有文件系統 死機強行啓動  
     
     
     內核啓動出現的問題
     ======================================================================
      Freeing init memory: 164k
      
       
      kernel panic - not syncing: no init fount..... 
      //                 同步
      // 默認啓動在 [root@longguopeng nfsroot]# /sbin/init
      //                                        /etc/inittab 其他的
                                                /init.rc  安卓的
     ======================================================================  
      
      在uboot下設置
            
      setenv bootargs  console=ttySAC0 root=/dev/nfs root=/dev/nfs rw nfsroot=10.1.0.168:/home/up6410/nfsroot ip=10.1.0.167:10.1.0.168:10.1.0.1:255.255.255.0:www.longguopeng.com:eth0:off  init=/init  
                       //開發板不顯示文字                                     ( 添加init進程)
      重啓ip
      bootm 50008000
      
     
      在 [root@longguopeng nfsroot]# rm -f int.rc
      
      //android_patch.tar 
         [root@longguopeng nfsroot]# cp /home/android_patch/init.rc ./
         
         比較區別 
         [root@longguopeng nfsroot]# vimdiff init.rc /home/android-2.2_froyo/out/target/product/generic/root/init.rc
     
     
      重新啓動內核  第一次啓動比較久 ,要寫數據
      
      # test
      #
      #
      #     


/**************************************************************************************************/






第十六章 視頻驅動觸摸屏部分


 // 在文件夾 android-2.2_froyo.tar


   LCD 分辨率 480 272 
 原始座標
     -->公式 
        -->lcd 新的座標
   
  現在比較常用的是: tslib  它是一個庫
                        -->在 android_patch/tslib_android/
vim Android.mk
  配置 
   ./configure
 
  vim Android.mk
------------------------------------------------------- 
 去掉這行LOCAL_PRELINK_MODULE=false
  
     /system/lib/ts/plugins/input.so
    
    //打開應用程序動態庫
     dlopen("input.so")
     順序執行編譯
   LOCAL_PATH:= $(call my-dir) //只能編譯一次
   
   名字
   TSLIB PLUGINDIR := /system/lib/ts/plugins
   
   //存放路徑 
   LOCAL_MODULE :=ts/plugins/input


  編譯多個使用
    include $(CLEAR_VARS) //開始
    .......
    .......
    .......
    include $(BUILD_SHARED_LIBRARY) //結束
--------------------------------------------------------
 
 
[root@longguopeng android-2.2_froyo]# . build/envsetup.sh


[root@longguopeng android-2.2_froyo]# mmm /android/android_patch/tslib_android  //編譯


//拷貝文件系統
[root@longguopeng android-2.2_froyo]# cp -rf out/target/product/generic/system /home/up6410/android/nfsroot  




啓動minicom
                     
  
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/   
// android觸摸屏的校正


啓動起來後點擊下屏卻沒有反應,我這個開發板用的是tft電阻屏,雖然在內核中有觸摸屏驅動,
但是沒校正屏幕的驅動,依然無法使用,linux中有一款開源的軟件軟件,名字是tslib,能夠爲觸摸
屏驅動獲得的採樣提供諸如濾波、去抖、校準等功能,通常作爲觸摸屏驅動的適配層,爲上層的應用提供了一個統一的接口。


步驟爲:
首先先要從網上下載一個tslib的軟件,對其進行解壓。
tar –xvf xxx.tar.gz2(這是解壓到當前文件夾)。
解壓完之後進入到目錄中:cd xxx/,
用編輯器vim打開裏面的一個叫Android.mk文件,在他的第幾行處加入這麼一行,保存退出。
執行 ./configure,在回到<android home>目錄中,把剛纔解壓出來的目錄編譯進android內核中去,執行命令:
. bulid/envsetup.sh
mmm <你所執行文件的目錄>
先把/nfsroot中的system刪除,在從文件系統中的system複製到刪的位置。
先把<kernel home>/driver/input/touchscreen/s3c2410.c中的第幾行註解掉
接着就把開發板和pc機連接起來,把android啓動起來,啓動後再android shell中輸入ts_calibrate,
你會發現會報說沒有ts.conf這個文件,接下來我們就來講下怎樣得到這個文件。


執行完後再接着做這個步驟:
cp tslib/etc/ts.conf  /nfsroot/system/etc  -rf 
這個文件複製完後在執行ts_calibrate這條命令時就不會保錯了,在開發板上會出現要你校屏的界面
你就用手或其他對屏進行校正,校正完後參數保存在 system/etc/pointercal下,在把這個參數複製到
<kernel home>/driver/input/touchscreen/s3c2410.c下,把
剛纔註解掉的參數中這邊新複製過來的替換掉。(這裏要重新編譯內核,這要記得不然是沒效的)。






   讀取設備 
   目錄 frameworks/base/libs/ui/EventHub.cpp
       -----------------------------------------------------------------------
    opend device
讀取函數int EventHub::read_notify(int nfd)
       ------------------------------------------------------------------------       
   //JAVA代碼 
    目錄 frameworks/base/services/java/com/android/server/InputDevice.java
       --------------------------------------------------------------

//self
         783:final int pointtercal[]={
     -11996, 12, 40642976, -6, -11296,31608176, 65536
     };  // 從 /work/android/nfsroot/system/etc/pointercal 獲取的
      
       generateAbsMotion() 


    -------------------------------------------------
    編譯
     [root@longguopeng android-2.2_froyo]# mmm frameworks/base/services/java/   //從這裏開始編譯
     [root@longguopeng android-2.2_froyo]# cp out/target/product/generic/system/framework/services.jar /android/nfsroot/system/framework


   啓動內核
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
   在內核裏 矯正: 比較常用
   drivers/input/touchscreen/s3c2410_ts.c


  input_report_key(ts.input, BIN_TOUCH, 0)
  input_report_abs(ts.input, ABS_PRESSURE, 0)










24課 android 燒寫到nandflash


查看大小
du -sh
128M


磁盤鏡像
只支持yaffs文件系統


編譯 busybox  --》終端命令不夠用
在up6410裏


在busybox裏 make menuconfig




先將文件系統 nfsroot拷到/home/up6410/nfsroot
root@longguopeng:/home/up6410/#  cp nfsroot  android_nfsroot
root@longguopeng:/home/up6410/#  mv android_nfsroot nfsroot/


進入nfs文件系統裏運行:
# /busybox mount -t yaffs2 /dev/block/mtdblock3 /mnt/  
# /busybox cp nfsroot/ mnt/ -rf  












鏈接到bosybox
拷貝到


0
1
2
代表


地址代表什麼


掛載


/busybox cp -rf


錯誤怎麼會是??


重啓一下


拔掉網線--


********************************************
19課




u-boot的啓動過程


分兩個階段:
1.a.硬件初始化
 b.爲加載bootloader的第二階段準備RAM空間。


要準備的東西有:彙編指令手冊,uboot代碼詳細分析,書,makefile手冊。


彙編指令:


  mrs:這條指令的意思是用來讀取psr(cpsr,spsr)中的數據讀到Rn中。
  str:把寄存器的值放到內存中
  ldr:把內存中的值加載到寄存器中




reset:
      mrs r0,cpsr        //這段代碼的意思是把cpu的模式改爲管理員模式
      bic r0,r0,#0x1f
      orr r0,r0,#0xd3
      msr cpsr,r0       //把r0中的值讀回cpsr中















































第十五章 構建Android nfs文件系統到開發板






11)、內核的編譯
Tar –xvf  xxx.tar.gz2
Cd xxx
在makefile中改下編譯工具的路徑,然後就可以開始編譯了。在命令行輸入make –j4
編譯完就可以了。編譯完後把編譯出來的zImage複製到/tftproot下就行了。現在還差個android系統,之前在前面我們已將把它編譯完成了。
12)、android系統的構建
<android home>/out/target/product/generic/下的root、data、
System組成一個nfsroot文件夾,操作演示如下:
cp –rf <android >/out/target/product/generic/root/* /nfsroot/
cp –rf <android >/out/target/product/generic/system /nfsroot/
cp –rf < android >/out/target/product/generic/data/ /nfsroot/
/nfsroot/這個就是類似linux中的文件系統,這個就是安卓系統。
 
在電腦與開發板之間連線和設置開發板的環境,開發板的主要環境還是先裝下minicom 這個軟件和tftp、nfs服務等,裝好這些之後就可以開始下載了。
13)、android 系統的下載
先在命令行中輸入minicom –s,設置端口參數,這裏就不在多說了。在這之前要把arm板與pc電腦相連接好,進入了u-boot界面後,就要開始設置一些環境參數了。開發板的IP,電腦的IP,gatewayip,bootargs等,如下所示:
setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=2.2.2.254:/nfsroot ip=2.2.2.20
setenv serviceip=2.2.2.254
setenv ip=2.2.2.20
下載過程:
tftp 50008000 zImage bootm 50008000
在u-boot界面下輸入這兩條命令後就行了,系統就能啓動起來了,要記得在這個期間,串口線和網線不能段,應爲我們只是把內核和文件系統放到arm板的內存中去運行的還沒保存到硬盤(nandflash)中,所以在運行中數據在通信是不能斷開的,而且斷電後又要重新燒寫。
14)、android觸摸屏的校正
啓動起來後點擊下屏卻沒有反應,我這個開發板用的是tft電阻屏,雖然在內核中有觸摸屏驅動,但是沒校正屏幕的驅動,依然無法使用,linux中有一款開源的軟件軟件,能夠爲觸摸屏驅動獲得的採樣提供諸如濾波、去抖、校準等功能,通常作爲觸摸屏驅動的適配層,爲上層的應用提供了一個統一的接口。












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章