1. 程式人生 > >Android應用程式外掛化研究之資源衝突

Android應用程式外掛化研究之資源衝突

最近在研究Android應用的外掛化開發,  外掛化都是在解決以下幾個問題:

本章我們來研究最後一個問題:資源共享與衝突。在《Android應用程式外掛化研究之AssertManager》中,我們實現了載入外掛apk中資源問題,實際上我們是單獨建立了用於訪問外掛資源的AssertManager和Resource物件,即,外掛獨立使用一個資源管理器,這樣外掛宿主之間無法共享資源。

資源共享

如果需要宿主、外掛之間使用同一套資源管理器,那麼我們需要將外掛的資源路徑新增到宿主的AssetManager中。
我們知道,apk包括程式碼和資源,在apk編譯過程中,dex工具將程式碼打包成.dex檔案,資原始檔會由aapt工具生成對應的ID,aapt在打包的時候組織成resources.arsc檔案(詳細參考: 

Android應用程式資源的編譯和打包過程分析),resources.arsc檔案是用來描述資源ID和資源位置配置資訊,從18個維度描述了一個資源ID的配置資訊(語言、解析度等),就是資源ID和資源的索引表。資源的ID生成是有規則的,規則:0xPPTTNNNN,由8位16進位制組成,其中:
PP段:表示資源的包空間:0x01表示系統資源空間,0x7f表示應用資源空間。
TT段:表示資源型別。
NNNN段:4個16進製表示資源id,一個apk中同一型別資源從0000開始遞增。
例如:

nt anim pop_dialog_in 0x7f040000
int anim pop_dialog_out 0x7f040001
int anim slide_left_in 0x7f040002
int anim slide_left_out 0x7f040003
int anim slide_right_in 0x7f040004
int anim slide_right_out 0x7f040005
int anim update_loading_progressbar_anim 0x7f040006
int array indicator_tab_icon 0x7f050001
int array indicator_tab_titlt 0x7f050000

現在問題來了,宿主apk和外掛apk是獨立編譯出來的兩個獨立的apk,那麼其中就有資源ID相同的情況出現,從而產生資源ID衝突。如何解決這個問題?看了一些開源框架,解決的辦法就是修改資源ID的PP段,大體有兩種做法:

修改aapt原始碼,定製aapt工具編譯期間修改PP段。

DynamicAPK的做法就是如此,定製aapt,替換google的原始aapt,在編譯的時候可以傳入引數修改PP段:例如傳入0x05編譯得到的資源的PP段就是0x05。個人覺得這個做法不是太靈活,入侵了原有的開發編譯流程,不好維護。

修改aapt的產物,即,編譯後期重新整理外掛Apk的資源,編排ID。

前面說過apk編譯之後會生成ID以及對應的索引表resorce.arsc,那麼我們能不能後期修改相關ID及索引表呢?答案是肯定的,個人比較贊同這種思路,不用入侵原有編譯流程。

結尾:外掛系列文章到此結束了,如果你從第一章開始看到此處,你應該明白外掛化要解決的問題、實現的思路、要掌握的技術,如果你理解完這5篇文章,你應該有能力寫出一個簡單的外掛方案了。文章重在點明思路,實踐才是最重要的,關於實踐我們要做的還有很多很多。

相關推薦

Android應用程式外掛研究資源衝突

最近在研究Android應用的外掛化開發,  外掛化都是在解決以下幾個問題: 本章我們來研究最後一個問題:資源共享與衝突。在《Android應用程式外掛化研究之AssertManager》中,我們實現了載入外掛apk中資源問題,實際上我們是單獨建立了用於訪問外掛資源的Ass

Android應用程式外掛研究Activity註冊

最近在研究Android應用的外掛化開發,看了好幾個相關的開源專案。外掛化都是在解決以下幾個問題: 如何把外掛apk中的程式碼和資源載入到當前虛擬機器。如何把外掛apk中的四大元件註冊到程序中。如何防止外掛apk中的資源和宿主apk中的資源引用衝突。在上篇文章中我研究了如何

Android應用程式外掛研究DexClassLoader

最近在研究Android應用的外掛化開發,看了好幾個相關的開源專案。外掛化都是在解決以下幾個問題: * 如何把外掛apk中的程式碼和資源載入到當前虛擬機器。 * 如何把外掛apk中的四大元件註冊到程序中。 * 如何防止外掛apk中的資源和宿主apk中的

Android外掛開發AMS與應用程式(客戶端ActivityThread、Instrumentation、Activity)通訊模型分析

今天主要分析下ActivityManagerService(服務端) 與應用程式(客戶端)之間的通訊模型,在介紹這個通訊模型的基礎上,再    簡單介紹實現這個模型所需要資料型別。         本文所介紹內容基於android2.2版本。由於Android版本的不同

Android外掛學習路(四)使用外掛中的R資源

res裡的每一個資源都會在R.java裡生成一個對應的Integer型別的id,APP啟動時會先把R.java註冊到當前的上下文環境,我們在程式碼裡以R檔案的方式使用資源時正是通過使用這些id訪問res資源,然而外掛的R.java並沒有註冊到當前的上下文環境,所

Android外掛基礎載入已安裝的apk資源

郵箱:[email protected] 我也是在進行學習和研究,有問題可以直接說 應該明確的問題 外掛化是什麼意思? 為什麼要使用外掛化的這種方式? 外掛化的優劣? 根據上述問題我們就可以進行初步的瞭解了 外掛顧名思義就是

Android逆向旅---Android應用的漢功能 修改SO中的字串內容

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

轉老羅 Android應用程式資源的查詢過程分析

原文地址  http://blog.csdn.net/luoshengyang/article/details/8806798   轉載請說明     我們知道,在Android系統中,每一個應用程式一般都會配置很多資源,用來適配不同密

轉自老羅 Android應用程式資源的編譯和打包過程分析

原文地址   http://blog.csdn.net/luoshengyang/article/details/8744683 轉載自老羅,轉載請說明   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過An

轉自 老羅 Android應用程式資源管理器(Asset Manager)的建立過程分析

原文地址在 http://blog.csdn.net/luoshengyang/article/details/8791064 原創老羅,轉載請說明     在前面一篇文章中,我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與

Android熱修復與外掛實踐

第1章 class檔案與dex檔案解析本章通過從java最基本的class檔案與android最基本的dex檔案進行對比,並不藉助IDE去生成及執行class與dex檔案,通過講解class與dex的手動生成,執行, 格式對比,讓學生明白二者的相同與不同。1-1 課程專案整體介紹1-2 本章概述1-3 cla

模組惡意Android應用程式偽裝成語音工具,通過調查收集PII資料

“這些惡意應用程式和惡意軟體的觀察變體自10月份開始逐一部署,其演變包括規避技術及其感染行為分為幾個階段,”趨勢科技在他們的分析中表示。 在嘗試通過虛假調查收集使用者的個人身份資訊(PII)並提供禮品卡作為獎勵以填寫它們時,已經觀察到被稱為AndroidOS_FraudBot.OPS的惡意軟體。此外,惡意應

Android外掛技術旅 1 開篇 - 實現啟動外掛與呼叫外掛中的Activity和Service

前言 Android技術如今已很成熟了,元件化、外掛化、熱修復等等框架層出不窮,如果只停留在單純的會用框架上,技術永遠得不到成長,只有懂得其原理,能夠婉婉道來,能夠自己手動寫出,技術才會得到成長,與其焦慮未來,不如把握現在。本篇將手寫教大家寫出外掛化框架,外掛化技術是Android高階工程師必備的技術之一,

Android 應用程式分析Settings.System.putInt

由於需要修改Setting預設設定的需要,需要分析下Setting的原始碼,以及資料儲存與讀取。 Android自帶的應用程式儲存在packages/apps目錄下 主要目錄和檔案如下: 其中resouce是資原始檔,src是原始碼,tests中含有測試程式碼。而Andr

Android應用程式資源的編譯和打包過程分析

   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過Android資源打包工具aapt(Android Asset Package Tool)打包到APK檔案裡面的。在打包之前,大部分文字格式的XML資原始檔還會被編譯

Android逆向旅—Android應用的漢功能(修改SO中的字串內容)

本文轉載自趙四大神 一、前言 今天我們繼續來講述逆向的知識,今天我們來講什麼呢?我們在前一篇文章中介紹了關於SO檔案的格式,今天我們繼續這個話題來看看如何修改SO檔案中的內容,看一下我們研究的主題: 需求:想漢化一個Apk 思路:漢化,想必大家都瞭解,老外開發的

android應用程式啟動詳情程序相關

        當某個應用元件啟動且該應用沒有執行其他任何元件時,Android 系統會使用單個執行執行緒為應用啟動新的 Linux 程序。 預設情況下,同一應用的所有元件在相同的程序和執行緒(稱為“主”執行緒)中執行。 如果某個應用元件啟動且該應用已存在程序(因為存在

Android外掛學習路(六)動態建立Activity

靜態代理Activity模式的限制 我們在代理Activity模式一文裡談到啟動外掛APK裡的Activity的兩個難題嗎,由於外掛裡的Activity沒在主專案的Manifest裡面註冊,所以無法經歷系統Framework層級的一系列初始化過程,最終導致獲得

Android外掛架構Hook繞過manifest檢測

學習自https://www.jianshu.com/p/e359fafe5c29問題我們外掛apk是不會進行一個安裝的,那麼他的manifest就不會生效,所以我們直接啟動肯定是行不通的。所以我們只能隔絕掉我們主apk的manifest的檢測。具體思路如下只需要動態代理ho

Android外掛學習路(一)動態載入綜述

前段時間,公司專案完成了外掛化的開發,自己也因此學習了很多Android外掛化的知識,於是想把這些內容記錄下來,本次帶來Android外掛化的第一篇:動態載入綜述 背景知識 1.什麼是動態載入? 動態載入技術應由以下幾個部分組成: 1) 應用在執行