當前位置:首頁 » 安卓系統 » android添加資源

android添加資源

發布時間: 2024-10-28 00:47:53

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,都差不多一樣的流程。

熱點內容
手機管家安卓是哪個公司的 發布:2024-10-28 03:31:42 瀏覽:929
傳奇聯機伺服器搭建教程 發布:2024-10-28 03:29:54 瀏覽:865
我的世界小月不靈姐生存伺服器 發布:2024-10-28 03:29:51 瀏覽:561
python多線程效率 發布:2024-10-28 03:28:33 瀏覽:10
唐嫣訪問 發布:2024-10-28 03:23:32 瀏覽:520
k2p選擇內核編譯版本 發布:2024-10-28 03:08:13 瀏覽:361
linux訪問php 發布:2024-10-28 03:07:24 瀏覽:876
我的世界1122伺服器掃地機器人 發布:2024-10-28 03:06:49 瀏覽:81
雲伺服器更換公網ip有什麼用 發布:2024-10-28 02:56:14 瀏覽:2
1h1g伺服器搭建游戲 發布:2024-10-28 02:51:46 瀏覽:717