花粉俱乐部  logo 花粉俱乐部  因为热爱
搜索 |
[实用教程]

Android framework 资源文件分析

[复制帖子标题和链接]

25546

KangVIP  HRT团队  发表于 2013-9-18 11:24:45 来自:浏览器

最新回复 2019-1-27 19:35:15

原生Google Android Framework 修改:


1)修改开机默认壁纸
     Android开机默认资源文件为:frameworks/base/core/res/res/values/config.xml
我们找到wallpaper行:

  1. <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文件:
  1. <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()方法。
  1. 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();
复制代码

  
  1. <span style="font-size:14px">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();</span>  
复制代码


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

  1. 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(); }  
复制代码


  1. <span style="font-size:14px">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();  }  </span>
复制代码
  
3)第三 通过ContextWrapper 类中提供的setWallpaper()方法


  1. //重写ContextWrapper中setWallpaper()方法 public void setWallpaper(InputStream paramInputStream)throws IOException {         super.setWallpaper(paramInputStream);         Toast.makeText(this,"设置成功", 1).show(); }  //设置壁纸代码                         Resources localResources = getBaseContext().getResources();             InputStream localInputStream2 = localResources                     .openRawResource(getResources().getIdentifier(                             "wallpaper" + imagePosition, "drawable","com.ch"));             try {                 setWallpaper(localInputStream2);             } catch (IOException e) {                 e.printStackTrace();             }
复制代码



3)修改默认语言、时区、型号等:
  1. out/target/product/xx/system/build.propro.product.model=G-BOXro.product.local.language=zhro.product.local.region=BJpersist.sys.timezone=Asiz/Shanghai
复制代码



4)修改Android开机的时候应用Logo
源码:system/core/init/init.c
          system/core/init/logo.c
init.c文件中:

  1. 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 = "\n""\n""\n""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/目录下


花粉6687899  登峰造极  发表于 2013-9-18 14:02:55 来自:浏览器
好东西一定要顶            
liusiyu  已臻大成  发表于 2013-9-18 19:54:10 来自:浏览器
收藏学习
花粉6490541  独步江湖  发表于 2013-9-18 22:56:33 来自:浏览器

收藏学习
杰西205  已臻大成  发表于 2018-7-31 13:43:04 来自:荣耀6 H60-L03
必须顶

点评

看看  发表于 2018-8-1 08:27
杰西205  已臻大成  发表于 2019-1-27 19:35:15 来自:荣耀畅玩4C CHM-TL00H
帮顶,这个对我很有用(尽管EMUI不管用),原生很有用(比如rr)
您需要登录后才可以回帖 登录 | 立即注册

工具下载

  • 花粉客户端官方

    Make it Possible

粤ICP备19015064号-4|备案主体编号:44201919072182| 粤公网安备 44190002003939号

Copyright © 2012-2019 华为终端有限公司 版权所有

快速回复 返回顶部 返回列表