2012-03-21 19:34:54 jmq_0000 阅读数 14631
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17819 人正在学习 去看看 高煥堂
Android 设备驱动(下)

           MTD 驱动

                Flash 驱动通常使用 MTD (memory technology device ),内存技术设备。

                MTD 的字符设备:

                /dev/mtdX

                       主设备号 90.

                MTD 的块设备:

                /dev/block/mtdblockX

                        主设备号 13.

                MTD 驱动源码

                        drivers/mtd/mtdcore.c:MTD核心,定义MTD原始设备

                        drivers/mtd/mtdchar.c:MTD字符设备

                        drivers/mtd/mtdblock.c:MTD块设备

                 MTD 结构图

                



           MTD 驱动程序是 Linux 下专门为嵌入式环境开发的新一类驱动程序。Linux 下的 MTD 驱动程序接口被划分为用户模块和硬件模块:

           用户模块 提供从用户空间直接使用的接口:原始字符访问、原始块访问、FTL (Flash Transition Layer)和JFS(Journaled File System)。

            硬件模块  提供内存设备的物理访问,但不直接使用它们,二十通过上述的用户模块来访问。这些模块提供了闪存上读、写和擦除等操作的实现。

     

           蓝牙驱动    

              在 Linux 中,蓝牙设备驱动是网络设备,使用网络接口。

              Android 的蓝牙协议栈使用BlueZ实现来对GAP, SDP以及RFCOMM等应用规范的支持,并获得了SIG认证。由于Bluez使用GPL授权, 所以Android 框架通过D-BUS IPC来与bluez的用户空间代码交互以避免使用未经授权的代码。             

              蓝牙协议部分头文件:
                                                   include/net/bluetooth/hci_core.h

                                                   include/net/bluetooth/bluetooth.h

                                                   蓝牙协议源代码文件:

                                                               net/bluetooth/*

                                                   蓝牙驱动程序部分的文件:

                                                                drivers/bluetooth/*

              蓝牙的驱动程序一般都通过标准的HCI控制实现。但根据硬件接口和初始化流程的不同,又存在一些差别。这类初始化动作一般是一些晶振频率,波特率等基础设置。比如CSR的芯片一般通过BCSP协议完成最初的初始化配置,再激活标准HCI控制流程。对Linux来说,一旦bluez可以使用HCI与芯片建立起通信(一般是hciattach + hciconfig),便可以利用其上的标准协议(SCO, L2CAP等),与蓝牙通信,使其正常工作了。


          WLAN 设备驱动(Wi-Fi)(比较复杂我面会专门写个wifi分析)

            在linux中,Wlan设备属于网络设备,采用网络接口。

           Wlan在用户空间采用标准的socket接口进行控制。

                     WiFi协议部分头文件:

                               include/net/wireless.h

                    WiFi协议部分源文件:

                               net/wireless/*

                    WiFi驱动程序部分:

                               drivers/net/wireless/*

          wifi模块结构图:

        

2011-08-03 17:01:35 zoe6553 阅读数 8375
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17819 人正在学习 去看看 高煥堂
       由于在这个项目中,WIFI模块是采用SDIO总线来控制的,所以先记录下CLIENT DRIVER的SDIO部分的结构,这部分的SDIO分为三层:SdioDrv、SdioAdapter、SdioBusDrv。其中SdioBusDrv是Client Driver中SDIO与WIFI模块的接口,SdioAdapter是SdioDrv和SdioBusDrv之间的适配层,SdioDrv是Client Driver中SDIO与LINUX KERNEL中的MMC SDIO的接口。这三部分只需要关注一下SdioDrv就可以了,另外两层都只是对它的封装罢了。

       在SdioDrv中提供了这几个功能:

 (1)static struct sdio_driver tiwlan_sdio_drv = {
    .probe          = tiwlan_sdio_probe,
    .remove         = tiwlan_sdio_remove,
    .name           = "sdio_tiwlan",
    .id_table       = tiwl12xx_devices,
};

 (2)int sdioDrv_EnableFunction(unsigned int uFunc)   

 (3)int sdioDrv_EnableInterrupt(unsigned int uFunc)

 (4)SDIO的读写,实际是调用了MMC\Core中的  static int mmc_io_rw_direct_host()功能。

SDIO功能部分简单了解下就可以,一般HOST部分芯片厂商都会做好。我的主要任务还是WIFI模块。

       首先从WIFI模块的入口函数wlanDrvIf_ModuleInit()看起,这里调用了wlanDrvIf_Create()。

代码主体部分:

static int wlanDrvIf_Create (void)
{
    TWlanDrvIfObj *drv; //这个结构体为代表设备,包含LINUX网络设备结构体net_device

    pDrvStaticHandle = drv;  /* save for module destroy */

    drv->pWorkQueue = create_singlethread_workqueue (TIWLAN_DRV_NAME);//创建了工作队列

    /* Setup driver network interface. */
    rc = wlanDrvIf_SetupNetif (drv);  //这个函数超级重要,后面详细的看

    drv->wl_sock = netlink_kernel_create( NETLINK_USERSOCK, 0, NULL, NULL, THIS_MODULE );

    // 创建了接受wpa_supplicant的SOCKET接口

    /* Create all driver modules and link their handles */
    rc = drvMain_Create (drv,
                    &drv->tCommon.hDrvMain,
                    &drv->tCommon.hCmdHndlr,
                    &drv->tCommon.hContext,
                    &drv->tCommon.hTxDataQ,
                    &drv->tCommon.hTxMgmtQ,
                    &drv->tCommon.hTxCtrl,
                    &drv->tCommon.hTWD,
                    &drv->tCommon.hEvHandler,
                    &drv->tCommon.hCmdDispatch,
                    &drv->tCommon.hReport,
                    &drv->tCommon.hPwrState);
  
    /*
     *  Initialize interrupts (or polling mode for debug):
     */

    /* Normal mode: Interrupts (the default mode) */
    rc = hPlatform_initInterrupt (drv, (void*)wlanDrvIf_HandleInterrupt);
  
   return 0;

}

      在调用完wlanDrvIf_Create()这个函数后,实际上WIFI模块的初始化就结束了,下面分析如何初始化的。先看wlanDrvIf_SetupNetif (drv)这个函数的主体,

static int wlanDrvIf_SetupNetif (TWlanDrvIfObj *drv)
{
   struct net_device *dev;
   int res;

   /* Allocate network interface structure for the driver */
   dev = alloc_etherdev (0);//申请LINUX网络设备
   if (dev == NULL)

   /* Setup the network interface */
   ether_setup (dev);//建立网络接口 ,这两个都是LINUX网络设备驱动的标准函数

   dev->netdev_ops = &wlan_netdev_ops;

   /* Initialize Wireless Extensions interface (WEXT) */
   wlanDrvWext_Init (dev);

   res = register_netdev (dev);

   /* Setup power-management callbacks */
   hPlatform_SetupPm(wlanDrvIf_Suspend, wlanDrvIf_Resume, pDrvStaticHandle);

}

      注意,在这里初始化了wlanDrvWext_Inti(dev),这就说明wpa_supplicant与Driver直接的联系是走的WEXT这条路。也就是说event的接收,处理也应该是在WEXT部分来做的,确定这个,剩下的工作量顿减三分之一,哈哈哈。后面还注册了网络设备dev。而在wlan_netdev_ops中定义的功能如下:

static const struct net_device_ops wlan_netdev_ops = {
        .ndo_open             = wlanDrvIf_Open,
        .ndo_stop             = wlanDrvIf_Release,
        .ndo_do_ioctl         = NULL,

        .ndo_start_xmit       = wlanDrvIf_Xmit,
        .ndo_get_stats        = wlanDrvIf_NetGetStat,
        .ndo_validate_addr    = NULL,

};

功能一看名字就知道了,不说了,这几个对应的都是LINUX网络设备驱动都有的命令字,详见《LINUX设备驱动开发详解》第十六章。

      在这之后,又调用了rc =drvMain_CreateI。

      在这个函数里完成了相关模块的初始化工作。具体不说了。接下来就是等待Android上层发送来的事件了。


2014-10-29 21:12:35 kangear 阅读数 5527
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17819 人正在学习 去看看 高煥堂

内核中去掉SDCard驱动后WiFi打不开


        再描述一下问题:内核中去掉mmc0驱动配置后 使用mmc1WiFi打不开了。

                1.内核中去掉mmc0驱动配置的原因是:需要制作「SD启动」的内核(sdcard运行)

                    根据《SD Card Boot User Guide》上介绍是需要将sdcard启动配置去掉,即mmc0控制器驱动。

 

                2.WiFi IC使用的是AP6330,sdio接口,使用的mmc1控制器。我觉得它们两个除了都是使用的mmc控制器,

                    没有其它共同点了。但是问题是现在我将mmc0控制器的驱动去掉后,使用mmc1的 WiFi不能打开了.

 

                3.发现上述情况后,测试在正常启动模式下(从主存emmc flash启动),单独去掉mmc0控制器驱动,

                   也同样会出现WiFi打不开的情况。附件是Log信息。

 

        开发的时候不以松耦合开发,后续稍微变动就会引起意想不到的附带问题。比如这次,内核中去掉了Sdcard的驱动程序-rk3188mmc控制器0,结果WiFi不能打开了。

        先把问题重现了,使能MMC0时:

shell@android:/ # busybox ifconfig -a

eth0      Link encap:Ethernet  HWaddr 00:E0:4C:36:07:E8  

          inet6 addr: fe80::2e0:4cff:fe36:7e8/64 Scope:Link

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:0 (0.0 B)  TX bytes:90 (90.0 B)

 

ip6tnl0   Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  

          NOARP  MTU:1452  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:16436  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

p2p0      Link encap:Ethernet  HWaddr 9A:3B:16:5F:26:16  

          inet6 addr: fe80::983b:16ff:fe5f:2616/64 Scope:Link

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

sit0      Link encap:IPv6-in-IPv4  

          NOARP  MTU:1480  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

wlan0     Link encap:Ethernet  HWaddr 98:3B:16:5F:26:16  

          inet6 addr: fe80::9a3b:16ff:fe5f:2616/64 Scope:Link

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:374 errors:0 dropped:374 overruns:0 frame:0

          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:159439 (155.7 KiB)  TX bytes:540 (540.0 B)

 

shell@android:/ # 

禁用MMC0时:

shell@android:/ # busybox ifconfig -a     

eth0      Link encap:Ethernet  HWaddr 00:E0:4C:36:07:E8  

          inet6 addr: fe80::2e0:4cff:fe36:7e8/64 Scope:Link

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

ip6tnl0   Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  

          NOARP  MTU:1452  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:16436  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

sit0      Link encap:IPv6-in-IPv4  

          NOARP  MTU:1480  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

shell@android:/ # 

 

为什么没有了wlan0?分析硬件信息:

0.mmc0mmc1分别为SDMMC0_RK29,SDMMC1_RK29。

1.Mmc controler0 接的是 SDCARD; 

2.Mmc controler1 接的SDIO接口的WiFi(AP6330)。WiFisdio接口的。似乎有点关联了。

3.Emmc使用的时专门的emmc控制器。

 

[ 8791.469587] Current WiFi chip is AP6330.

[ 8791.507772] =======================================================

[ 8791.507825] ==== Launching Wi-Fi driver! (Powered by Rockchip) ====

[ 8791.507880] =======================================================

[ 8791.507924] RKWIFI WiFi driver (Powered by Rockchip,Ver 4.53.WFD) init.

[ 8791.508106] =========== WLAN placed in POWER ON ========

[ 8791.508202] ANDROID-ERROR) wifi_set_power = 1

[ 8791.508238] rk29sdk_wifi_power: 1

[ 8791.761800] wifi turn on power

[ 8791.761829] ANDROID-ERROR) wifi_set_carddetect = 1

[ 8791.761871] rk29sdk_wifi_set_carddetect:1

[ 8791.761897] mmc0: slot status change detected(0-1)

[ 8791.958838] 

[ 8791.958849] drivers/mmc/core/core.c...2010..  ===== mmc_rescan Begin....[mmc0]

[ 8792.003028] rk29_sdmmc_command_complete..2958...CMD55(arg=0x0), hoststate=1, errorTimes=1, errorStep=0x1e ! [sdio]

[ 8792.003652] rk29_sdmmc_command_complete..2958...CMD55(arg=0x0), hoststate=1, errorTimes=1, errorStep=0x1e ! [sdio]

[ 8792.004296] rk29_sdmmc_command_complete..2958...CMD55(arg=0x0), hoststate=1, errorTimes=1, errorStep=0x1e ! [sdio]

[ 8792.004805] rk29_sdmmc_command_complete..2958...CMD55(arg=0x0), hoststate=1, errorTimes=1, errorStep=0x1e ! [sdio]

[ 8792.005318] rk29_sdmmc_command_complete..2958...CMD1(arg=0x0), hoststate=1, errorTimes=1, errorStep=0x1e ! [sdio]

[ 8793.758830] 

 

         以上是错误信息。

        首先第一步分析关于WiFi相关的电源驱动,基于rfkill的。硬件上是通过一个GPIO管脚连接到了WL_REG_ON,使用万用表测试使能时电压正常,基本确认WiFi电源驱动没有问题。问题出在了SDIO驱动上。

 

4.反验证,enable mmc0 & disable mmc1。结果:mmc1(sdio WiFi)不可用,mmc0(SDCARD)可用。

5.推测:MMC0包含了MMC1

 

        重新查看dmsg信息,通过反复配置mmc0/mmc1发现dmsg信息中的

[ 8791.958849] drivers/mmc/core/core.c...2010..  ===== mmc_rescan Begin....[mmc0]

        无论禁用哪个mmc控制器,mmc代码中rescan到的永远都是mmc0。怀疑是平台设备中配置有误,查看了板级配置文件arch/arm/mach-rk30/devices.c后,发现没有交叉的部分。

 

        原来,内核中的mmcNum中的Num是仅仅从识别的设备上来计数的,比如我禁用了SDMMC0_RK29,那么内核中会以“mmc0”命名硬件上的「mmc1 controler」。Naobsb真是一个对内核了解的相当深入的人。所以就目前来看关于MMC控制器在内核中的名字来说逻辑并没有错,只是难以理解。那么说明问题出在了sdmmc_rescan_try_freq以下。分析之,RK在判断SDIO/SD/MMC中做了一些改动。会配MMC控制器(内核中)名字不为“mmc0”才进行判断。否则不进行判断。

 

        首先将这个逻辑反转,那么一切正常。如下:

diff --git a/kernel/drivers/mmc/core/core.c b/kernel/drivers/mmc/core/core.c

index cd85f9a..860ee00 100755

--- a/kernel/drivers/mmc/core/core.c

+++ b/kernel/drivers/mmc/core/core.c

@@ -1848,10 +1848,11 @@ static int sdmmc_rescan_try_freq(struct mmc_host *host, unsigned freq)

 //the process is default for rockchip SDK. noted by xbw at 2011-11-17

 

 /* Order's important: probe SDIO, then SD, then MMC */

-

+    printk("hi kangear into, %s\n", __func__);

 #if !defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)

-    if( strncmp( mmc_hostname(host) ,"mmc0" , strlen("mmc0")) )

+    if(!strncmp( mmc_hostname(host) ,"mmc0" , strlen("mmc0")) )

     {

+        printk("hi kangear, hostname == mmc0\n");

            //sdio_reset(host);//make no sense; noteed by xbw at 2011-12-14

        mmc_go_idle(host);

        内核中的MMC0既然不一定代表是硬件上的MMC0,那么在这里做这样的判断就是不正常的。毕竟在内核中的“mmc0”仅仅只是它第一个识别的MMC控制器而已。

 

写在最后:

        总之,问题是解决了。和以前一样,问题刚开始的时候,我就是喜欢胡思乱想。MMC0MMC1不能单独使用?现在可以给自己一个答案:凡事皆有因的。另外一点关于不可移除的设备如CPU上的MMC控制器我认为名字以hardcode的方式要比目前这种类似可以移除设备的命名规则要好很多。分析思路要比具体问题的解决方法重要。

 

更: 

        对比RKmainline上的3.0版本的内核,RK改了太多关于drivers/mmc/core/core.c这次遇到的重点就是mmc_rescan,它是来扫描和区分MMC设备的。在RK代码中将其拆分为了emmc_rescansdmmc_rescan两个函数,sdmmc_rescan中调用的sdmmc_rescan_try_freq完全是RK添加的,在mainline中根本就不存在。这里边有一个错误的逻辑就是它会去检测控制器的名字“mmc0”,如果是则不进行判断,而这个名字其实仅仅是标注内核检测到的第一个物理MMC控制器,并不一定就是物理上的MMC0,所以以至于当仅仅使用一个MMC1控制器的时候,那么物理上的MMC1就是内核中的“MMC0”,说起来有点绕,但事实就是这样的。这里有图示:

 

        就目前来看,我觉得把那个判断条件去掉是最好的解决方法。

        而另外一个判断条件USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD,它的存在更是可笑了。不过在drivers/mmc/host/Kconfig中已经被屏蔽掉了。或许是一个历史遗留问题。使用最少修改且不影响原来功能来解决问题,我最终选择切换USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD宏的逻辑。不使用这个宏时,逻辑中并没有进行「控制器名字」的判断。

 

        修改过后,完全不影响SDCARD/SDIO WIFI的使用,它们也不再相互干扰了。从SDCARD启动也没有任何问题了。

        这个问题是在10.22号被发现的,在10.30被解决。花费了89天的时间。



参考文档:

1.Linux SD/MMC/SDIO驱动分析

2018-06-28 02:37:37 HelloCLanguage 阅读数 170
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17819 人正在学习 去看看 高煥堂

一、安卓系统架构(四层架构)

1.Linux内核层:为安卓设备的各种硬件提供底层的驱动

显示驱动、音频驱动、照相机驱动、蓝牙驱动、WIFI驱动、电源管理

2.系统运行库层

C/C++库提供提醒支持,SQLite库提供数据库支持,OpenGL|ES提供3D绘图支持,Webkit库提供浏览器内核支持

3.应用框架层

构建应用程序时可能用到的各种API,安卓自带的一些核心应用就是用的这个API

4.应用层

手机上的应用程序(.apk安装后)

二、四大组件

活动Activity、服务Service、广播接收器Broadcast Receiver、内容提供器Content Provider

三、安装安卓准备工具

1.安装JDK

下载网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html


配置好jdk的环境变量后才能安装安装Android SDK

配置:https://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html

2.安装Android SDK

下载网址:https://pan.baidu.com/s/1mq3f1n5A14l6VHRU1G6PeQ

3.安装Android Studio

下载网址:http://www.android-studio.org/


安装教程:https://blog.csdn.net/u014726937/article/details/52846502

四、创建你的第一个项目

教程:https://jingyan.baidu.com/article/90bc8fc84293b8f653640c8d.html

创建之后可能存在的一些报错:

1.Android SDK没有引用成功,提示SDK Manager的报错

菜单栏->Tools->Android->SDK Manager-> Appearance & Behavior,打开后:


定位好你的Android SDK位置即可

2.NDK没有引用成功

先安装好这两个工具


看教程:https://jingyan.baidu.com/album/7f41ecec231d16593d095c03.html

3.可能存在识别不了AppCompatActivity,找不到这个类

仔细看会发现是上方import Adroid.support.v7...报错,v7找不到

菜单栏->File->Project Structure...,打开后



接着添加新的依赖库:com.android.support:appcompat-v7这个开头的



参考博客:https://blog.csdn.net/a873282620/article/details/53068392

五、项目中的各种文件


参考文章:https://blog.csdn.net/qq_28377423/article/details/72991776

manifests:

         AndroidManifest.xml:APP的配置信息

java:主要为源代码和测试代码

res:主要是资源目录,存储所有的项目资源

        drawable:存储一些xml文件,-*dpi表示存储分辨率的图片,用于适配不同的屏幕。

                           -mdpi:320x480

                           -hdpi:480x800、480x854

                           -xhdpi:至少960x720

                           -xxhdpi:1280x720

        layout:存储布局文件

        mipmap:存储原声图片资源

        values:存储app引用的一些值

                     - colors.xml:  存储了一些color的样式

                     - dimens.xml:存储了一些公用的dp值                       

                     - strings.xml: 存储了引用的string值

                     - styles.xml:   存储了app需要用到的一些样式

         Gradle Scripts:build.gradle为项目的gradle配置文件

我们可以获取到res下的一些引用

<resources>

           <string name="app_name">MProject</string>

</resources>

(1)在代码中通过R.string.app_name可以获取该字符串的引用

(2)在XML中通过@string/app_name可以获得该字符串的引用

其中string可以替换成drawable,mipmap,layout等res下的资源


六、build.gradle文件

这个文件一共有两个,一个在外层,一个在app文件夹下

1.外层的build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

repositories是仓库,jcenter()是一个代码托管仓库,我们可以在项目中轻松引用任何jcenter上的开源项目

dependencies是依赖,classpath是声明路径,后面的com.android.tools.build:gradle:2.2.0是一个Gradle插件,我们需要它来构建安卓项目

2.app文件夹下的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.0"
    defaultConfig {
        applicationId "com.movieproject.yj.mproject"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
}

com.android.application表示这是一个应用程序模块,com.android.library表示这是一个库模块,区别在于,应用程序模块是可以直接运行的,而库模块是作为代码库依附于别的应用程序模块来运行

compileSdkVersion用于指定项目的编译版

buildToolsVersion用于指定项目构建工具的版本

 defaultConfig表示基础配置

applicationId表示项目的包名,之前已经指定过包名了,如果后面想修改包名,就是这里修改

minSdkVersion表示指定项目最低兼容的Adnroid系统版本

targetSdkVersion表示你在该目标版本上已经做过了充分的测试

versionCode表示指定项目的版本号 versionName 表示指定项目的版本名,两个属性在生成安装文件的时候非常重要

 buildTypes 用于指定生成安装文件的相关配置

dependencies表示依赖库,就是前面添加v7引用的依赖库,是同一个东西

七、使用Android的Log日志工具

先要引用andriod.util.Log

里面有5个方法:

1.Log.v() 打印最为琐碎的、意义最小的日志信息(verbose)

2.Log.d()打印一些调试信息(debug)

3.Log.i()打印一些比较重要的数据(info)

4.Log.w()打印一些警告信息(warn)

5.Log.e()打印一些程序上的错误(error)

日志方法有2个参数,第一个是tag,用于对打印信息的过滤

第二个是msg,表示想要打印的具体内容

tag值的小技巧:我们在OnCreate()方法外面输入logt,然后按下tab键,这时就会以当前的类名作为值自动生成一个TAG常量

观看日志通过logcat进行查看

logcat位于AndroidStudio下面的AndroidMonitor里


2018-09-23 10:32:12 qq_34350623 阅读数 48
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17819 人正在学习 去看看 高煥堂

1.Android系统架构

linux内核层:为android的硬件提供底层的驱动,例如,音频驱动,WiFi驱动等。

系统运行库层:通过C++库为android系统提供支持。

                          

SQLite库 数据库支持
OpenGL库 3D绘图
android运行时库 提供一些核心库,使开发者可以使用JAVA语言编写android应用,包括ART

应用框架层:提供构建应用程序时使用的api。

应用层:安装在手机上的应用程序,例如,短信,开发的app等。

 

Application Framework:应用程序的框架,这个是非常的重要的,相信Framework这个词大家都应该非常的熟悉了,我们学习Android也主要学的就是这一层,我们通过这些各种各样的框架来实现我们的Application。

Android系统架构:https://www.cnblogs.com/xiaoluo501395377/p/3389411.html

android系统提供的功能:

1.组件。activity,service,broadcast receiver,content provider(内容提供器)

2.系统控件。

3.多媒体服务。

 

Android SDK:使用Android开发的API。

 

hello world项目:

主要关注app下的目录,其余为自动生成。

build:编译自动生成的文件

libs:第三方jar包

res:图片,字符串等资源

 

log日志:

http://limingcai.iteye.com/blog/1485554

 

 

 

 

 

 

 

 

Android系统架构

阅读数 614

没有更多推荐了,返回首页