手动启动开机动画:
adb root
adb shell setprop service.bootanim.exit 0
adb shell start bootanim
退出动画:
adb shell setprop service.bootanim.exit 1
开机音乐,系统自带:
\frameworks\base\cmds\bootanimation\BootAnimation.cpp 文件中有实现
将开机音乐命名成 audio.wav 放入开机动画文件的part0 文件夹中并打包;发现并没有播放开机音乐,可能是和下面的问题一样 media 服务没有起来;
logcat分析:
Line 7058: 11-23 23:24:51.973 773 902 D bootanimation: PlayerBase::PlayerBase()
Line 7059: 11-23 23:24:51.974 773 902 E bootanimation: PlayerBase(): binding to audio service failed, service up?
Line 7060: 11-23 23:24:51.974 773 902 D bootanimation: TrackPlayerBase::TrackPlayerBase()
Line 7184: 11-23 23:24:51.989 773 902 E bootanimation: AudioPlayer realize: no audio service, player will not be registered
Line 7185: 11-23 23:24:51.984 773 773 I BootAnimation::: type=1400 audit(0.0:325): avc: denied { call } for scontext=u:r:bootanim:s0 tcontext=u:r:mediametrics:s0 tclass=binder permissive=1
Line 7243: 11-23 23:24:52.008 773 818 D BootAnimation: Playing files = /system/media/bootanimation.zip/part0, Requested repeat = 1, playUntilComplete = false
Line 7243: 11-23 23:24:52.008 773 818 D BootAnimation: Playing files = /system/media/bootanimation.zip/part0, Requested repeat = 1, playUntilComplete = false
Line 15405: 11-23 23:25:00.620 773 818 D BootAnimation: Playing files = /system/media/bootanimation.zip/part1, Requested repeat = 0, playUntilComplete = false
看开机的logcat,个人理解是播放audio.wav这段音频铃声的时候,audio service服务还没有初始化成功,binding失败,导致没有播放声音。
framework目录:
diff --git a/av/media/libmediaplayerservice/MediaPlayerService.cpp b/av/media/libmediaplayerservice/MediaPlayerService.cpp
old mode 100644
new mode 100755
index 210099c..0a88cd2
--- a/av/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/av/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -2855,7 +2855,7 @@ MediaPlayerService::BatteryTracker::BatteryTracker() {
// reset battery stats
// if the mediaserver has crashed, battery stats could be left
// in bad state, reset the state upon service start.
- BatteryNotifier::getInstance().noteResetVideo();
+ //BatteryNotifier::getInstance().noteResetVideo();
}
void MediaPlayerService::BatteryTracker::addBatteryData(uint32_t params)
diff --git a/av/services/audioflinger/AudioFlinger.cpp b/av/services/audioflinger/AudioFlinger.cpp
old mode 100644
new mode 100755
index f0eb035..625b169
--- a/av/services/audioflinger/AudioFlinger.cpp
+++ b/av/services/audioflinger/AudioFlinger.cpp
@@ -330,7 +330,7 @@ AudioFlinger::AudioFlinger()
mGlobalEffectEnableTime(0),
mPatchPanel(this),
mDeviceEffectManager(this),
- mSystemReady(false)
+ mSystemReady(true)
{
// Move the audio session unique ID generator start base as time passes to limit risk of
// generating the same ID again after an audioserver restart.
diff --git a/av/services/audioflinger/Threads.cpp b/av/services/audioflinger/Threads.cpp
old mode 100644
new mode 100755
index b786879..0ec3ecb
--- a/av/services/audioflinger/Threads.cpp
+++ b/av/services/audioflinger/Threads.cpp
@@ -649,11 +649,11 @@ status_t AudioFlinger::ThreadBase::sendConfigEvent_l(sp<ConfigEvent>& event)
{
status_t status = NO_ERROR;
- if (event->mRequiresSystemReady && !mSystemReady) {
- event->mWaitStatus = false;
- mPendingConfigEvents.add(event);
- return status;
- }
+ //if (event->mRequiresSystemReady && !mSystemReady) {
+ // event->mWaitStatus = false;
+ // mPendingConfigEvents.add(event);
+ // return status;
+ //}
mConfigEvents.add(event);
ALOGV("sendConfigEvent_l() num events %zu event %d", mConfigEvents.size(), event->mType);
mWaitWorkCV.signal();
@@ -1209,7 +1209,7 @@ void AudioFlinger::ThreadBase::releaseWakeLock_l()
}
void AudioFlinger::ThreadBase::getPowerManager_l() {
- if (mSystemReady && mPowerManager == 0) {
+ if (mPowerManager == 0) {
// use checkService() to avoid blocking if power service is not up yet
sp<IBinder> binder =
defaultServiceManager()->checkService(String16("power"));
@@ -3623,6 +3623,9 @@ ssize_t AudioFlinger::PlaybackThread::threadLoop_write()
ssize_t bytesWritten;
const size_t offset = mCurrentWriteLength - mBytesRemaining;
+ if(mPowerManager == 0)
+ acquireWakeLock();
+
#if defined(MTK_LATENCY_DETECT_PULSE)
if (AudioDetectPulse::getDetectPulse()) {
AudioDetectPulse::doDetectPulse(TAG_NORMAL_MIXER, 800, 0, (void *)((char *)mSinkBuffer + offset),
@@ -6163,6 +6166,16 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
track->mHasVolumeController = false;
}
+ /*xyx modify start */
+ char mvalue[PROPERTY_VALUE_MAX] = { 1 };
+ property_get("service.bootanim.exit", mvalue, "");
+ if (strcmp(mvalue,"0") == 0){
+ ALOGE("bootanim volume setting");
+ vlf = 0.50f;
+ vrf = 0.50f;
+ }
+ /*xyx modify end */
+
// XXX: these things DON'T need to be done each time
mAudioMixer->setBufferProvider(trackId, track);
mAudioMixer->enable(trackId);
如果发现开机铃声太小,可以将上面的vlf和vrf修改大些 。
device目录
diff --git a/mediatek/system/mssi_{project}/copyfile/system/media/bootanimation.zip b/mediatek/system/mssi_{project}/copyfile/system/media/bootanimation.zip
old mode 100644
new mode 100755
index e26a717..a095326
Binary files a/mediatek/system/mssi_{project}/copyfile/system/media/bootanimation.zip and b/mediatek/system/mssi_{project}/copyfile/system/media/bootanimation.zip differ
diff --git a/mediatek/system/mssi_{project}/sepolicy/zlt/private/audioserver.te b/mediatek/system/mssi_{project}/sepolicy/zlt/private/audioserver.te
new file mode 100755
index 0000000..a48d541
--- /dev/null
+++ b/mediatek/system/mssi_{project}/sepolicy/zlt/private/audioserver.te
@@ -0,0 +1,5 @@
+# ==============================================
+# MTK Policy Rule
+# ==============================================
+
+allow audioserver bootanim:binder call;
diff --git a/mediatek/system/mssi_{project}/sepolicy/zlt/private/bootanim.te b/mediatek/system/mssi_{project}/sepolicy/zlt/private/bootanim.te
new file mode 100755
index 0000000..682fd9e
--- /dev/null
+++ b/mediatek/system/mssi_{project}/sepolicy/zlt/private/bootanim.te
@@ -0,0 +1,5 @@
+# ==============================================
+# MTK Policy Rule
+# ==============================================
+
+allow bootanim mediametrics:binder { call };
其他问题:
按照上述patch修改后,有的开机速度快的机器会出现开机动画还未播放完整,就进入桌面了,导致开机铃声未播放完全;出现该现象的时候,我们可以修改一下开机动画的退出时间:
--- a/base/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/base/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3750,6 +3750,18 @@ public class WindowManagerService extends IWindowManager.Stub
// stop boot animation
// formerly we would just kill the process, but we now ask it to exit so it
// can choose where to stop the animation.
+ //add:
+ while (true) {//这里本来想做个条件判断一下需要延迟多少轮,发现10秒够了
+ try {
+ Thread.sleep(10000);
+ Slog.i(TAG_WM, "******* sleep 10s is run");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ Slog.i(TAG_WM, "******* sleep 10s not run");
+ }
+ break;
+ }
+ //end
SystemProperties.set("service.bootanim.exit", "1");//就是这个属性控制开机动画的退出
mBootAnimationStopped = true;
}