android开发流程说明

一、android的编译

1. 源码包 bsp包   -->  1. u-boot  2. zImage   3. android源码  (还有参考开发板)
2. 我们需要定制我们自己需要的功能,就只需要移植(camera、lcd屏、触摸屏等)
3. android源码中的文件类型JDK(c、c++、java、python脚本),安装各种工具。JDK、c、c++的编译工具autmake、python

4. 编译过程
    a uboot编译之后得到u-boot.bin
        1 @vim Makefile
            CROSS_COMPILE = /opt/toolchain/toolchain-4.3.2-farsight/bin/arm-none-linux-gnueabi-


        2 选择一个开发板:
            @make distclean
            @make fs210_nand_config

        3 编译:
                @make -j2

    b 内核编译之后得到zImage/uImage (可能执行方式不一样)
        1 @vim Makefile
            ARCH            ?= arm
            CROSS_COMPILE   ?= /opt/toolchain/toolchain-4.5.1-farsight/bin/arm-none-linux-gnueabi-

        2 选择一个平台
            @cp config_for_FS210_Android_v1.0  .config   (config_for_FS210_Android_v1.0就是一个 .config)

        3 @make menuconfig  //建议

        4 @make uImage -j2

    c android源码编译编译之后得到rootfs(@help1 初始化环境
            @source ./build/envsetup.sh  (执行该脚本的意思)
        2 选择一个产品
            @lunch full_fs210-eng
                //full :完整编译android自带的app, 输入法, 语言等
                //fs210: 表示一个产品
                //eng(另外user/userdebug): 该系统给工程师开发---调试,需要权限,调试工具

        3 编译
            @make -j2 

5.  制作根文件系统:out/target/product/fs210/
    a 复制需要的文件   
        @cp -raf out/target/product/fs210/root/*   rootfs/                               */
        @cp -raf out/target/product/fs210/data/  rootfs/
        @cp -raf out/target/product/fs210/system rootfs/

    b 真正制作根文件系统:
        @vi fs210_build.sh   //修改为以下内容
            80         chmod -R 777 rootfs_dir/system/vendor

        @./fs210_build.sh   
        //在out/target/product/fs210/rootfs_dir   <--  最终用到根文件系统

    c 根文件系统目录:
            data :用户的数据,系统的配置文件         

            sbin
            dev 
            proc  
            sys

            init   //    第一个init进程:  set bootargs  init= /init
            init.rc // 启动脚本:相当/etc/inittab和/etc/init.d/rcS (祖先进程需要fork哪些进程是由它决定)
            init.fs210.usb.rc 
            init.fs210.rc     
            init.goldfish.rc       

            ueventd.fs210.rc     
            ueventd.rc  //用于自动创建设备节点  /sys/class/xxx/.../uevent (mdev -s)
            ueventd.goldfish.rc

            default.prop   //属性文件 property         
            system 
                |
                app: 自带的应用apk,在开机的时候会自动的安装

                bin  
                xbin
                etc
                lib
                usr 

                build.prop  //属性文件 property
                fonts : 字体库
                framework   : framework层的运行代码, java代码的二进制文件,开机执行
                media :开机时候启动声音,动画
                tts  :语言字体标准包
                vendor  :产生提供的二进制代码

        说明:所有编译出来的文件都在 android4.0-xxx/out/target  目录

6 运行android系统:  (@ 表示ubuntu命令,#表示开发命令)
    a. 复制需要的文件
        @cp u-boot.bin /tftpboot
        @cp arch/arm/boot/uImage /tftpboot
        @cp -raf out/target/product/fs210/rootfs_dir /opt

    b. u-boot烧录
        #tftp 0x40008000 u-boot.bin
        #nand erase 0x0 0x100000
        #nand write 0x40008000 0x0 0x100000

    c. tftp下载内核
        #set serverip 192.168.1.3
        #set ipaddr 192.168.1.10
        #set bootcmd tftp 0x40008000 uImage \; bootm 0x40008000

    d. 通过nfs挂载:
        @sudo vim /etc/exports  //添加如下内容
            /opt/rootfs_dir            *(subtree_check,rw,no_root_squash,async)

        @sudo service nfs-kernel-server restart

    e. 配置板子环境变量
        #set bootargs console=ttySAC0,115200 init=/init root=/dev/nfs nfsroot=192.168.7.5:/opt/rootfs_dir ip=192.168.7.7

7. 如果没有lcd屏,使它显示在PC上:
    a 目录 E:\1 学习资料\嵌入式2016\12_安卓底层移植\android底层系统开发\各种问题的解决方式\vnc_ok-解决没有lcd屏
        拷贝androidvncserver  --> /opt/rootfs_dir
        #./拷贝androidvncserver

    b PC上启动VNC-Viewer-5.0.3-Windows-32bit.exe
        VNC Server:192.168.7.7:5901(板子ip+执行androidvncserver的端口号)        

8. 脚本:
    a `ls`都表示一个命令,
    b ‘ls’都表示字符串,
    c "who@VALUE" 表示字符串和变量值
    d @AA 引用变量AA的值
    e x = 1,c = $x  引用x的值,c=1;
    f c = $(pwm) c 表示当前路径,pwm表示命令
    g $? 上一条命令的返回值
    h if[! -r 1] -r表示可读,-w可写,-x可执行,-d是一个目录,-f是一个文件
======================================================================================

二、android 应用开发 --c语言   (android所有的c代码都要封装为动态库.so)
注:目录说明:
    a 系统自带  ==>编译到根文件的/system/目录
        应用层:
            apk: ~/android-4.0/packages/apps   ==>eclipse + JDK + ADT
    b 根文件系统(room)
        framework层:
            framework(JAVA): ~/android-4.0/frameworks/   ==> actinty 
        虚拟机层:
            虚拟机DVM : ~/android-4.0/dalvik    ==>是一个可执行程序(C++)
        c库层:
            c库: ~/android-4.0/bionic/     ==>标准库,线程库等(glibc->linux)
            外部库的移植: ~/android-4.0/external/    ==>webkit、数据库(sqlite)
    c 内核层: 

    d test.c文件编译为可执行程序是为了调试用,最后会封装到HAL层

1. 编写代码     
    a 必须在android源码中编写--src_210/android4.0-fs210_v2
    b @vi hello.c
        #include <stdio.h>
        #include <stdlib.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>


        int main(int argc, char *argv)
        {
                int fd = open("/dev/input/event0", O_RDWR);
                if(fd < 0)
                {
                        perror("open");
                        exit(1);
                }

                printf("hello android world\n");

                return 0;

        }

2. 编译代码
    a 交叉工具链:  ~/android-4.0/prebult/linux-x86/toolchain/arm-linux-androiddeabi-4.4.x
    b Android.mk(Makefile):  将c代码编译为可执行代码
        1 技巧:抄模板 hardware/ril/rild/Android.mk
        2 编译规则
            目标:依赖
            编译方法
        3 实现        
            #1获取当前路径
                LOCAL_PATH:= $(call my-dir)
            #2清空以LOCAL_XX的变量,除了LOCAL_PATH
                include $(CLEAR_VARS)
            #3在任何情况都会编译
                LOCAL_MODULE_TAGS := optional
            #4依赖--指定源码
                LOCAL_SRC_FILES:= \
                        hello.c
            #5目标--指定目标文件名
                LOCAL_MODULE:= hello
            #6编译规则---编译成可执行程序
                include $(BUILD_EXECUTABLE)
    c @mmm mytest/c_test/ 编译该文件内的rild.c文件

3. 运行代码
    cp  -raf out/target/product/fs210/system/bin/hello_elf_arm  /opt/rootfs_dir

    root@android:/ # ./hello_elf_arm
        hello android world

4. 调试代码 ---logcat

    a. 创建文件并给定默认权限脚本文件
        uevent.rc
        uevent.xxx.rc

    b. 加载驱动文件
        init.rc

    c. android.mk
        将 c/c++ 文件编译为 *.elf  *.so  *.a
        将 java 文件编译为 apk  class  *.jar

    d. 调试信息
        a java 代码
            final string TAG="huazai"
            log.d(TAG,"123");

        b c/c++
            //添加头文件
            #define LOG_TAG "LED_JNI_LOG"
            #include <utils/Log.h>

            LOGD("huazai");(相当 printf("huazai");)

    e. 调试命令 logcat
        有4个缓冲区 main、system、redio(无线通信)、 events(通知)

        $ logcat    //默认打印 main和system缓冲区的信息
        $ logcat -b main    //可以选择打印某个缓冲区
        $ logcat -c   //清除缓冲区
        $ logcat -s "123"    //自定义查看

    f. 查看内核的调试信息
        $ dmesg

======================================================================================

三、android驱动过程

    解决:
     a. android使用的toolbox命令集,使用不方便
        答: 使用busybox进行替代
     b. 每次开机的时候都会手动去启动androidvncserver(图形界面如:qt)
        答: 开机就执行

1. ubuntu 的启动过程
    IROM --> IRAM --> nand flash -> DDR --> 内核 --> 挂载根文件下的各个目录

2. Android启动流程–学会使用init.rc (相当linux 的/etc/inittab,/etc/init.d/rcS,/etc/fstab) 
    a init.rc的语法(参考 system/core/init/readme.txt)
      主要关注:action  、  service

    b action是一个命令的 集合
        Actions take the form of:
        on <trigger>   //当某个时间执行以下命令
           <command>
           <command>

    c service表示一个后台服务:
        service <name> <pathname> [ <argument> ]*
           <option>
           <option>

        例子:
        class_start core
        class_start main  //批量启动(在service中有添加 class main的)

            service zygote /system/bin/app_process -Xzygote 
                                    /system/bin --zygote --start-system-server
                class main    //  将多个服务归类,统一的批量的去启动
                socket zygote stream 666   //   /dev/socket/zygote
                onrestart write /sys/android_power/request_state wake
                onrestart write /sys/power/state on
                onrestart restart media
                onrestart restart netd

    d 提供busybox的命令:
        1 编译busybox 后将sbin、bin拷贝到 -C /opt/rootfs_dir/system/busybox
        2 替换shell
          $ vim init.rc
            438 #service console /system/bin/sh
                service console /system/busybox/bin/ash
                console
                disabled
                group log
        3 设置path
            17 export PATH system/busybox/bin:/system/busybox/sbin:/sbin:/vendor/bin:\
                           /system/sbin:/system/bin:/system/xbin

    e 开机的就直接启动androidvncserver
          $ mv androidvncserver  system/bin/
          $ vim init.rc
            service vncserver   /system/bin/androidvncserver
                class main
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值