diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index fa94e6a..98e447c 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -729,22 +729,6 @@
     glVertexAttribPointer(uvLocation, 2, GL_FLOAT, GL_FALSE, 0, quadUVs);
     glEnableVertexAttribArray(uvLocation);
 
-    if (dynamicColoringEnabled) {
-        glUseProgram(mImageShader);
-        SLOGI("[BootAnimation] Dynamically coloring boot animation.");
-        for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) {
-            float *startColor = mAnimation->startColors[i];
-            float *endColor = mAnimation->endColors[i];
-            glUniform4f(glGetUniformLocation(mImageShader,
-                (U_START_COLOR_PREFIX + std::to_string(i)).c_str()),
-                startColor[0], startColor[1], startColor[2], 1 /* alpha */);
-            glUniform4f(glGetUniformLocation(mImageShader,
-                (U_END_COLOR_PREFIX + std::to_string(i)).c_str()),
-                endColor[0], endColor[1], endColor[2], 1 /* alpha */);
-        }
-        mImageColorProgressLocation = glGetUniformLocation(mImageShader, U_COLOR_PROGRESS);
-    }
-
     // Initialize text shader.
     mTextShader = linkShader(vertexShader, textFragmentShader);
     positionLocation = glGetAttribLocation(mTextShader, A_POSITION);
@@ -1180,12 +1164,6 @@
         s = ++endl;
     }
 
-    for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) {
-        parseColorDecimalString(
-            android::base::GetProperty("persist.bootanim.color" + std::to_string(i + 1), ""),
-            animation.endColors[i], animation.startColors[i]);
-    }
-
     return true;
 }
 
@@ -1362,6 +1340,10 @@
         mTimeCheckThread->run("BootAnimation::TimeCheckThread", PRIORITY_NORMAL);
     }
 
+    if (mAnimation != nullptr && mAnimation->dynamicColoringEnabled) {
+        initDynamicColors();
+    }
+
     playAnimation(*mAnimation);
 
     if (mTimeCheckThread != nullptr) {
@@ -1415,6 +1397,27 @@
         sizeof(quadPositions) / sizeof(quadPositions[0]) / 2);
 }
 
+void BootAnimation::initDynamicColors() {
+    for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) {
+        parseColorDecimalString(
+            android::base::GetProperty("persist.bootanim.color" + std::to_string(i + 1), ""),
+            mAnimation->endColors[i], mAnimation->startColors[i]);
+    }
+    glUseProgram(mImageShader);
+    SLOGI("[BootAnimation] Dynamically coloring boot animation.");
+    for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) {
+        float *startColor = mAnimation->startColors[i];
+        float *endColor = mAnimation->endColors[i];
+        glUniform4f(glGetUniformLocation(mImageShader,
+            (U_START_COLOR_PREFIX + std::to_string(i)).c_str()),
+            startColor[0], startColor[1], startColor[2], 1 /* alpha */);
+        glUniform4f(glGetUniformLocation(mImageShader,
+            (U_END_COLOR_PREFIX + std::to_string(i)).c_str()),
+            endColor[0], endColor[1], endColor[2], 1 /* alpha */);
+    }
+    mImageColorProgressLocation = glGetUniformLocation(mImageShader, U_COLOR_PROGRESS);
+}
+
 bool BootAnimation::playAnimation(const Animation& animation) {
     const size_t pcount = animation.parts.size();
     nsecs_t frameDuration = s2ns(1) / animation.fps;
