代码所在位置:/frameworks/base/cmds/bootanimation,其主要包含以下三个文件
BootAnimation_main.cpp
BootAnimation.h
bootAnimation.cpp
BootAnimation_main.cpp
BootAnimation.h
bootAnimation.cpp
2.3.1 Bootanimation_main.cpp
该文件是主入口文件;
int main(int argc, char** argv)
{
#if defined(HAVE_PTHREADS)
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
#endif
char value[PROPERTY_VALUE_MAX];
property_get("debug.sf.nobootanimation", value, "0");
int noBootAnimation = atoi(value);
LOGI_IF(noBootAnimation, "boot animation disabled");
if (!noBootAnimation) {
sp proc(ProcessState::self());
ProcessState::self()->startThreadPool();
// create the boot animation object
bool setBoot = true;
bool setRotated = false;
bool sePaly = true;
if(argc > 1){
if(!strcmp(argv[1],"shut"))
setBoot = false;
}
if(argc > 2){
if(!strcmp(argv[2],"nomp3"))
sePaly = false;
}
if(argc > 3){
if(!strcmp(argv[3],"rotate"))
setRotated = true;
}
char volume[PROPERTY_VALUE_MAX];
property_get("persist.sys.mute.state", volume, "-1");
int nVolume = -1;
nVolume = atoi(volume);
if(nVolume == 0 || nVolume == 1 ){
sePaly = false;
}
sp boot = new BootAnimation(setBoot,sePaly,setRotated);
IPCThreadState::self()->joinThreadPool();
}
return 0;
}
int main(int argc, char** argv)
{
#if defined(HAVE_PTHREADS)
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
#endif
char value[PROPERTY_VALUE_MAX];
property_get("debug.sf.nobootanimation", value, "0");
int noBootAnimation = atoi(value);
LOGI_IF(noBootAnimation, "boot animation disabled");
if (!noBootAnimation) {
sp proc(ProcessState::self());
ProcessState::self()->startThreadPool();
// create the boot animation object
bool setBoot = true;
bool setRotated = false;
bool sePaly = true;
if(argc > 1){
if(!strcmp(argv[1],"shut"))
setBoot = false;
}
if(argc > 2){
if(!strcmp(argv[2],"nomp3"))
sePaly = false;
}
if(argc > 3){
if(!strcmp(argv[3],"rotate"))
setRotated = true;
}
char volume[PROPERTY_VALUE_MAX];
property_get("persist.sys.mute.state", volume, "-1");
int nVolume = -1;
nVolume = atoi(volume);
if(nVolume == 0 || nVolume == 1 ){
sePaly = false;
}
sp boot = new BootAnimation(setBoot,sePaly,setRotated);
IPCThreadState::self()->joinThreadPool();
}
return 0;
} 其主要的功能是根据传进来的参数决定是是要播放开机还是关机动画/铃音,并且启动BootAnimation;
2.3.2 BootAnimation.cpp
BootAnimation.cpp集成自Thread,在创建时会调用readyToRun()->threadLoop()。
status_tBootAnimation::readyToRun() {
……………省略………………………
mAndroidAnimation = false;
if(bBootOrShutDown){
status_t err = mZip.open("/data/local/bootanimation.zip");
if (err != NO_ERROR) {
err =mZip.open("/system/media/bootanimation.zip");
if (err != NO_ERROR) {
mAndroidAnimation = true;
}
}
}else {
if(!bShutRotate){
status_terr = mZip.open("/data/local/shutanimation.zip");
if (err != NO_ERROR) {
err =mZip.open("/system/media/shutanimation.zip");
if (err != NO_ERROR) {
mAndroidAnimation = true;
}
}
}
}
return NO_ERROR;
}
status_tBootAnimation::readyToRun() {
……………省略………………………
mAndroidAnimation = false;
if(bBootOrShutDown){
status_t err = mZip.open("/data/local/bootanimation.zip");
if (err != NO_ERROR) {
err =mZip.open("/system/media/bootanimation.zip");
if (err != NO_ERROR) {
mAndroidAnimation = true;
}
}
}else {
if(!bShutRotate){
status_terr = mZip.open("/data/local/shutanimation.zip");
if (err != NO_ERROR) {
err =mZip.open("/system/media/shutanimation.zip");
if (err != NO_ERROR) {
mAndroidAnimation = true;
}
}
}
}
return NO_ERROR;
}readyToRun() 方法判断/system/media/bootanimation.zip(shutanimaion.zip)是否存在,如果存在,则将 mAndroidAnimation 设置false,这个变量决定threadLoop中调用android()还是movie()来具体实现动画的播放。
boolBootAnimation::threadLoop()
{
........省略........
if(!bBootOrShutDown){
pSoundFileName="/data/local/shutaudio.mp3";
pBackupSoundFileName="/system/media/shutaudio.mp3";
} else {
pSoundFileName="/data/local/bootaudio.mp3";
pBackupSoundFileName="/system/media/bootaudio.mp3";
}
if (mAndroidAnimation)
r = android();
} else {
r = movie();
}
}
boolBootAnimation::threadLoop()
{
........省略........
if(!bBootOrShutDown){
pSoundFileName="/data/local/shutaudio.mp3";
pBackupSoundFileName="/system/media/shutaudio.mp3";
} else {
pSoundFileName="/data/local/bootaudio.mp3";
pBackupSoundFileName="/system/media/bootaudio.mp3";
}
if (mAndroidAnimation)
r = android();
} else {
r = movie();
}
}
threadLoop()方法根据 mAndroidAnimation 变量调用android()/movie(). 如果system/media/shutanimation.zip/bootanimation.zip存在的话,调用movie(),该接口会解析zip文件中的desc.txt文件,根据txt文件中的配置来播放动画。否则就调用android来播放原生自带的资源。
3、总结 对于图片资源时如何绘制的,我想这不是本文的重点,有兴趣的同学可以继续深究,这里仅仅是抛砖引玉。