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直接定製到系統。在本專案中,後者的使用也帶來了一定的便利性。
自己定製系統的好處在於,無處不在的原始碼不會讓你的開發以及想法不能繼續下去,當然你也不能違反規定進行胡亂的修改。一路走來,還是能發現閱讀程式碼帶來的好處的:能加快程式碼的再設計,以及業務流新增位置的定位以及優化等。