本系列记载作者来到一个新的车载后装市场小公司,负责从新开始维护一套代码的心路过程。系统使用瑞芯微的rk3368芯片,版本是PX5_Android_8.0_release_20180726,从无到有的每个patch修改以及思考。其中着重点是驱动和系统相关,由于涉及到公司保密,所以APP部分暂时不贴过多的代码,只是针对系统bug进行记录。
2020_02_14
android系统默认支持bootanimation,但是原生的是播放bootan.zip.并且多个图片肯定没有视频播放的流畅,而且多个图片占用系统存储资源较大,于是瑞芯微在android6.0上面做了开机bootanimation程序里面播放视频的功能,在此将其移植到android8.0上面
1.编译系统中增加视频文件,利用copyfiles机制进行简化内置bootvideo.mp4到/oem/media/文件夹下
diff --git a/copyfiles/oem/media/bootvideo.mp4 b/copyfiles/oem/media/bootvideo.mp4
new file mode 100644
index 0000000..01efd46
Binary files /dev/null and b/copyfiles/oem/media/bootvideo.mp4 differ
diff --git a/px5.mk b/px5.mk
index a076337..04350d4 100755
--- a/px5.mk
+++ b/px5.mk
@@ -46,3 +46,7 @@ PRODUCT_PROPERTY_OVERRIDES += \
ro.product.ota.host = www.rockchip.com:2300
#PRODUCT_HAVE_OPTEE := true
+
+COPY_FILES = $(shell cd $(LOCAL_PATH)/copyfiles/ && find -type f)
+PRODUCT_COPY_FILES += $(foreach f, $(COPY_FILES), $(LOCAL_PATH)/copyfiles/$(f):$(f))
+
2.修改Bootanimation.cpp等代码
diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk
index 0e2c13e..c9b3633 100644
--- a/cmds/bootanimation/Android.mk
+++ b/cmds/bootanimation/Android.mk
@@ -27,6 +27,7 @@ LOCAL_SHARED_LIBRARIES := \
libgui \
libOpenSLES \
libtinyalsa \
+ libmedia \
libbase
LOCAL_MODULE:= bootanimation
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 7394490..4e912e2 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -64,6 +64,10 @@
#include "BootAnimation.h"
#include "audioplay.h"
+#include
+#include
+#include
+
namespace android {
static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
@@ -71,6 +75,7 @@ static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip
static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip";
static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.zip";
static const char SYSTEM_SHUTDOWNANIMATION_FILE[] = "/system/media/shutdownanimation.zip";
+static const char SYSTEM_BOOTVIDEO_FILE[] = "/oem/media/bootvideo.ts";
static const char SYSTEM_DATA_DIR_PATH[] = "/data/system";
static const char SYSTEM_TIME_DIR_NAME[] = "time";
@@ -343,6 +348,12 @@ status_t BootAnimation::readyToRun() {
return NO_ERROR;
}
}
+
+ if(access(SYSTEM_BOOTVIDEO_FILE,R_OK) == 0)
+ mVideo=true;
+ else
+ mVideo=false;
+
return NO_ERROR;
}
@@ -351,10 +362,14 @@ bool BootAnimation::threadLoop()
bool r;
// We have no bootanimation file, so we use the stock android logo
// animation.
- if (mZipFileName.isEmpty()) {
- r = android();
- } else {
- r = movie();
+ if(mVideo)
+ r = video();
+ else {
+ if (mZipFileName.isEmpty()) {
+ r = android();
+ } else {
+ r = movie();
+ }
}
eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
@@ -368,6 +383,31 @@ bool BootAnimation::threadLoop()
return r;
}
+bool BootAnimation::video()
+{
+ eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ eglDestroyContext(mDisplay, mContext);
+ eglDestroySurface(mDisplay, mSurface);
+
+ sp mp = new MediaPlayer();
+ mp->reset();
+ mp->setDataSource(NULL,SYSTEM_BOOTVIDEO_FILE,NULL);
+ mp->setLooping(false);
+ mp->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());
+ mp->prepare();
+ mp->start();
+
+ while(true)
+ {
+ if(exitPending())
+ break;
+ usleep(100);
+ if(!mp->isPlaying())
+ checkExit();
+ }
+ mp->stop();
+ return false;
+}
bool BootAnimation::android()
{
ALOGD("%sAnimationShownTiming start time: %" PRId64 "ms", mShuttingDown ? "Shutdown" : "Boot",
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index 181ef1c..68f92af 100644
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -168,6 +168,9 @@ private:
SortedVector mLoadedFiles;
sp mTimeCheckThread = nullptr;
sp mInitAudioThread = nullptr;
+
+ bool video();
+ bool mVideo;
};
代码加入后,在播放视频的时候,中间会有卡顿,获得信息得知,rk3399和px5的android6.0都没有此问题。
分析的过程如下:
1.视频时长格式问题,找到了其他的视频,还是有问题。
2.播放过久,因为看到了大约16s时候,sdcardfs挂载时候出现卡顿(将bootvideo放入到root根目录下面测试,问题没有改善,将系统的cpu governor设定成performance,问题也没有改善)。
3.rk3399的bootanimation进程支持调整动画播放时间,将动画播放时间调整后,虽然动画没有播完,但是看似卡顿不存在了,所以后面对客户的要求就是,动画不要超过3s,或者前几秒的动画是静止的,后面再持续播放,但是总长不能超过15s。
4.总结问题可能的根本原因是因为使用了mediaplayer,在系统启动过程中mediaplayer可能经历了reset,导致了资源(mediaplayer)出现了互斥。
总之,问题还是有卡顿,如果使用标准的bootanimation.zip方式,则不会有卡顿