android添加資源
1. android應用程序中使用資源類型有哪些
動畫資源:
補間動畫保存在 res/anim/下,從R.anim類訪問。
幀動畫保存在 res/drawable/ 下,從R.drawable類訪問。
顏色狀態列表資源:
保存在res/color/ 下,從R.color類訪問
drawable 資源:
用點陣圖或XML定義各種圖形。
保存在 res/drawable/ 下,從R.drawable類訪問。
布局資源:
程序的界面
保存在res/layout/下,從R.layout類訪問。
菜單資源
定義您的應用程序菜單中的內容。
保存在res/menu/下,從R.menu類訪問。
字元串資源
定義字元串,字元串數組和復數形式(包括字元串格式和樣式)。
保存在res/values/下,從R.string, R.array,和 R.plurals類訪問。
定義用戶界面元素的外觀和格式。
保存在res/values/下,從R.style類訪問。
更多的資源類型
如布爾值、整數、尺寸、顏色和其他數組資源的定義。
保存在res/values/下,但是每個從獨特的R子類訪問(如R.bool、R.integer、R.dimen等)
2. Android資源載入 ——Resource初始化【學習】
在探討Android資源載入機制時,重點在於理解如何在不同層級(如Activity、Fragment、Application)中初始化和管理資源。此過程主要涉及基礎概念、流程分析以及資源初始化的關鍵步驟。
從基礎概念出發,我們了解了在Activity中通過`getX()`相關方法獲取資源時,實際操作是通過`getResource().x`完成的,其中`getResource()`來源於`Context`。`Context`作為頂級抽象類,其子類如`Activity`和`Application`實現了`Context`介面,因此資源初始化的源頭在於`ContextImpl`類。
在構建Activity之前,`ContextImpl.createActivityContext()`方法被調用,用於創建`context`實例。這一階段,`ContextImpl`獲取當前解析度、`classLoader`等配置信息,並通過`ResourcesManager.getInstance()`獲取`ResourcesManager`單例對象,進而創建資源。資源最終被保存在`contextImpl.mResources`中,同時進行兼容性判斷,確保資源載入的適應性。
深入`resourcesManager.createBaseTokenResources()`方法,可以發現資源創建流程分為關鍵步驟。首先通過`ResourcesManager.()`獲取或創建`ActivityResources`,若存在則直接返回;否則創建並保存。接著,`ResourcesManager.updateResourcesForActivity()`方法用於更新活動的資源配置,如果配置一致則直接返回。通過差異更新並返回新的`ResourcesKey`,從而獲取對應的`impl`資源實現類,確保資源載入的高效性和兼容性。
當通過`()`方法查找特定資源時,資源管理器內部首先獲取當前token對應的`activityResources`,遍歷所有資源,返回符合查找條件的資源。在資源創建過程中,`ResourcesManager.createResourcesForActivity()`方法通過資源標識查找對應的`ResourcesImpl`,並創建新的資源。
在`Application`級別,資源初始化始於`ContexntImpl.createSystemContext()`方法,此方法創建系統上下文對象,同時初始化`LoadedApk`管理系統包信息,創建`ContextImpl`並調用`LoadedApk.getResources()`獲取系統資源對象。進一步,`ResourcesManager.getResources()`方法判斷資源是否存在,不存在時調用`createResourceForActivity()`或`createResources()`創建資源,確保資源載入的完整性和有效性。
在`System`資源層次中,`Resources.getSystem()`方法實際上調用框架層資源對象,通過初始化確保資源可用。注意,系統框架層資源管理器使用系統框架層APK作為資源路徑,因此無法直接載入應用內部資源文件。
理解ActivityResource和`ActivityResources`的概念有助於我們更好地管理活動的資源集合。每個活動可能關聯多個資源,因此`ActivityResources`是一個包含所有資源的集合,存儲在`ResourcesManager`中。每次初始化活動時,都會創建相應的`ActResources`並添加到管理器中作為緩存。最終,資源載入是一個代理對象,開發者通過此對象調用,而真正的資源實現類`ResourcesImpl`被全局緩存,以提高資源載入的性能和效率。
在Android開發中,資源載入機制是核心技術點之一。通過深入了解和掌握資源初始化流程,可以更高效地進行資源管理,優化應用性能。推薦進一步參考《Android核心技術手冊》等資料,獲取更深入的Android開發進階知識。
3. 如何在一個android工程中調用另一個android工程的代碼和資源啊
現在已經有了一個Android工程A。我們想擴展A的功能,但是不想在A的基礎上做開發,於是新建了另外一個Android工程B,想在B中引用A。
1. 把工程A做成純Jar包,這樣其他的工程就可以直接引用了。
但是,如果在工程A中用了R.java中的引用,則無法打成jar包了。原因是R.java是自動生成的,是動態的,每次編譯都是不相同的。如果一定要做成jar包,就不能使用自動生成的R文件,用到資源時候就要寫代碼去獲取。
有時會報錯:Conversion to Dalvik format failed with error 1
可能是多層包文件重復導入,沖突。。。
這時可以試試方法2
2.將工程A做成android library project。
設置工程A,右鍵->Properties->Android,將Is library項選中,然後Apply。設置工程B,右鍵->Properties->Android,在Library中,點擊Add按鈕,將A工程加入,然後Apply。此時在B中就引入了A中的資源和代碼,這些資源和代碼都可以直接調用。需要注意的是,因為A已經不再是一個完整的Android應用,而是一個類庫工程,所以有一些內容還需要在B中配置一下。比如A中有lib庫引用,則B中也要加入該lib庫;比如A中的AndroidManifest.xml文件的內容,在B的AndroidManifest.xml文件中也要相應加上。。。
如果不需要引用A工程的資源文件,同樣只需得到jar文件,
設置工程A,右鍵->Properties->Android,將Is library項選中,然後Apply。在A工程的bin目錄下能得到一個jar文件,可以到B工程中的libs目錄下直接引用。
如果能用jar當然最好,但是jar文件不能把res目錄下的資源打包進去,所以才出現lib工程。
創建和使用Android library工程
摘要: 創建library供多個工程共享代碼、資源是非常常見的需求,網上這種資料非常少,基本上都是講創建java工程,然後export,這種方式缺點非常多,大家可以自己google一下。本文著重介紹如何創建Android library,並且在 ...
創建library供多個工程共享代碼、資源是非常常見的需求,網上這種資料非常少,基本上都是講創建java工程,然後export,這種方式缺點非常多,大家可以自己google一下。
本文著重介紹如何創建Android library,並且在工程中使用此library提供的資源,具體步驟如下:
1. 創建一個Android工程,命名為MyLib
2. 進入工程設置選中Is Library
3. 創建另一個Android工程,命名為MyProj
4. 進入工程設置,添加MyLib
5. 在MyProj的AndroidManifest.xml中加入對library中activity的引用
<activity android:name="net.devdiv.mylib.MyLib" />
6. 由於編譯後library中的資源和引用它的project資源是合並在一起的,為了避免重名問題,需要對library中資源進行重命名
1). 把main.xml改為mylib.xml,同時修改MyLib.java代碼setContentView(R.layout.mylib);
2). strings.xml修改為
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="mylibhello">String fetched from lib!</string>
<string name="mylib_app_name">MyLib</string>
</resources>
7. 在MyProj中引用MyLib的資源
package net.devdiv.myproj;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import net.devdiv.mylib.*;
import android.content.Intent;
public class MyProj extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView)findViewById(R.id.myprojtext);
tv.setText(R.string.mylibhello);
Intent it = new Intent(this, MyLib.class);
startActivity(it);
}
}
4. 如何在Android Studio添加本地aar包引用
1、新建一個Demo項目
2、新建好的項目結構如下圖:
其中app是我們的主要mole,
libs下存放外部的library
build.gradle是配置App mole的,接下來主要對其操作。
5. 如何為Android系統添加一個新的資源包
如何為Android系統添加一個新的資源包
傳統的Android系統只有一個framework-res.apk資源包,第三方廠商在進行rom定製時會直接修改framework res資源,達到美化目的。但是這種方式跟原生資源的耦合度過高,在系統遷移或者framework ui移植時需要進行人工merge,工作量巨大。通過為Android添加一個新的獨立的資源包,可以將廠商定製資源獨立出來,可移植、可維護性非常好。
具體做法可以分為以下幾個步驟:
1. 修改build/core/clear_var.mk
LOCAL_USE_LETV_FRAMEWORK_RES:= true
2. 修改build/core/package.mk
以下腳本可以加在 $(R_file_stamp): $(framework_res_package_export_deps) 之前,然後修改$(R_file_stamp): $(framework_res_package_export_deps) 和 $(LOCAL_INTERMEDIATE_TARGETS): \
PRIVATE_AAPT_INCLUDES := $(framework_res_package_export)
如下所示:
view sourceprint?
1 ifeq ($(LOCAL_USE_LETV_FRAMEWORK_RES),true)
2 letv_framework_res_package_export := \
3 $(call intermediates-dir-for,APPS,letv-framework-res,,COMMON)/package-export.apk
4 letv_framework_res_package_export_deps := \
5 $(dir $(letv_framework_res_package_export))src/R.stamp
6 else
7 letv_framework_res_package_export :=
8 letv_framework_res_package_export_deps :=
9 endif # LOCAL_USE_LETV_FRAMEWORK_RES
view sourceprint?
1 $(R_file_stamp): $(framework_res_package_export_deps) $(letv_framework_res_package_export_deps)
2 $(LOCAL_INTERMEDIATE_TARGETS): \
3 PRIVATE_AAPT_INCLUDES := $(framework_res_package_export) \
4 $(letv_framework_res_package_export)
5 endif # LOCAL_NO_STANDARD_LIBRARIES
3. 修改build/target/proct/core.mk
在PRODUCT_PACKAGES增加letv-framework-res
4. 添加一個新的資源包項目,這里在framework/base/core/res同級目錄下建立一個新的文件夾letv_res用來存放我們的資源。把res目錄下的AndroidManifest.xml和Android.mk拷貝過來,進行修改。
記得設置LOCAL_USE_MY_FRAMEWORK_RES為false。
view sourceprint?
01 LOCAL_PATH:= $(call my-dir)
02 include $(CLEAR_VARS)
03
04 LOCAL_MODULE_TAGS := optional
05
06 LOCAL_PACKAGE_NAME := letv-framework-res
07 LOCAL_CERTIFICATE := platform
08
09 # Set LOCAL_USE_LETV_FRAMEWORK_RES as false
10 LOCAL_USE_LETV_FRAMEWORK_RES := false
11
12 # Tell aapt to create "extending (non-application)" resource IDs,
13 # since these resources will be used by many apps.
14 LOCAL_AAPT_FLAGS := -x
15
16 # Install this alongside the libraries.
17 LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
18
19 # Create package-export.apk, which other packages can use to get
20 # PRODUCT-agnostic resource data like IDs and type definitions.
21 LOCAL_EXPORT_PACKAGE_RESOURCES := true
22
23 # Include resources generated by system RenderScript files.
24 framework_GENERATED_SOURCE_DIR := $(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)/src
25 framework_RenderScript_STAMP_FILE := $(framework_GENERATED_SOURCE_DIR)/RenderScript.stamp
26 #LOCAL_RESOURCE_DIR := $(framework_GENERATED_SOURCE_DIR)/renderscript/res $(LOCAL_PATH)/res
27
28 include $(BUILD_PACKAGE)
29
30 # Make sure the system .rs files get compiled before building the package-export.apk.
31 #$(resource_export_package): $(framework_RenderScript_STAMP_FILE)
32
33 # define a global intermediate target that other mole may depend on.
34 .PHONY: letv-framework-res-package-target
35 letv-framework-res-package-target: $(LOCAL_BUILT_MODULE)
view sourceprint?
01 <?xml version="1.0" encoding="utf-8"?>
02 <manifest xmlns:android=""
03 package="letv" coreApp="true" android:sharedUserId="android.uid.system"
04 android:sharedUserLabel="@null">
05
06 <application android:process="system"
07 android:persistent="true"
08 android:hasCode="false"
09 android:label="@null"
10 android:allowClearUserData="false"
11 android:killAfterRestore="false"
12 android:icon="@null">
13
14 </application>
15
16 </manifest>
資源的放置跟res下的類似,記得values目錄下創建public.xml,public.xml對id的類型區分比較嚴格,attr必須是0x0x010000開頭,drawable必須是0x0x020000開頭,其他類型好像就沒有限制,直接依次0x0x030000、0x0x040000開始即可。否則,編譯過程中會出現segmentation fault錯誤。
view sourceprint?
1 <resources>
2 <public type="attr" name="cForeground" id="0x03010000" />
3 <public type="drawable" name="ic_filemanager" id="0x03020000" />
4 <public type="style" name="LetvTheme" id="0x03030000" />
5 <public type="string" name="letv" id="0x03040000" />
6 <public type="dimen" name="letv_width" id="0x03050000" />
7 <public type="layout" name="letv_text" id="0x03060000" />
8 </resources>
5. 以上只是解決了資源的編譯環境問題,資源的查找過程也需要進行修改,修改 AssetManager.java,在init()後添加代碼 addAssetPath("/system/framework/letv-framework-res.apk");
view sourceprint?
01 public AssetManager() {
02 synchronized (this) {
03 if (DEBUG_REFS) {
04 mNumRefs = 0;
05 incRefsLocked(this.hashCode());
06 }
07 init();
08 addAssetPath("/system/framework/letv-framework-res.apk");
09 if (localLOGV) Log.v(TAG, "New asset manager: " + this);
10 ensureSystemAssets();
11 }
12 }
6. 最後就是資源應用問題。應用程序在xml文件中引用letv-framework-res.apk中的資源時可以使用與原生資源類似的訪問方式,首先聲明letv xmlns :
view sourceprint?
1 xmlns:letv=""
然後像@android:drawable @android:dimen這種引用方式改成@letv:drawable @letv:dimen即可。
view sourceprint?
01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout
03 xmlns:android=""
04 xmlns:letv=""
05 android:layout_width="fill_parent"
06 android:layout_height="wrap_content"
07 android:gravity="center"
08 android:paddingTop="@letv:dimen/letv_width"
09 android:orientation="horizontal" >
10
11 <ImageView android:id="@+id/file_icon"
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:layout_gravity="center"
15 android:layout_marginBottom="40dp"
16 android:src="@letv:drawable/ic_filemanager" />
17
18 </LinearLayout>
轉載,僅供參考。
6. 如何向android項目添加音樂資源
在res目錄下新建一個raw文件夾,直接復制mp3文件到raw目錄下,R.java會自動生成id(mp3文件本身就是二進制流文件)
不建議這么做,會導致apk包很大,上傳到模擬器運行時會很慢,而且如果在創建模擬器時指定的內存不夠大,console控制台會提示失敗
最好為模擬器指定一個SDCard目錄,通過adb push上傳mp3文件,可以通過contentprivider訪問SDCard中的資源
7. android中怎麼添加本地音樂
按照以下步驟來吧。
1、手機連接電腦,如果是Win7的話,應該可以識別。有的手機為了安全,會把和電腦USB連接的時候設置成只充電,這里需要你自己手動更改一下,如圖,點擊輕敲獲取其他USB選項。
其他的音樂播放app,都差不多一樣的流程。