libcamera_client.so这个lib里,有相机的相关参数,比如相机支持的场景模式参数、白平衡模式参数,对焦模式参数……等等
大部分参数是高通或google定义的标准参数,部分手机厂商不更改直接使用这些参数。
有些手机,被消费者批为没个性,甚至从电路板到模具外壳都一样,当然手机厂商终极目标就是千元机,为了节省研发成本和材料成本,这么做无可厚非。但其实这种手机,对于咱第三方开发者来讲也是省时省力,皆大欢喜。
而有些手机厂商则会新增一些自定义的参数以个性化,这样才不会沦为通用模具的大路货,手机售价也相应噌噌地往上涨,但逼格高的代价就是适配起来更麻烦,泛泰就属于这种。
同级适配msm-aosp可能不需要用到这个技巧,可以直接替换官方rom里的libcamera_client.so。
但在越级适配msm-aosp或CM等第三方rom的时候,就必须从源代码下手,编译出可配合高版本系统的libcamera_client.so
本文所属方法为笔者自己摸索总结的方法,可能也有其它更加方便快捷的方法。
最后,老生常谈,本文只可参考,切勿照搬。
一、思路&方法
通过查看frameworks/av/camera/Android.mk
可知,此文件夹编译后生成libcamera_client.so
对比相近版本的cm与msm-aosp的
frameworks/av/camera/CameraParameters.cpp
frameworks/av/include/camera/CameraParameters.h
先看cpp文件,左边为cm11,右边为msm-aosp4.4.2
可以看出cm比msm-aosp多出了许多类似
#ifdef OPPO_CAMERA_HARDWARE
#ifdef SAMSUNG_CAMERA_HARDWARE
等等各手机厂商特殊CameraParameters定义,以及各厂商自定义的导出函数
如果你的手机正好是CM11支持的手机厂商,那么就直接照抄cm11的frameworks/av/camera和frameworks/av/include/camera
然后在BoardConfig.mk里增加对应的的cflags,例如
COMMON_GLOBAL_CFLAGS += -DOPPO_CAMERA_HARDWARE
二、获取libcamera_client.so中的CameraParameters以及导出函数
如果cm11正好不支持本机型,其实cm仍然不支持大多数手机厂商,那么苦逼开发者就必须自己手动分析CameraParameters
接下来要用到objdump这个工具,在源码源代码目录里的prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/arm-eabi-objdump,可以单独复制出来到任意目录使用
新建一个目录,把arm-eabi-objdump和需要分析的libcamera_client.so复制进去
1.查看所有Sections
./arm-eabi-objdump -h libcamera_client.so
libcamera_client.so: file format elf32-littlearm
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 00000013 00000134 00000134 00000134 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .dynsym 000044c0 00000148 00000148 00000148 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .dynstr 0000d6dd 00004608 00004608 00004608 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .hash 00002154 00011ce8 00011ce8 00011ce8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .rel.dyn 0000aa80 00013e3c 00013e3c 00013e3c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .rel.plt 00000560 0001e8bc 0001e8bc 0001e8bc 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .plt 00000824 0001ee1c 0001ee1c 0001ee1c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
7 .text 00009058 0001f640 0001f640 0001f640 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
8 .ARM.exidx 00001000 00028698 00028698 00028698 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .ARM.extab 00000090 00029698 00029698 00029698 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .rodata 0000188c 00029728 00029728 00029728 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 .data.rel.ro.local 00000010 0002c7f0 0002c7f0 0002b7f0 2**3
CONTENTS, ALLOC, LOAD, DATA
12 .fini_array 00000004 0002c800 0002c800 0002b800 2**2
CONTENTS, ALLOC, LOAD, DATA
13 .data.rel.ro 00008260 0002c808 0002c80