camera api2封装层
Api2封装层目录 frameworks/base/core/java/android/hardware/camera2/
Cameraservice的自启动:/frameworks/av/camera/cameraserver/main_cameraserver.cpp cameraserver.rc
Aidl层: /frameworks/av/camera/aidl/android/hardware/
out/soong/.intermediates/frameworks/base/framework/android_common/gen/aidl/frame works/av/camera/aidl/android/hardware/生成的java
./out/soong/.intermediates/frameworks/av/camera/libcamera_client/android_arm_armv8-a_cortex-a53_core_shared/gen/aidl/生成的cpp(BnCameraService BpCameraService)
Camera Service: frameworks/av/services/camera/libcameraservice
Hardware: hardware/qcom/camera/QCamera2/
Qualcomm daemon: vendor/qcom/proprietary/mm-camera/
Kernel:kernel/msm-4.9/drivers/media/platform/msm/camera_v2
V4l2: kernel/msm-4.9/drivers/media/v4l2-core
HIdl层:
frameworks\hardware\interfaces\cameraservice\service\
out\soong\.intermediates\frameworks\hardware\interfaces\cameraservice\service\2.0\(BnHwCameraService,BpHwCameraService)
AIDL是Android Interface definition language,编译器会根据AIDL文件为我们生成一个与AIDL文件同名的 .java 文件,生成的是package,可以被import
HIDL:
ICameraService.hal会生成几个文件:BnHwCameraService.h,BpHwCameraService.h,BsCameraService.h,ICameraService.h,IHwCameraService.h,CameraServiceAll.cpp。直通模式:用于android O之前的版本,hardware与framework是同一个进程。 binder模式:android O及后续版本,hardware是一个独立进程。
CameraService::onFirstRef()--------->
CameraService::enumerateProviders()--------->
mCameraProviderManager->initialize(this)
mCameraProviderManager->setUpVendorTags()
mCameraProviderManager->getCameraDeviceIds()
--------->
mServiceProxy->registerForNotifications(this)
mServiceProxy->listServices()
this->addProviderLocked(instance);
Android中AIDL的使用详解
AIDL用来做什么
AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。
AIDL的使用
在android studio 2.0里面使用AIDL,因为是两个APP交互么,所以当然要两个APP啦,我们在第一个工程目录右键,输入名称后,sutido就帮我们创建了一个AIDL文件。
// IMyAidlInterface.aidl
package cc.abto.demo;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}
上面就是studio帮我生成的aidl文件。basicTypes这个方法可以无视,看注解知道这个方法只是告诉你在AIDL中你可以使用的基本类型(int, long, boolean, float, double, String),因为这里是要跨进程通讯的,所以不是随便你自己定义的一个类型就可以在AIDL使用的,这些后面会说。我们在AIDL文件中定义一个我们要提供给第二个APP使用的接口。
interface IMyAidlInterface {
String getName();
}
定义好之后,就可以sycn project一下,然后新建一个service。在service里面创建一个内部类,继承你刚才创建的AIDL的名称里的Stub类,并实现接口方法,在onBind返回内部类的实例。
public class MyService extends Service
{
public MyService()
{
}
@Override
public IBinder onBind(Intent intent)
{
return new MyBinder();
}
class MyBinder extends IMyAidlInterface.Stub
{
@Override
public String getName() throws RemoteException
{
return "test";
}
}
}接下来,将我们的AIDL文件拷贝到第二个项目,然后sycn project一下工程。这边的包名要跟第一个项目的一样哦,这之后在Activity中绑定服务。
public class MainActivity extends AppCompatActivity
{
private IMyAidlInterface iMyAidlInterface;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService(new Intent("cc.abto.server"), new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name)
{
}
}, BIND_AUTO_CREATE);
}
public void onClick(View view)
{
try
{
Toast.makeText(MainActivity.this, iMyAidlInterface.getName(), Toast.LENGTH_SHORT).show();
}
catch (RemoteException e)
{
e.printStackTrace();
}
}
}
这边我们通过隐式意图来绑定service,在onServiceConnected方法中通过IMyAidlInterface.Stub.asInterface(service)获取iMyAidlInterface对象,然后在onClick中调用iMyAidlInterface.getName()。作者:我是午饭
HIDL的相关介绍
HIDL的全称是HAL interface definition language(硬件抽象层接口定义语言),在此之前Android 有AIDL,架构在Android binder 之上,用来定义Android 基于Binder通信的Client 与Service之间的接口。HIDL也是类似的作用,只不过定义的是Android Framework与Android HAL实现之间的接口。
在AIDL机制中Android 会提供一系列工具会将用户定义的*.aidl文件编译生成Client端代码与Service端代码,用户仅仅 需要1)在Service端实现所需要实现的接口。2)在Client端调用相关接口。基于Binder机制,在Clinet端的调用会自动通过 binder驱动跨进程到service进程当中。
而在HIDL里,与AIDL比较类似,底层也是基于binder机制。但是也有稍微不一样的地方。为了支持HIDL,Android 对BInder做了一定程度的修改。