SlideShare a Scribd company logo
Android 资源管理机制
 Android 资源管理机制

    徐仙明@umeng



                徐仙明
                @人山日月
                xuxianming@umeng.com
友盟简介


1   专业的移动开发服务平台

2   统计分析、开发工具与应用联盟

3   数据报告

4   行业沙龙
Overview



   什么是资源
   资源种类、定义
   系统(Framework)资源
   应用资源
   访问资源
   换肤
什么是资源



   描述UI
     • 图片
     • 布局
     • 字符串
     • Raw
     • Etc.
   XML
     • 界面(UI设计师)和逻辑(码农)分离
         • 前端工程师(html,css,js) v.s. 后端工程师(jsp, java,…)
资源种类



   Res
    •    res/anim
    •    res/drawable
    •    res/layout
    •    res/menu
    •    res/raw
    •    res/values-? (zh, etc. 语言/分辨率/版本等 qualifier name)
        •    strings.xml
        •    styles.xml
        •    attrs.xml
        •    colors.xml
        •    arrarys.xml
        •    ...
    •    res/xml
    •    …
定义资源(XML)



   属性-值 (attr-value)
     • 定义属性
        • styleable (schema)
     • 赋值
        • Layout, Style
        • value type
             – int, boolean, float, String, reference
     • E.g. TextView
资源定义 - Case study


                                              android.widget.TextView
platform_frameworks_base/core/res/res/values/attrs.xml
                                                                   platform_frameworks_base/core/java/android/widget/TextView.ja
                                                                   va
 <declare-styleable name="TextView">
      <!-- Determines the minimum type that getText() will         public TextView(Context context,
return.                                                                          AttributeSet attrs,
The default is "normal".                                                         int defStyle) {                      AttributeSet
Note that EditText and LogTextBox always return Editable,               super(context, attrs, defStyle);
even if you specify something less powerful here. -->                   …
      <attr name="bufferType">                                              a = theme.obtainStyledAttributes(
         <!-- Can return any CharSequence, possibly a
                                                          TypedArray                     attrs,
Spanned one if the source text was Spanned. -->                           com.android.internal.R.styleable.TextView, defStyle, 0);
         <enum name="normal" value="0" />                                 ……
         <!-- Can only return Spannable. -->
         <enum name="spannable" value="1" />                                    int n = a.getIndexCount();
         <!-- Can only return Spannable and Editable. -->                       for (int i = 0; i < n; i++) {
         <enum name="editable" value="2" />                                        int attr = a.getIndex(i);
      </attr>                                                                      switch (attr) {
      <!-- Text to display. -->                                                   ….
      <attr name="text" format="string"                                            case com.android.internal.R.styleable.TextView_text:
localization="suggested" />                                                                   text = a.getText(attr);
      <!-- Hint text to display when the text is empty. -->                        break;
      <attr name="hint" format="string" />                                        ….
      <!-- Text color. -->                                                        }
      <attr name="textColor" />                                           …..
      <!-- Color of the text selection highlight. -->                      a.recycle();
      <attr name="textColorHighlight" />
      <!-- Color of the hint text. -->
      <attr name="textColorHint" />
在Android架构中的位置




                 framework.jar(android.jar)
                 framework-res.apk




                                  core.jar
系统资源 - 追溯到源码中




platform_frameworks_base/core/java/android/content/res/
Reference: https://github.com/android/platform_frameworks_base/tree/master/core/res/res
应用资源


                                com.app.apk




 /META-INF        /res          resources.arsc   AndroidManifest.xml   classes.dex




                                     >aapt d resources com.app.apk
     CERT.RSA       /drawable




      CERT.SF        /layout




    MANIFEST.MF          /xml
Dalvik 共享资源



   创建 Zygote (app_process)进程(init.rc)
   Zygote fork出 SystemServer 进程
   Zygote加载类 (preloadClasses())
     • frameworks/base/preload-classes
   Zygote加载资源(preloadResources())
     • frameworks/base/core/res/res/values/arrays.xml
   Zygote fork创建app进程
Dalvik 共享资源



                      DalvikVm
        DalvikVm                   DalvikVm    DalvikVm
                    SystemServer
       Zygote进程                    普通APK进程     普通APK进程
                         进程



         Socket        Socket      APK自身程      APK自身程
         服务端           客户端         序以及资源       序以及资源




       Framework     Framework     Framework   Framework
        共享类以及         共享类以及         共享类以及       共享类以及
        共享资源          共享资源          共享资源        共享资源



                   同一段物理内存空间(Copy on write)

Reference: Android 内核剖析
创建应用进程




  Reference: Android 内核剖析
访问资源
                              static void android_content_AssetManager_init(JNIEnv* env, jobject
                              clazz)
                              {
                                 AssetManager* am = new AssetManager();
                                 if (am == NULL) {
   Context                          jniThrowException(env, "java/lang/OutOfMemoryError", "");
                                     return;
     • 应用内资源                     }
     • Context.getResources     am->addDefaultAssets();        (/system/framework/framework-res.apk)
         • AssetManager          LOGV("Created AssetManager %p for Java object %pn", am,
                              clazz);
                                 env->SetIntField(clazz, gAssetManagerOffsets.mObject,
   PackageManager            (jint)am);
                              }
     • 其他应用的资源
应用换肤



   内置
     • If(skin1) png1… else png2…
   外置
     • 可下载
     • Apk
         • 将皮肤apk和应用放在同一进程中
         • 有同样的签名,配置AndroidManifest.xml文件中android:sharedUserId
           属性值相同
              Context context = Context.createPackageContext("packagename.customskin",
              Context.CONTEXT_IGNORE_SECURITY);
              Drawable drawable = context.getResources().getDrawable(R.drawable.icon);

          • E.g. AdwLauncher
    •   zip
          • 把皮肤文件解压缩到/data/data/[package name]/skin路径下
          • E.g. 墨迹(mja), 搜狗输入法(sga)



Reference: Android应用如何实现换肤功能
应用换肤 - Case Study



                    # ls /sdcard/moji/temp
                    103.zip
                    # ls /sdcard/moji/skin103
                    colon_b.png
                    colon_w.png
                    n0.png
                    n1.png
                    n2.png
                    n3.png
                    n4.png
                    n5.png
                    n6.png
                    n7.png
                    n8.png
                    n9.png
                    preview.jpg
                    setting.xml
                    widget_4x1_bkg.png
                    widget_4x2_bkg.png
                    logo.jpg
                    skininfo.txt
                    #
系统换肤



   修改AssetManager.cpp 初始化提供framework-res.apk路径(C++)
   修改Resources.java(Java)
Q&A

More Related Content

PDF
Android Resource Manager
Sandeep Marathe
 
ZIP
Hrm database-management-java-project
chetanmbhimewal
 
PPTX
Human Resource Management System(HRMS)
Ariful Islam
 
PPT
Chat application
Mudasir Sunasara
 
PDF
旺铺前端设计和实现
hua qiu
 
PPTX
Ecma script edition5-小试
lydiafly
 
PDF
Postgre sql intro 0
March Liu
 
PPTX
iOS程序设计-数据持久化
qiyutan
 
Android Resource Manager
Sandeep Marathe
 
Hrm database-management-java-project
chetanmbhimewal
 
Human Resource Management System(HRMS)
Ariful Islam
 
Chat application
Mudasir Sunasara
 
旺铺前端设计和实现
hua qiu
 
Ecma script edition5-小试
lydiafly
 
Postgre sql intro 0
March Liu
 
iOS程序设计-数据持久化
qiyutan
 

Similar to Android resource-management (20)

PPT
Huangjing renren
d0nn9n
 
PDF
Ooredis
iammutex
 
PDF
Ooredis
iammutex
 
KEY
Tec android-01
jinkaichen
 
PPT
千呼萬喚始出來的Java SE 7
javatwo2011
 
PPT
Sun java
softwaredesigner
 
PPT
JQuery 学习
cssrain
 
PDF
Java Jdk6学习笔记[Ppt]
yiditushe
 
PDF
运维系统开发与Rails 3页面开发实践
Li JianYe
 
PPT
JavaScript 脚本控件(二)
RANK LIU
 
KEY
Scala
popeast
 
PPT
缓存技术浅谈
Robbin Fan
 
PDF
Berserk js
taobao.com
 
PPT
Asp.net mvc 培训
lotusprince
 
DOCX
Spring4.x + hibernate4.x_配置详解
zany_hui
 
PPTX
Glider
windyrobin
 
PPTX
Script with engine
Webrebuild
 
KEY
Flex 4.5 action data communication
jexchan
 
PDF
Node way
Ethan Zhang
 
PDF
一拍一产品背后的故事(React实战)
Kejun Zhang
 
Huangjing renren
d0nn9n
 
Ooredis
iammutex
 
Ooredis
iammutex
 
Tec android-01
jinkaichen
 
千呼萬喚始出來的Java SE 7
javatwo2011
 
JQuery 学习
cssrain
 
Java Jdk6学习笔记[Ppt]
yiditushe
 
运维系统开发与Rails 3页面开发实践
Li JianYe
 
JavaScript 脚本控件(二)
RANK LIU
 
Scala
popeast
 
缓存技术浅谈
Robbin Fan
 
Berserk js
taobao.com
 
Asp.net mvc 培训
lotusprince
 
Spring4.x + hibernate4.x_配置详解
zany_hui
 
Glider
windyrobin
 
Script with engine
Webrebuild
 
Flex 4.5 action data communication
jexchan
 
Node way
Ethan Zhang
 
一拍一产品背后的故事(React实战)
Kejun Zhang
 
Ad

Android resource-management

  • 1. Android 资源管理机制 Android 资源管理机制 徐仙明@umeng 徐仙明 @人山日月 [email protected]
  • 2. 友盟简介 1 专业的移动开发服务平台 2 统计分析、开发工具与应用联盟 3 数据报告 4 行业沙龙
  • 3. Overview  什么是资源  资源种类、定义  系统(Framework)资源  应用资源  访问资源  换肤
  • 4. 什么是资源  描述UI • 图片 • 布局 • 字符串 • Raw • Etc.  XML • 界面(UI设计师)和逻辑(码农)分离 • 前端工程师(html,css,js) v.s. 后端工程师(jsp, java,…)
  • 5. 资源种类  Res • res/anim • res/drawable • res/layout • res/menu • res/raw • res/values-? (zh, etc. 语言/分辨率/版本等 qualifier name) • strings.xml • styles.xml • attrs.xml • colors.xml • arrarys.xml • ... • res/xml • …
  • 6. 定义资源(XML)  属性-值 (attr-value) • 定义属性 • styleable (schema) • 赋值 • Layout, Style • value type – int, boolean, float, String, reference • E.g. TextView
  • 7. 资源定义 - Case study android.widget.TextView platform_frameworks_base/core/res/res/values/attrs.xml platform_frameworks_base/core/java/android/widget/TextView.ja va <declare-styleable name="TextView"> <!-- Determines the minimum type that getText() will public TextView(Context context, return. AttributeSet attrs, The default is "normal". int defStyle) { AttributeSet Note that EditText and LogTextBox always return Editable, super(context, attrs, defStyle); even if you specify something less powerful here. --> … <attr name="bufferType"> a = theme.obtainStyledAttributes( <!-- Can return any CharSequence, possibly a TypedArray attrs, Spanned one if the source text was Spanned. --> com.android.internal.R.styleable.TextView, defStyle, 0); <enum name="normal" value="0" /> …… <!-- Can only return Spannable. --> <enum name="spannable" value="1" /> int n = a.getIndexCount(); <!-- Can only return Spannable and Editable. --> for (int i = 0; i < n; i++) { <enum name="editable" value="2" /> int attr = a.getIndex(i); </attr> switch (attr) { <!-- Text to display. --> …. <attr name="text" format="string" case com.android.internal.R.styleable.TextView_text: localization="suggested" /> text = a.getText(attr); <!-- Hint text to display when the text is empty. --> break; <attr name="hint" format="string" /> …. <!-- Text color. --> } <attr name="textColor" /> ….. <!-- Color of the text selection highlight. --> a.recycle(); <attr name="textColorHighlight" /> <!-- Color of the hint text. --> <attr name="textColorHint" />
  • 8. 在Android架构中的位置 framework.jar(android.jar) framework-res.apk core.jar
  • 9. 系统资源 - 追溯到源码中 platform_frameworks_base/core/java/android/content/res/ Reference: https://github.com/android/platform_frameworks_base/tree/master/core/res/res
  • 10. 应用资源 com.app.apk /META-INF /res resources.arsc AndroidManifest.xml classes.dex >aapt d resources com.app.apk CERT.RSA /drawable CERT.SF /layout MANIFEST.MF /xml
  • 11. Dalvik 共享资源  创建 Zygote (app_process)进程(init.rc)  Zygote fork出 SystemServer 进程  Zygote加载类 (preloadClasses()) • frameworks/base/preload-classes  Zygote加载资源(preloadResources()) • frameworks/base/core/res/res/values/arrays.xml  Zygote fork创建app进程
  • 12. Dalvik 共享资源 DalvikVm DalvikVm DalvikVm DalvikVm SystemServer Zygote进程 普通APK进程 普通APK进程 进程 Socket Socket APK自身程 APK自身程 服务端 客户端 序以及资源 序以及资源 Framework Framework Framework Framework 共享类以及 共享类以及 共享类以及 共享类以及 共享资源 共享资源 共享资源 共享资源 同一段物理内存空间(Copy on write) Reference: Android 内核剖析
  • 13. 创建应用进程 Reference: Android 内核剖析
  • 14. 访问资源 static void android_content_AssetManager_init(JNIEnv* env, jobject clazz) { AssetManager* am = new AssetManager(); if (am == NULL) {  Context jniThrowException(env, "java/lang/OutOfMemoryError", ""); return; • 应用内资源 } • Context.getResources am->addDefaultAssets(); (/system/framework/framework-res.apk) • AssetManager LOGV("Created AssetManager %p for Java object %pn", am, clazz); env->SetIntField(clazz, gAssetManagerOffsets.mObject,  PackageManager (jint)am); } • 其他应用的资源
  • 15. 应用换肤  内置 • If(skin1) png1… else png2…  外置 • 可下载 • Apk • 将皮肤apk和应用放在同一进程中 • 有同样的签名,配置AndroidManifest.xml文件中android:sharedUserId 属性值相同 Context context = Context.createPackageContext("packagename.customskin", Context.CONTEXT_IGNORE_SECURITY); Drawable drawable = context.getResources().getDrawable(R.drawable.icon); • E.g. AdwLauncher • zip • 把皮肤文件解压缩到/data/data/[package name]/skin路径下 • E.g. 墨迹(mja), 搜狗输入法(sga) Reference: Android应用如何实现换肤功能
  • 16. 应用换肤 - Case Study # ls /sdcard/moji/temp 103.zip # ls /sdcard/moji/skin103 colon_b.png colon_w.png n0.png n1.png n2.png n3.png n4.png n5.png n6.png n7.png n8.png n9.png preview.jpg setting.xml widget_4x1_bkg.png widget_4x2_bkg.png logo.jpg skininfo.txt #
  • 17. 系统换肤  修改AssetManager.cpp 初始化提供framework-res.apk路径(C++)  修改Resources.java(Java)
  • 18. Q&A