• [置顶] Android资源文件分析


    1)修改开机默认壁纸

         Android开机默认资源文件为:frameworks/base/core/res/res/values/config.xml

    我们找到wallpaper行:

    <string name="default_wallpaper_component">@null</string>

    系统默认壁纸一般是一张静态图片,这里设置的静态图片为@null空,那么壁纸到底在什么地方设置的呢?

    系统是在packages/apps/Launcher2/res 目录下根据配置文件找到静态壁纸进行设置的。

    修改静态默认壁纸:

            直接替换frameworks/base/core/res/res/drawable-nodpi/目录下的default_wallpaper.jpg文件即可。

    最后编译出来的apk文件:out/target/product/xx/system/framework/framework-res.apk

    修改动态桌面壁纸:

         Android的动态壁纸不是GIF图片,而是一个应用程序apk。其本质是一个Service,这个Service能够被主界面Launcher加载,那么Launcher

    又是如何识别这个包含动态壁纸的Service的apk的呢?

    例如:packages/wallpapers/PhaseBeam/AndroidManifest.xml

    <action Android:name="android.service.wallpaper.WallpaperService" />

    这里系统是通过APK的这个action把其当作一个动态墙纸加载进LivePicker列表,然后用户就可以在LivePicker列表里选择自己喜欢的墙纸设置,进而将动态墙纸显示进Launcher的背后。

    所以如果需要设置默认墙纸为动态墙纸的话,直接设置上面的frameworks/base/core/res/res/values/config.xml文件:

    <string name="default_wallpaper_component">com.android.phasebeam/com.android.phasebeam.PhaseBeamWallpaper</string>

    packages/wallpapers/PhaseBeam目录下的AndroidManifes.xml文件中:

    这里com.android.phasebeam对应着包名字

           com.android.phasebeam.PhaseBeamWallpaper 对应着Service的名字

    2)软件设置壁纸:

    设置壁纸的方法总结。

    壁纸设置方法有三种

           第一 通过WallpaperManager方法中的 setBitmap()

    第二 通过WallpaperManager方法中的 setResource()

    第三 通过ContextWrapper 类中提供的setWallpaper()方法

    由于 Activity 继承ContextThemeWrapper ,ContextThemeWrapper继承 ContextWrapper.

            1)通过实例化WallpaperManager 类调用单例类中setBitmap()方法。

    Java代码
    1. WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
    2. Resources res = getResources(); 
    3. Bitmap bitmap=BitmapFactory.decodeResource(res, getResources().getIdentifier("wallpaper" + imagePosition,"drawable", "com.ch"));  
    4. wallpaperManager.setBitmap(bitmap); 
    5. Toast.makeText(this,"设置成功", Toast.LENGTH_SHORT).show(); 
    WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
     Resources res = getResources();
     Bitmap bitmap=BitmapFactory.decodeResource(res, getResources().getIdentifier("wallpaper" + imagePosition, "drawable", "com.ch")); 
    wallpaperManager.setBitmap(bitmap);
    Toast.makeText(this, "设置成功", Toast.LENGTH_SHORT).show();

             2)第二 通过WallpaperManager方法中的 setResource()

    Java代码
    1. WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
    2.     try
    3.         wallpaperManager.setResource(getResources().getIdentifier("wallpaper" + imagePosition,"drawable", "com.ch")); 
    4. Toast.makeText(this,"设置成功", Toast.LENGTH_SHORT).show(); 
    5.     } catch (IOException e) { 
    6.         e.printStackTrace(); 
    WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
    	try {
    		wallpaperManager.setResource(getResources().getIdentifier("wallpaper" + imagePosition, "drawable", "com.ch"));
    Toast.makeText(this, "设置成功", Toast.LENGTH_SHORT).show();
    	} catch (IOException e) {
    		e.printStackTrace();
    }
    
    3)第三 通过ContextWrapper 类中提供的setWallpaper()方法
    Java代码
    1. //重写ContextWrapper中setWallpaper()方法 
    2. public void setWallpaper(InputStream paramInputStream)throws IOException { 
    3.         super.setWallpaper(paramInputStream); 
    4.         Toast.makeText(this,"设置成功", 1).show(); 
    5.  
    6. //设置壁纸代码 
    7.                         Resources localResources = getBaseContext().getResources(); 
    8.             InputStream localInputStream2 = localResources 
    9.                     .openRawResource(getResources().getIdentifier( 
    10.                             "wallpaper" + imagePosition, "drawable","com.ch")); 
    11.             try
    12.                 setWallpaper(localInputStream2); 
    13.             } catch (IOException e) { 
    14.                 e.printStackTrace(); 
    15.             } 

    3)修改默认语言、时区、型号等:

    out/target/product/xx/system/build.prop

    ro.product.model=G-BOX

    ro.product.local.language=zh

    ro.product.local.region=BJ

    persist.sys.timezone=Asiz/Shanghai

    4)修改Android开机的时候应用Logo

    源码:system/core/init/init.c

              system/core/init/logo.c

    init.c文件中:

    static int console_init_action(int nargs, char **args)
    {
    	...
    	if( load_565rle_image(INIT_IMAGE_FILE)) {	// INIT_IMAGE_FILE = /initlogo.rle
    		fd = open("dev/ttyp0", O_WRONLY);
    		if(fd >= 0) {
    			const char *msg;
    			msg = "
    ""
    ""
    ""A N D R O I D";
    			write(fd, msg, strlen(msg));
    			close(fd);
    		}
    	}
    	reurn 0;
    	
    }
    


    这里首先会通过load_565rle_image()函数去打开/initlogo.rle文件,如果打开失败,则直接显示输出ANDROID这个”图像“。

    所以这里我们有两种方法修改这个logo,一个是直接修改ANDROID字符串。另外一个是生成initlogo.rle文件

    方法1:修改console_init_action函数中ANDROID字符

    方法2:制作rle各式图片文件

        1) 使用linux下ImageMagick自带命令convert进行raw各式转换

           convert -depth 8 android_logo.png rgb:android_logo.raw

        2) 进入out/host/linux-x86/bin目录下找到rgb2565可执行文件

        3) 将需要转换的raw文件拷贝到同一目录,执行rgb2565 -rle <android_logo.raw> initlogo.rle生成initlogo.rle文件

        4)再将initlogog.rle 拷贝到out/target/product/xx/root/initlogo.rle编译生成img镜像文件即可

      

    5)修改Android动态logo

    frameworks/base/core/res/assets/images目录下 

           android-logo-mask.png   和 android-log-shine.png

    bootanimation开机动画:

     源码frameworks/base/cmds/bootanimation/目录下

  • 相关阅读:
    Ts基础
    SWF 文件不能本地访问 只有仅限于文件系统的 SWF 文件
    laya的UI编辑器
    目前支持WebGL的浏览器有哪些?
    Laya学习
    egret学习
    PHP 获取上月,本月,近15天,近30天日期
    深入浅出:MySQL的左连接、右连接、内连接
    div中 li宽度不固定 ie6和ie7不兼容不自动换行
    8款给力HTML5/CSS3应用插件 可爱的HTML5笑脸
  • 原文地址:https://www.cnblogs.com/pangblog/p/3323158.html
Copyright © 2020-2023  润新知