Android已有的原生Camera框架中添加自己的API的实现方案。
在过去的2个月里,基本定制并评估完了项目所需要的基本需求,围绕着全志A31和Android4.2.2来实现。最近由于需要,在修改他的Camera的架构中,需要应用程序给HAL透传一个参数来控制底层图像处理算法的实现,即需要提供一个合理的API供APP的开发使用。
起初想到的,最简单有效的方法就是重新定制SDK,但不断遇到的问题,使得最终切换了部分的思路,但核心没有发生变化。
Android系统的架构层次分明,在复杂的架构中往往理解以后会变得十分的简单,现在看来,过去2个多月的时间基本把Camera架构和SurfaceFlinger这两者有了基本的深入理解,无论是控制流还是数据流,基本都可以定位到源码的位置,也对最低层的HAL进行了算法的添加,同时最核心的是完成了对A31 Resize模块的合理调度。
方案1:
1.在Camera.java中添加一个新的API函数,供APP开发。
2.进行API的更新:make update-api;
3.对源码进行SDK编译,产生新的android.jar。替换sdk,供eclipse下的APP开发
4. 手动安装编译后的APK。
问题:android4.2.2源码制作SDK会有一个天然的Bug,解决方法如下:
cd frameworks/base git revert 5f9922d7c3bce158e4c7a58929d4075e7c91e32e
但鉴于源码仓库不是自己同步所得,故无法进行git操作。目前也不知道这个是否可以彻底解决这个bug的所在。
方案2:
1.在Camera.java中添加一个新的API函数,供APP开发。
2. 进行make update-api的更新。
3.添加带有新的API到APP,并加入到/package/apps/下,只保留/res,/src, AndroidManifest.xml文件,添加如下的Android.mk:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := A31Camera LOCAL_PROGUARD_ENABLED := full include $(BUILD_PACKAGE)
4.修改/build/target/product下面的sdk.mk函数
如下添加一行代码,使得自己的APP作为系统默认的APP应用:
PRODUCT_PACKAGES := Calculator DeskClock Email2 Exchange2 FusedLocation Gallery Music Mms OpenWnn libWnnEngDic libWnnJpnDic libwnndict Phone PinyinIME Protips SoftKeyboard SystemUI Launcher2 Development DevelopmentSettings DrmProvider Fallback Settings SdkSetup CustomLocale sqlite3 InputDevices LatinIME CertInstaller LiveWallpapersPicker ApiDemos GestureBuilder CubeLiveWallpapers QuickSearchBox WidgetPreview monkeyrunner guavalib jsr305lib jython jsilver librs_jni ConnectivityTest GpsLocationTest CalendarProvider Calendar SmokeTest SmokeTestApp rild LegacyCamera A31Camera
5.make -j8 生成新的system.img。也完成了新的系统APP的定制。
以上两种方案,前者可以加快app的开发,后者可以完成app直接定制到系统。在本项目中,后者的使用也带来了一定的便利性。
自己定制系统的好处在于,无处不在的源码不会让你的开发以及想法不能继续下去,当然你也不能违反规定进行胡乱的修改。一路走来,还是能发现阅读代码带来的好处的:能加快代码的再设计,以及业务流添加位置的定位以及优化等。