首页 > 编程知识 正文

Login issues(android:targetSdkVersion)

时间:2023-05-06 19:38:34 阅读:65507 作者:2769

最近在调试Android系统的gadget功能,在make menuconfig中发现gadget编译为module模式。 有很多选择。 其中有安卓的选择。 其实提供了ADB和Storage的功能。

具体显示代码位于/drivers/usb/gadget下,三个文件: Android.cf _ ADB.cf _ mass _ storage.c

g_android.ko来自这三个文件。 其中android.c依赖于f_adb.c和f_mass_storage.c。 (

安卓. c的

static int _ init Android _ bind _ config (struct USB _ configuration * c (struct Android _ dev * dev=_ Android _ ) c ) printk (kern _ debug ' Android _ bind _ config/n ' ); ret=mass _ storage _ function _ add (dev-cdev,c,dev-nluns ); if(ret )返回ret; 返回ADB _ function _ add (dev-cdev,c; }

看关系

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

谈谈我的问题吧,

1 .我把安卓编译成模块模式,到了g_android.ko,然后放入rootfs手动加载,Okay,no problem! 非常happy。 但是,当关闭adb进程rmmod g_android时,它进入死锁状态,打开代码并执行查询时,出现了问题

struct USB _ request * req _ get (struct ADB _ dev * dev,struct list_head *head,int DD ) {unsigned long flags; struct usb_request *req; spin_lock_IRQsave(dev-lock,flags ); //已锁定,忧郁if(list_empty ) head ) ) {req=0; } else { req=list _ first _ entry (head,struct usb_request,list ); list_del(req-list; } spin _ unlock _ IRQ restore (dev-lock,flags ); 返回重复; }

死锁持续,通过打开kernel hacking的spinlock debug,意识到自己锁定了自己,于是寻找了阿探阿。

查看rmmod函数调用过程当我调用rmmod时,首先是__exitcleanup(void )中的USB _ composite _ unregister (Android _ USB _ driver )

(ADB _ function _ unbind (struct USB _ configuration * c,struct usb_function *f ) ) ) ) ) ) ) ) ) )

请看这个函数

staticvoidadb _ function _ unbind (struct USB _ configuration * c,struct usb_function *f ) struct ADB _ dev * dev=sttru f spin_lock_IRQ(dev-lock; //锁定你的req_get,谁叫我们共享dev-lockwhile((req=req_get ) dev,dev-rx_idle,0 ) ) ) (ADB_request ) )至死}while((req=req_get ) dev,dev-tx_idle,0 ) ) ADB_request_free ) req,dev。 }dev-online=0; dev-error=1; spin_unlock_IRQ(dev-lock; misc_deregister(ADB_device; kfree(ADB_dev ); _ ADB _ dev=空值; }

所以,觉得req_get代码的spinlock有问题,没办法,用req_get_free_lock代替了while循环的req_get函数

rebuild内核,Okay卸载g_android.ko也没关系。 正好在自己高兴的时候,发现充满了喜悦和悲伤。

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

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

卸载完了g_android.ko 我再次insmod g_android.ko 挂了,不过不是kernel panic而是提示

"sysfs: duplicate filename 'usb_mass_storage' can not be created"

恩 这次出在f_mass_storage.c这个文件中,根据信息提示应该是没因为上次没卸载完全。没办法,在几个与insmod和rmmod的函数中加入打印信息。主要是mass_storage_function_add, fsg_function_bind,fsg_function_unbind三个函数,前两个是跟insmod有关,后者跟rmmod有关。

通过打印信息发现一个Android开发者的 小纰漏 导致的问题,就是在

int __init mass_storage_function_add(struct usb_composite_dev *cdev,struct usb_configuration *c, int nluns){intrc;struct fsg_dev*fsg;printk(KERN_INFO "mass_storage_function_add/n");rc = fsg_alloc();if (rc)return rc;fsg = the_fsg;fsg->nluns = nluns; spin_lock_init(&fsg->lock);init_rwsem(&fsg->filesem);kref_init(&fsg->ref);init_completion(&fsg->thread_notifier); the_fsg->buf_size = BULK_BUFFER_SIZE;the_fsg->sdev.name = DRIVER_NAME;the_fsg->sdev.print_name = print_switch_name;the_fsg->sdev.print_state = print_switch_state;rc = switch_dev_register(&the_fsg->sdev);//卸载的时候没有swith_dev_unregisterif (rc < 0)goto err_switch_dev_register;wake_lock_init(&the_fsg->wake_lock, WAKE_LOCK_SUSPEND, "usb_mass_storage"); fsg->cdev = cdev;fsg->function.name = shortname;fsg->function.descriptors = fs_function;fsg->function.bind = fsg_function_bind;fsg->function.unbind = fsg_function_unbind;fsg->function.setup = fsg_function_setup;fsg->function.set_alt = fsg_function_set_alt;fsg->function.disable = fsg_function_disable; rc = usb_add_function(c, &fsg->function);if (rc != 0)goto err_usb_add_function;return 0;err_usb_add_function:switch_dev_unregister(&the_fsg->sdev);err_switch_dev_register:kref_put(&the_fsg->ref, fsg_release);return rc;}  

在掉用过/drivers/switch/class_switch.c 中的 switch_dev_register后,除了出错处理再也没作擦屁股的动作(unregister)汗,这不是占着XX不拉什么吗?没办法,去fsg_function_unbind函数中的

for (i = 0; i < fsg->nluns; ++i) {curlun = &fsg->luns[i];if (curlun->registered) {switch_dev_unregister(&the_fsg->sdev);//加入擦屁股的一句device_remove_file(&curlun->dev, &dev_attr_file);device_unregister(&curlun->dev);curlun->registered = 0;}}  

Okay 万事Okay 主阿!其实都不是什么大的问题拉。但是导致的现象确很恐怖。android developer太忙了,毕竟也是人阿。呵呵,以前都不敢改他们代码,总是推敲自己是不是哪边错了。想报bug去android开发者论坛,但是被该死的河蟹给和谐了,打不开report issue界面。感谢伟大的政府让我们这些P民,成为白痴和弱智。

草泥马的 !

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。