code: public boolean	sync()
      {
          if (!mNeedSync)
              return false;
          mNeedSync = false;
          for (int i = 0; i < mBones.length; ++i)
          {
              Bone 	bone = mBones[i];
              int		pid = mSkeleton.getParentBoneIndex(i);
              boolean	update;
  
              if (pid < 0)							        // root bone?
                  continue;
              update = (mBones[pid].Changed & (WORLD_ROT | LOCAL_ROT)) != 0;
              if (!mSkeleton.isLocked(i))				        // bone not locked?
              {
                  if ((bone.Changed == WORLD_ROT) ||
                      ((bone.Changed & Bone.WORLD_POS) != 0))	// world matrix changed?
                  {
                      calcLocal(bone, pid);					// calculate local rotation and position
                      if (sDebug)
                      {
                          Log.d("BONE", "sync: %s %s", mSkeleton.getBoneName(i), bone.toString());
                      }
                      continue;
                  }
              }
              if (update ||								    // use local pos & rot?
                  (bone.Changed & (LOCAL_ROT | WORLD_ROT)) != 0)
              {
                  bone.Changed = LOCAL_ROT;
                  calcWorld(bone, pid);				        // update world rotation & position
                  if (sDebug)
                  {
                      Log.d("BONE", "sync: %s %s", mSkeleton.getBoneName(i), bone.toString());
                  }
              }
          }
          for (int i = 0; i < mBones.length; ++i)
          {
              mBones[i].Changed = 0;
          }
          return true;
      }
docs: Synchronize the state of the pose.
  <p>
  The local and world rotations are not automatically kept in sync.
  When a pose is updated, the updates do not take complete
  effect until you call this function.