classes.jar在AOSP中的路径:
out/target/common/obj/JAVA_LIBRARY/framework_intermediates/classes.jar
导入AS步骤:
1.将源码编译的classes.jar复制到app中的app\libs\目录下
2.右键classes.jar,选择【add as Library...】
3. 改为compileOnly
4. 检查下这个路径
5.app.iml中配置一下顺序,我这里是把Android API 30 Platform改到了最后一行,也就是classes.jar后面
这样就可以找到了,没暴红了~
遇到一个问题:
manager里面构造函数的service是空指针。
看了半天,有好几个问题
1.先把这个selinux权限加一下
//device
service.te
type chao_service, app_api_service, system_server_service, service_manager_type;
service_contexts:
chao_service u:object_r:chao_service:s0
system_server.te:
allow system_servcer chao_service:service_manager add;
2.manager里面的构造函数,service是空指针原因是IchaoService注册的问题,某个原因没有注册成功。
三个地方,里面有其他服务注册的方法。
照着超,自己的服务名字对上就没问题
这个问题解决后,app启动后onCreate中:
1.获得service对象
chaoManager = (ChaoManager) getSystemService(Context.CHAO_SERVICE);
2.manager中的构造函数执行,从stub传来service
3.service就不为空了
这个时候,我又遇到一个问题:
在jni中的ionctl函数执行了,但是kernel层的对应的ioctl函数内没有执行
。。
。。。
。。。。
想了一会儿,然后打个log。
是因为hal(hardware)层的open函数里面的问题。
hal层里面的module的open函数一般做的事情是:
fd = open("/dev/chaogpio", O_RDWR);
也就是获得设备节点的文件句柄。
然后发现这个fd<0。。。。
按道理在机器开机启动时候,会执行hal里面得gpio_device->gpio_open(gpio_device), 也就是上面的
fd = fd = open("/dev/chaogpio", O_RDWR);
后面再在app里面操作ioctl逻辑那应该有了句柄啊 ??
机器启动的时候抓的logcat, 也没看到报错,只是顺序执行了
???
后面想了下发现了,要加节点权限
/dev/chaogpio的执行权限,如果boot启动的时候没有权限,那么在logcat执行的时候,也就是android起来的时候,是获得不到句柄的。
节点添加位置:
init.target.rc //device
on boot
chmod 777 /dev/chaogpio
chown system system /dev/chaogpio
这样,从app到driver写了一变,碰到几个问题,现在对流程相对清楚了很多。
-------------
end ~