基于android2.3.5系统:开天辟地Android启动机制[三]

Android2.3.5系统编译环境的搭建与Android系统源代码情景分析例子 1. 下载Android2.3.5及期kernel 以下是参考资料: https://blog.csdn.net/hty1053240123/article/details/78333007 android2.2-8.0百度网盘 https://pan.baidu.com/s/1eRNFNLw 密码:wthp Android2.3.5版本下载 https://download.csdn.net/... 阅读详情

***************************************************************************************************************************
作者:EasyWave                                                                                 时间:2012.08.01

类别:Android系统源码分析                                                              声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

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

         在我的博文基于goldfish和android2.3.5学习之:开天辟地Android启动机制[二]中,部分的介绍了uevent事件机制,这篇博文将更深入的详细分析uevent的机制以及如何android是如何透过内核传递过来的数据通过uevent机制检测设备的hotplug事件。同时也分析到了andorid_ids,还是先把get_android_id()函数拿出来分析一下吧,代码如下:

static int get_android_id(const char *id)
{
    unsigned int i;
    for (i = 0; i < ARRAY_SIZE(android_ids); i++) //查找android_ids表格
        if (!strcmp(id, android_ids[i].name)) //比较android_ids中的name
            return android_ids[i].aid; //返回andorid_ids表格中的aid
    return 0;
}

而andorid_ids是在android_filesystem_config.h文件中,具体的位置在andorid2.3.5/system/core/include/private中。具体的代码如下:

struct android_id_info {
    const char *name;
    unsigned aid;
};
static const struct android_id_info android_ids[] = {
    { "root",      AID_ROOT, },
    { "system",    AID_SYSTEM, },
    { "radio",     AID_RADIO, },
    { "bluetooth", AID_BLUETOOTH, },
    { "graphics",  AID_GRAPHICS, },
    { "input",     AID_INPUT, },
    { "audio",     AID_AUDIO, },
    { "camera",    AID_CAMERA, },
    { "log",       AID_LOG, },
    { "compass",   AID_COMPASS, },
    { "mount",     AID_MOUNT, },
    { "wifi",      AID_WIFI, },
    { "dhcp",      AID_DHCP, },
    { "adb",       AID_ADB, },
    { "install",   AID_INSTALL, },
    { "media",     AID_MEDIA, },
    { "nfc",       AID_NFC, },
    { "shell",     AID_SHELL, },
    { "cache",     AID_CACHE, },
    { "diag",      AID_DIAG, },
    { "net_bt_admin", AID_NET_BT_ADMIN, },
    { "net_bt",    AID_NET_BT, },
    { "sdcard_rw", AID_SDCARD_RW, },
    { "vpn",       AID_VPN, },
    { "keystore",  AID_KEYSTORE, },
    { "usb",       AID_USB, },
    { "gps",       AID_GPS, },
    { "inet",      AID_INET, },
    { "net_raw",   AID_NET_RAW, },
    { "net_admin", AID_NET_ADMIN, },
    { "misc",      AID_MISC, },
    { "nobody",    AID_NOBODY, },
};
#define android_id_count \
    (sizeof(android_ids) / sizeof(android_ids[0]))  
宏定义如下代码:

/* This is the master Users and Groups config for the platform.
** DO NOT EVER RENUMBER.
*/

#define AID_ROOT             0  /* traditional unix root user */

#define AID_SYSTEM        1000  /* system server */

#define AID_RADIO         1001  /* telephony subsystem, RIL */
#define AID_BLUETOOTH     1002  /* bluetooth subsystem */
#define AID_GRAPHICS      1003  /* graphics devices */
#define AID_INPUT         1004  /* input devices */
#define AID_AUDIO         1005  /* audio devices */
#define AID_CAMERA        1006  /* camera devices */
#define AID_LOG           1007  /* log devices */
#define AID_COMPASS       1008  /* compass device */
#define AID_MOUNT         1009  /* mountd socket */
#define AID_WIFI          1010  /* wifi subsystem */
#define AID_ADB           1011  /* android debug bridge (adbd) */
#define AID_INSTALL       1012  /* group for installing packages */
#define AID_MEDIA         1013  /* mediaserver process */
#define AID_DHCP          1014  /* dhcp client */
#define AID_SDCARD_RW     1015  /* external storage write access */
#define AID_VPN           1016  /* vpn system */
#define AID_KEYSTORE      1017  /* keystore subsystem */
#define AID_USB           1018  /* USB devices */
#define AID_GPS           1021  /* GPS daemon */
#define AID_UNUSED1       1022  /* deprecated, DO NOT USE */
#define AID_RFU1          1023  /* RFU */
#define AID_RFU2          1024  /* RFU */
#define AID_NFC           1025  /* nfc subsystem */

#define AID_SHELL         2000  /* adb and debug shell user */
#define AID_CACHE         2001  /* cache access */
#define AID_DIAG          2002  /* access to diagnostic resources */

/* The 3000 series are intended for use as supplemental group id's only.
 * They indicate special Android capabilities that the kernel is aware of. */
#define AID_NET_BT_ADMIN  3001  /* bluetooth: create any socket */
#define AID_NET_BT        3002  /* bluetooth: create sco, rfcomm or l2cap sockets */
#define AID_INET          3003  /* can create AF_INET and AF_INET6 sockets */
#define AID_NET_RAW       3004  /* can create raw INET sockets */
#define AID_NET_ADMIN     3005  /* can configure interfaces and routing tables. */

#define AID_MISC          9998  /* access to misc storage */
#define AID_NOBODY        9999

#define AID_APP          10000 /* first app user */
上面的都是部分摘录, 如果要想看明白这些代码,你手边必须要有android2.3.5的源码,否则,这些你还是无法看明白的。还记得这个函数吗?void set_device_permission(int nargs, char **args),看我的上一篇博文。这里只摘录跟上面有关部分的代码,如下:

    ret = get_android_id(args[2]); //得到android_id定义的name,具体见:android_ids表格。
    if (ret < 0) {
        ERROR("invalid uid '%s'\n", args[2]);
        free(tmp);
        return;
    }
    uid = ret; //设置用户id
    ret = get_android_id(args[3]); //得到android_id定义的id,具体见:android_ids表格,
    if (ret < 0) {
        ERROR("invalid gid '%s'\n", args[3]);
        free(tmp);
        return;
    }
    gid = ret; //设置group的id
    add_dev_perms(name, attr, perm, uid, gid, prefix); //添加到链表中。
    以/dev/null            0666   root      root来分析吧,如何得到 uid   

ret = get_android_id(args[2]);这个是抓取前面/dev/null 中的第三项,也就是红色加粗部分,透过root匹配之后,读取到了AID_ROOT。

     以/dev/null            0666   root       root来分析吧,如何得到gid   

ret = get_android_id(args[3]);这个是抓取前面/dev/null 中的第四项,也就是蓝色加粗部分,透过root匹配之后,读取到了AID_ROOT。

     

      现在再来详细介绍ueventd_main()没有分析完的代码,源码分析继续中。当然先说明源码的位置:在Andorid2.3.5源码system/core/init.c中。详细的代码如下:

int ueventd_main(int argc, char **argv)
{
    struct pollfd ufd;
    int nr;
    char tmp[32];

    open_devnull_stdio();
    log_init();

    INFO("starting ueventd\n");

    get_hardware_name(hardware, &revision);

    ueventd_parse_config_file("/ueventd.rc");

    snprintf(tmp, sizeof(tmp), "/ueventd.%s.rc", hardware);
    ueventd_parse_config_file(tmp); ////解析ueventd.xxxxxx.rc文件,比如:goldfish为ueventd.goldfish.rc文件,具体的分析可以参考ueventd.rc

    device_init(); //初始化uevent socket,用于从Linux内核动态的抓取设备的状态变化,同时处理冷开机事件。 

    ufd.events = POLLIN; //POLLIN的意思,当内核有数据可读时,无阻塞的返回
    ufd.fd = get_device_fd(); //得到相应的从内核传过来的有数据具体文件描述符fd.

    while(1) { //循环操作
        ufd.revents = 0;
        nr = poll(&ufd, 1, -1);
        if (nr <= 0)
            continue;
        if (ufd.revents == POLLIN)
               handle_device_fd(); //处理具体的从内核传递过来的设备变化事件,像null、usb、ttyS0等等,很多吧。这是我的理解,如有不对之处还望见谅
    } //至于内核的ueventd事件,就需要去理解linux设备驱动模型了,这个会在以后专门在linux内核栏目中详细的介绍这个,因为这个驱动模型很复杂。
}

        应用程序如果需要检测设备的热插拔事件,一般会用到这个特殊的socket,在linux中就是这个NETLINK,我们可以透过这个socket中的NETLINK_KOBJ_UEVEN来检测设备的热插拔的动作。其实android的文件系统采用和busybox以及udev类似的方式。在busybox中采用的mdev来自动的抓取linux所有的设备驱动,一般是从sys目录中去抓取。自动根据驱动的名称来分配相应设备的主设备号和次设备号,以及是字符设备,还是块设备和网络设备。。如果我们能够用这个方式来理解andorid的文件系统,这样对于分析android的文件系统有很大的帮助。

        说了太多的废话了,还是先来具体看看device_init()函数吧,函数的具体位置在system/core/init/devices.c中,代码如下:

void device_init(void)
{
    suseconds_t t0, t1;
    struct stat info;
    int fd;

    device_fd = open_uevent_socket(); //建立socket,并且将进程ID和socket建立起连接
    if(device_fd < 0)
        return;

    fcntl(device_fd, F_SETFD, FD_CLOEXEC);//这两句诗设置设备文件的属性,同时强制加锁
    fcntl(device_fd, F_SETFL, O_NONBLOCK);
    //因为android系统冷启动时,会在dev/下生成一个.coldboot_done文件。所以需要检查这个文件。
    if (stat(coldboot_done, &info) < 0) { //查询coldboot_done的状态,并且存入info中,如果不成功的话,则倒计时进入冷启动。
        t0 = get_usecs(); //得到当前的时间
        coldboot("/sys/class"); 
        coldboot("/sys/block");
        coldboot("/sys/devices");
        t1 = get_usecs();
        fd = open(coldboot_done, O_WRONLY|O_CREAT, 0000);
        close(fd);
        log_event_print("coldboot %ld uS\n", ((long) (t1 - t0))); 
    } else {
        log_event_print("skipping coldboot, already done\n"); //冷启动完成
    }
}

具体的分析下open_uevent_socket()函数,这个需要重点关注下,这个可是实时的监视着内核中设备驱动的变化。因此详细的分析一下。

static int open_uevent_socket(void)
{
    struct sockaddr_nl addr;
    int sz = 64*1024; // XXX larger? udev uses 16MB!
    int on = 1;
    int s;

    memset(&addr, 0, sizeof(addr));
    addr.nl_family = AF_NETLINK; //透过AF_NETLINK与内核进行通信
    addr.nl_pid = getpid(); //得到进程PID
    addr.nl_groups = 0xffffffff; 
    //定义socket描述符,这是一个异步通信机制,SOCK_DGRAM的意思是无连接不可靠的连接
    s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); //具体的事件为NETLINK_KOBJECT_UEVENT,对于这个需要对linux的设备驱动模型需要有一定的了解
    if(s < 0) //如果失败,直接返回-1,也就是0xFFFFFF。
        return -1;

    setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)); //SO_RCVBUFFORCE是一个特殊的接收缓冲区,意思是不受接收缓冲区大小的上限限制
    setsockopt(s, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); //SO_PASSCRED的意思是:允许接收进程辅助信息发送的信用证明。

    if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { //将进程和socket联系起来。
        close(s);
        return -1; //失败的话,返回-1.
    }

    return s; //成功返回
}
   分析到了这一步之后,基本上ueventd机制基本上也差不多了。还是接上device_init()函数下部分的代码来回顾一下,部分代码如下:

    ufd.events = POLLIN; 
    ufd.fd = get_device_fd(); ///得到相应的从内核传过来的有数据具体文件描述符fd.

    while(1) {
        ufd.revents = 0; //先将实际动作的事件清零
        nr = poll(&ufd, 1, -1); //监视发生的事件
        if (nr <= 0) //如果无事件继续
            continue;
        if (ufd.revents == POLLIN) //如果监视到发生的事件,则进入具体的事件处理中,比如字符设备,块设备,还是网络设备。
               handle_device_fd(); //具体的处理事件在这个函数中。
    }
   对于ueventd的理解也许是比较困难一点,这个是因为需要对linux内核的设备驱动模型要有一定的理解,并且需要知道内核的设备驱动模式的运行机制有一定的理解。简单的讲一下,在linux内核中,只要是加载设备驱动,就会产生uevent事件。如果可以将内核的调试信息打印出来,会看到诸如此类的add@xxxxxxx 以及移除设备驱动的时候会出现remove@xxxxxxx等等信息。android内核是如何启动ueventd的呢?在init.rc中有很详细的指示。init.rc的部分代码如下:

on early-init
    start ueventd

on init

sysclktz 0

loglevel 3

# setup the global environment
    export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
    export LD_LIBRARY_PATH /vendor/lib:/system/lib
    export ANDROID_BOOTLOGO 1
    export ANDROID_ROOT /system
    export ANDROID_ASSETS /system/app
    export ANDROID_DATA /data
    export EXTERNAL_STORAGE /mnt/sdcard
    export ASEC_MOUNTPOINT /mnt/asec
    export LOOP_MOUNTPOINT /mnt/obb
         看到了 on early-init 下的start uventd的吗?对就是这个。因为init是个守护进程,也是内核启动之后,第一个要调用运行的程序。而init进程会首先去抓取init.rc文件。至于内核启动之后,为什么说init是第一个运行的程序呢。这个会在以后会专门开辟一篇博文来详细讲述这个问题。这里就不详细说了,好了关于ueventd部分。已经基本上分析完了,其实ueventd就是初始化内核中所有的设备驱动,然后透过ueventd分配好所有的设备。当然,这个是需要根据内核的具体已有的设备驱动。


         未完,Andriod源码的分析还请继续关注《基于android2.3.5学习之:开天辟地Android启动机制[四]》 。。。

 

基于android2.3.5系统:开天辟地Android启动机制[一] 在android的系统中init程序是第一个运行的程序,这是一个守护进程,而具体的代码在android2.3.5的源码中,位于system/core/init/init.c文档中,这个是main函数的入口,也是android启动机制的入口。 阅读详情

相关推荐

安卓 2.3.5 rom

安卓 索爱x8 系统 安卓 2.3.5 rom

Android基础入门教程——2.3.5.RadioButton(单选按钮)&Checkbox(复选框)

Android基础入门教程——2.3.5.RadioButton(单选按钮)&Checkbox(复选框)标签(空格分隔): Android基础入门教程本节引言: 本节给大家带来的是Andoird基本UI控件中的RadioButton和Checkbox; 先说下本节要讲解的内容是:RadioButton和Checkbox的 **1.基本用法 2.事件处理; 3.自定义点击效

Coder-Pig的猪栏 6万+

基于深度残差U-Net与多尺度注意力机制的医学图像分割系统

本文提出了一种创新的医学图像分割系统,通过融合残差连接、通道注意力机制和空间金字塔池化技术,构建了高性能的UResnet分割网络。系统采用编码器-解码器架构,创新性地引入多层次特征增强模块,显著提升了医学图像中复杂组织结构的分割精度。实验结果表明,该方案在多个医学图像数据集上均取得了优异性能,边界分割精度提升15%,训练收敛速度提升30%,同时减少20%计算量。系统为临床诊断提供了可靠的技术支持,未来可扩展至3D医学图像分割和联邦学习等方向。

Henry的博客 814

android 2.3.5 小米1s,小米手机预装的是基于Android 2.3.5深度定制的MIUI系统

来源:快科技今年是小米十周年,也是中国智能手机行业快速发展的十年。8月18日消息,小米创始人、小米集团董事长兼CEO雷军回顾小米手机一代,当时的顶级配置是1GB内存、8GB存储,而今天的小米10至尊纪念版顶级配置是16GB内存、512GB存储。雷军感叹,科技进步的速度实在是太快了。资料显示,小米手机一代发布于2011年8月16日,价格为1999元,开辟了小米1999元时代。规格方面,小米1采用4英...

weixin_29507477的博客 306

HttpClient vs OkHttpClient:哪个更适合你的Java项目?(附性能对比实测)

本文深度对比了Apache HttpClient与OkHttpClient在Java项目中的性能表现与适用场景。通过实际性能测试,OkHttp在连接复用、高并发吞吐量及内存占用方面表现更优,尤其适合现代微服务与Spring生态。HttpClient则凭借其高度可配置性,在需要精细控制HTTP协议细节的场景中更具优势。文章提供了清晰的选型指南,帮助开发者根据项目需求做出最佳决策。

onion的博客 509

EnlightenGAN训练复现记录

记录EnlightenGAN过程中的问题和解决方式。提示:以下是本篇文章正文内容,下面案例可供参考。

L_27N113E的博客 3847

Android2.3.5系统源码下载

找了半个月终于下载到完整的Android系统源码了。          据说之前是因为kernel.org被攻击。好像有人下得了,我在linux下用repo下最多也就下载了3%。感谢http://blog.csdn.net/ilittleone/article/details/6823441的无私分享。         下面是我转存整理的地址,希望下载成功的人可以分享给更多需要的人。

waterstarsx的专栏 2713

利用Civil3D装配设计器(SAC)建设高度形状自适应挡土墙

之前的模型都是点线,最后加一个形状,形成面。再根据现场测得的挡土墙的墙脚的点生成中心线(alignment),在中心线的基础上生成在现有地面(existing ground level)的高程(profile)。简单的说,该墙的墙趾啊,墙踵啊,基底下面那个把儿啊,都是随着高度变化的,而高度是随着下面这个高程图变化的。接着出现角度和Y的文本框,角度92,y 值随便写一个,然后重要的是,高程目标选路面(优先于Y值)。意思是P2的高度,也就是路面的高程,减去P10,墙脚高程,再减去墙脚埋进地里的深度0.8m。

测量老覃 的博客 1127

基于android2.3.5系统:开天辟地Android启动机制[二]

在我的博文基于goldfish和android2.3.5学习之:开天辟地Android启动机制[一]中,介绍了整个android系统的启动机制,这次将更深入的详细分析android的uevent的机制以及如何android是如何透过内核传递过来的数据通过uevent建立设备节点以及一些hotplug事件。在Andorid2.3.5源码system/core/init.c函数中ueventd_main()函数

嵌入式与人工智能天地 5118

工业视觉光源频闪控制的三种核心模式与选型实战

本文深入解析工业视觉系统中光源频闪控制的三种核心模式:光源主控、相机主控与硬同步。针对高速飞拍、缺陷检测等场景,详细对比了各模式的时序原理、硬件要求与适用场景,并提供了基于产线速度与检测需求的实战选型指南,帮助工程师有效消除运动模糊、提升成像质量与系统稳定性。

weixin_29299807的博客 435

如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数

如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 3787

基于android2.3.5系统:开天辟地Android启动机制[四]

在我的博文基于android2.3.5学习之:开天辟地Android启动机制[三]中,详细的介绍了ueventd的解析机制,在分析andriod2.3.5中的action_list、action_queue、service_list,之前,还是先来详细介绍在Andriod是如何调用内核中的一些函数,比如:chown以及chroot等等。

嵌入式与人工智能天地 2363

YOLOv8 WIOU

本文介绍了如何在YOLOv8中实现WIOU(Weighted Intersection over Union)的修改方法。主要修改了ultralytics/utils/metrics.py文件中的bbox_iou函数,新增了WIoU_Scale类,支持单调性FM v2、非单调性FM v3两种模式,并提供了动态调整的动量参数。修改后的函数支持多种IoU变体(GIoU、DIoU、CIoU等),通过数学公式实现了更精确的边界框回归损失计算,特别针对小目标检测场景进行了优化。该实现使用了PyTorch框架,包含完整

FJN110的博客 2048

Android内核学习文章

0、android系统启动 《Android系统启动流程 -- bootloader》 《The Android boot process from power on》 1、init 《深入理解android 卷1》 第3章 深入理解init 《Android框架揭秘》第3章 init进程 《Android的init过程详解(一)》 《

xin128888的专栏 1099

109. SAP ABAP 应用程序中的锁机制和工作原理介绍

SAP ABAP 系统中的锁概念,是 SAP ABAP 为了保证`数据一致性`而引入的一种保护机制。 像 SAP 这种复杂的企业级应用,系统中同一时间段的同一份数据,可能会有多个 Transaction(终端用户或者 API )同时进行读写操作。为了防止出现数据不一致,SAP ABAP 引入了锁机制。 这种锁机制并非数据库服务器层面的锁,而是在 SAP ABAP 应用服务器层面上工作,加锁和解锁都由专门的 ABAP Function Module 来完成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1468

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mkimage.sh 分析 boot.img recovery.img system.img制作方法

转载:http://blog.chinaunix.net/uid-26009923-id-4068594.html 一.  mkimage.sh 1. android目录下的mkimage.sh #!/bin/bash set -e . build/envsetup.sh >/dev/n

kylin_fire_zeng的专栏 4664

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

编译Android2.3.5源码,提供源码

参考文章: 1.编译android源码与内核总结 2.老罗-在Ubuntu上下载、编译和安装android最新源代码 现在说下我的安装情况吧 我在Ubuntu12 64位机器安装,使用的离线android 源代码为参考1中提供的 Android2.3.5_Kernel.7z(后面也会附上我自己做的网盘分享链接),java jdk使用的1.6。 下载好Android2.3.5_Kernel.

zlp1992的专栏 1539

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

基于android2.3.5系统:Andriod与Linux交叉编译工具[二]

由于我是从网络上直接下载飞凌的6410下的Andriod2.3.4版本的源码,而且这个版本有个好处就是,它将jdk21.6.0_23也一并放在android的源码下,因此,就不需要再去安装Java JDK,如果是在Linux来开发Android应用程序的话,那么还是安装一下比较好些。

嵌入式与人工智能天地 1982

基于android2.3.5系统:源码下载及android体系架构

先熟悉整个android的架构,弄明白android系统的各个组件的分布以及代码分析,并将学习过程放在我的blog上。到时候可以回过头来看看,自己到底得到了什么。主要是没有钱去卖开发板,因此只能用goldfish的代码来了解和分析android与内核之间的硬件抽象层的关系,因为在整个android的移植过程中,硬件抽象层是最重要的,毕竟它是android和linux内核的中间桥梁。

嵌入式与人工智能天地 1万+

android 系统文件目录结构

文件系统根目录结构分析 Android文件系统根目录结构如下: [plain] view plaincopy # ls -l   lrwxrwxrwx root     root              2011-01-01 20:00 bcm4329_cybertan.hcd -> /etc/bluez/bcm432x/BCM43

HTYBAY的专栏 4461

android 代码中 ls,android adb shell 的ls命令出现奇怪的字符

/ # lsls[1;34macct[0m [1;32minit[0m [1;34msd-ext[0m[1;34mcache[0m [1;32minit.goldfish.rc[0m [1;36msdcard[0m[1;34mconfig[0m [1;32minit.l...

weixin_30674575的博客 312

android2.3.5系统服务组件下载,Android 2.3.5源代码 更新至android 4.4,可以下载,度娘网盘...

Android 4.4源码下载(linux合并)==============================分割线结束=========================旧版本的可以使用115,不想再去115搬运了 4g多不是很想上传 邮箱吱吱的响受不了,上传下吧,要学会摆脱windows 不会linux玩android也没少哈意思,不是?下载所有的droiSplit包 split分割的,。wi...

weixin_39974557的博客 716

《Android开发从零开始》——11.AbsoluteLayout&FrameLayout学习

本节课的主要内容有:1.介绍AbsoluteLayout布局的使用2.介绍FrameLayout布局的使用 课程下载地址:http://u.115.com/file/f15a9d5411课件及源码下载地址:http://u.115.com/file/f1b56ce345

若水 5028

获取android2.3.5root权限

感觉良好..... 用的工具是:http://download.csdn.net/detail/xxg3053/3798325

穷途有路,绝处永生 8472

基于Android2.3.5系统:JNI与HAL实例解析[一]

Android系统下的JNI的全称是:Java Native Interface (JNI),JNI标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。

嵌入式与人工智能天地 1947
上一篇: 基于android2.3.5系统:开天辟地Android启动机制[二]
下一篇: 在Ubuntu10.04上设置和下载android4.0源码
wang-bob
博客等级 码龄20年 356粉丝 112原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值