1. 程式人生 > >外掛資源管理

外掛資源管理

宿主程式調起未安裝的apk,一個很大的問題就是資源如何訪問,具體來說就是,凡是以R開頭的資源都不能訪問了,因為宿主程式中並沒有apk中的資源,所以通過R來載入資源是行不通的。
報錯:無法找到某某id所對應的資源

針對這個問題,有幾種解決辦法:
1、apk中的資源在宿主程式中也copy一份,這種方法不太好,會額外增加資源的體積,外掛中一份,主app中copy一份,再者,每次發包都要,更新主app,這樣就失去外掛化的意義了。
2、將apk中的資源解壓出來,然後通過檔案流去讀取資源,這種方法可行,不過不是所有的訪問資源API都支援,且不同資源有不同的檔案流格式,比如圖片、xml等,還有就是針對不同裝置載入的資源可能是不一樣的。
3、建立AssetManager,Resource,根據指定資源目錄訪問資源,這是本文介紹的,也是目前市面上外掛化使用的訪問未載入apk資源的方式

activity的工作主要是由ContextImpl來完成的, 它在activity中是一個叫做mBase的成員變數。注意到Context中有如下兩個抽象方法,實際上context就是通過它們來獲取資源的,這兩個抽象方法的真正實現在ContextImpl中。也即是說,只要我們自己實現這兩個方法,就可以解決資源問題了。

   public abstract AssetManager getAssets();

   public abstract Resources getResources();

    protected void loadResources() {  
        try {  
            AssetManager assetManager = AssetManager.class
.newInstance(); Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class); //mDexPath apk的路徑 addAssetPath.invoke(assetManager, mDexPath); mAssetManager = assetManager; } catch (Exception e) { e.printStackTrace
(); } Resources superRes = super.getResources(); mResources = new Resources(mAssetManager, superRes.getDisplayMetrics(), superRes.getConfiguration()); mTheme = mResources.newTheme(); mTheme.setTo(super.getTheme()); }

說明:載入的方法是通過反射,通過呼叫AssetManager中的addAssetPath方法,我們可以將一個apk中的資源載入到Resources中,由於addAssetPath是隱藏api我們無法直接呼叫,所以只能通過反射通過註釋我們可以看出,傳遞的路徑可以是zip檔案也可以是一個資源目錄,而apk就是一個zip,所以直接將apk的路徑傳給它,資源就載入到AssetManager中了,然後再通過AssetManager來建立一個新的Resources物件,這個物件就是我們可以使用的apk中的資源了,這樣我們的問題就解決了。

實現那兩個抽象方法

    @Override  
    public AssetManager getAssets() {  
        return mAssetManager == null ? super.getAssets() : mAssetManager;  
    }  

    @Override  
    public Resources getResources() {  
        return mResources == null ? super.getResources() : mResources;  
    }  

okay,問題搞定。這樣一來,在apk中就可以通過R來訪問資源了。

相關推薦

外掛資源管理

宿主程式調起未安裝的apk,一個很大的問題就是資源如何訪問,具體來說就是,凡是以R開頭的資源都不能訪問了,因為宿主程式中並沒有apk中的資源,所以通過R來載入資源是行不通的。 報錯:無法找到某某id所對應的資源 針對這個問題,有幾種解決辦法: 1、apk中

eclipse外掛開發入門——使用command實現在資源管理器中定位資源

Eclipse外掛開發之command Eclipse提供了三種命令與操作的方式:動作ActionSets、彈出選單popupmenus、命令Command,其中前兩種因為耦合過於緊密,在未來版本中可能棄用,不建議使用。 ActionSets方式使用的是擴充套件點org.

Unity 資源管理外掛

之所以寫這個外掛呢,就是為了方便整理專案中的資原始檔,我記得之前好像也用了這麼一個外掛,但是也沒去找,還是自己動手寫一個吧,需要什麼功能就看自己的需求。 在專案的過程中呢,已經寫了一個外掛來管理材質,但是跟隨模型匯入的圖片卻越來越多,也是自己跟美術溝通不到位,導致根本沒辦法

理才網金牌講師做客中國人力資源管理論壇 新思維引爆全場

發揮 成了 ima display 不想 逆轉 right img 培養 2017年5月17日, 一場名為“新挑戰,新思維——HRace中國人力資源管理論壇”在潤邦國際酒店盛大開幕。活動吸引到200多位企業CEO、總裁、高管及人力資源從業者前往,全場座無虛席,不少遠道而來的

Windows資源管理器打開文件夾卡頓原因及解決辦法

打開 監視器 啟用 div xpl 通過 windows 資源 解決方法 全新安裝的 Win8 打開文件夾居然會卡頓,特別是打開EXE程序比較多的文件夾,通過資源監視器查看,幕後兇手就是 Windows Defender 殺毒軟件。 MSE是微軟提供防毒功能,而Window

Atitit 華為管理者內訓書系 以奮鬥者為本 華為公司人力資源管理綱要 attilax讀後感

誤區 主管 自由 改變 att 績效 流動 blog lib Atitit 華為管理者內訓書系 以奮鬥者為本 華為公司人力資源管理綱要 attilax讀後感 序 言上篇:價值創造、評價與分配第一章 全力創造價值1.1 圍繞價值創造展開人力資源管理1.1.1 什

unity5打包機制下,一種資源打ab和資源管理的方案

remove 自己 return game tor 基礎 resource mea easyn unity5打包機制下,一種資源打ab和資源管理的方案。1.打ab:   1.設置平臺   2.清楚所有資源的assetbundlename:     string[] abN

鳥哥的Linux私房菜-----16、程序與資源管理

blog dsm alt 技術 article ack src mar data 鳥哥的Linux私房菜-----16、程序與資源管理

SQL Server性能調優:資源管理之內存管理篇(上)

方式 hive 服務 ces inpu 都是 功能 一個 type http://www.cnblogs.com/caspnet/archive/2011/02/21/1959539.html 對SQL Server來說,最重要的資源是內存、Disk和CPU,其中內存又是

Ubuntu標題欄實時顯示資源管理

實時 -a get span pos 安裝 運行 smon 添加 添加安裝資源包sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitorsudo apt-get update安裝更新sudo apt-get i

Unity5 怎樣做資源管理和增量更新

能開 網上 mes var file 刪除 bundle text 就會 工具 Unity 中的資源來源有三個途徑:一個是Unity自己主動打包資源。一個是Resources。一個是AssetBundle。 Unity自己主動打包資源是指在Unit

使用Resources類搭建Unity簡單的資源管理工具類

idt 自動創建 update ems 單例類 col 音量 border awake Unity資源加載的方式有: 1.腳本拖拽(本地) 2.Resources加載(本地) ★ 3.AssetBundle加載(本地,遠程[www])★ 本篇將使用Resources類搭建一

Eclipse RCP 資源管理(自定義Project)一 (轉)

com time projects 工作臺 回寫 resource rep abc 管理 基本概念 Eclipse開發平臺提供資源插件(org.eclipse.core.resources),插件提供對項目(Project)、文件(File)、文件夾(Folder)的相關管

資源管理器中,獲取被選擇的文件的路徑(及文件夾)的API

nis ont ftp bstr http api lib 管理 als 從下面的URL中,獲得了這個Library.Get paths of selected items in an explorer window /* http://www.autohotke

13.2:拷貝控制和資源管理

turn 還要 pub class apt 動態內存 並且 但是 方法 兩種選擇: 類的行為像一個值:有自己的狀態,拷貝一個像值的對象時,副本和原對象是完全獨立的。改變副本不會改變原對象。 類的行為像一個指針:類是共享狀態,當拷貝這個對象時,原對象和副本對象使用相同的底層

如何快速自定義Win10文件資源管理器界面

寶寶 html 文件資源管理器 下載地址 公眾號 root folder 光標 comm 今天筆者將和大家討論如何通過修改註冊表來快速地自定義Win10文件資源管理器的界面布局,你可以通過簡單地點擊鼠標右鍵來設置詳細信息窗格、預覽窗格和導航窗格的顯示與否。 效果如下: 右

Linux硬件資源管理與外設設備使用、系統運行機制及用戶管理

ips cte tde lock type 設備文件 tar 所有 需要 Linux硬件資源管理   PCI設備 顯卡 $>>dmesg |grep -i vga[ 0.000000] Console: colour

資源管理系統

方便 對比 gem per 定時任務 splay base 固定 data- RMS(Resource Management System)是基於Tecs Director 和Tecs Openstack的資源管理系統。所處位置如下: 最底層是Tecs OpenStac

國際化資源管理模塊重構總結

問題 reat 以及 開發 導入 完整 功能 生成 復雜 從17年末到18年初花了差不多三周的時間,將項目中最重要的模塊之一--國際化資源管理,進行了徹底的重構。在掉了無數頭發加了好多個晚上的班之後,終於改變了先前一個service解決所有邏輯的臃腫情況,代碼的可讀性,擴展

VS團隊資源管理器(VS自帶git)使用說明_使用VS自帶git推送到遠程存儲庫

style 房子 烏龜 下一步 分享圖片 操作 str 多次 沖突 使用git存儲庫是相當好的習慣,每次碼完代碼就推送到遠程存儲庫,萬一不小心把本地代碼搞廢了,或者硬盤壞了,或者中了勒索病毒,本地代碼丟失了還能從服務器上下載。我曾經就中了一次勒索病毒,本地電腦上的所有文檔,