在过去的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直接定制到系统。在本项目中,后者的使用也带来了一定的便利性。
自己定制系统的好处在于,无处不在的源码不会让你的开发以及想法不能继续下去,当然你也不能违反规定进行胡乱的修改。一路走来,还是能发现阅读代码带来的好处的:能加快代码的再设计,以及业务流添加位置的定位以及优化等。