【AndroidStudio】Import classes.jar, but the custom service cannot be found

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 ~

 

Guess you like

Origin blog.csdn.net/John_chaos/article/details/114821785