MTK Android 13添加开机音乐

手动启动开机动画:

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;
             }

### 添加开机铃声功能的实现方法 要在MTK平台上的Android设备中添加开机铃声功能,可以通过修改`BootAnimation.cpp`文件并引入`MediaPlayer`类来完成这一目标。以下是具体的实现方式: #### 修改 `BootAnimation.cpp` 在`vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/BootAnimation.cpp` 文件中[^5],可以找到启动动画的核心逻辑部分。在此基础上,通过集成`MediaPlayer`类,可以在播放开机动画的同时加载并播放指定的音频文件。 具体操作如下: 1. **引入 MediaPlayer 类** 需要先导入必要的头文件以便支持多媒体播放功能: ```cpp #include <media/stagefright/foundation/AMediaPlayer.h> ``` 2. **创建 MediaPlayer 实例** 在适当的位置实例化一个`MediaPlayer`对象,并设置其属性以指向所需的音频资源路径。 3. **配置音频源** 使用预定义或者自定义存储位置中的音频文件作为输入源。例如,假设音频文件名为`boot_sound.mp3`且位于特定目录下,则可通过以下代码片段设定音轨地址: ```cpp AMEDIA_ERROR error; AMediaPlayer *player = AMediaPlayer_new(); const char* audioPath = "/system/media/audio/boot_sound.mp3"; error = AMediaPlayer_setDataSource(player, audioPath); if (error != AMEDIA_OK){ LOGE("Failed to set data source"); } ``` 4. **准备与启动播放器** 调用相应接口准备好媒体流之后立即触发回放过程: ```cpp error = AMediaPlayer_prepareAsync(player); if(error == AMEDIA_OK){ AMediaPlayer_start(player); }else{ LOGW("Prepare failed."); } ``` 以上步骤完成后,在系统引导阶段即可同步执行视觉效果展示以及听觉提示输出两项任务[^1]。 #### 处理 Audio Service 初始化延迟问题 然而需要注意的是,由于某些情况下Audio Service可能尚未完全就绪便尝试绑定从而引发异常情况发生,这可能导致实际运行期间未能正常发出声响现象存在。对此可采取措施包括但不限于延长等待时间窗口直至确认服务可用后再发起连接请求;亦或是调整优先级顺序确保基础框架层面上的各项组件均处于稳定状态之下再继续后续动作处理流程[^3]。 #### 打包更新后的ROM镜像 最后一步就是把经过改动后的整个项目重新编译生成新的固件版本,并刷入测试终端验证最终成果是否满足预期需求。记得按照既定规范将所有必要素材放置于正确的目标分区当中去比如前面提到过的`out/target/product/sanstar82_cwet_kk/system/media` 这样的地方[^4]。 ```bash make clean && make -j$(nproc) fastboot flash recovery out/target/product/<device_name>/recovery.img fastboot reboot bootloader ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值