android 应用间共享数据,调用其他app数据资源
在Android里面每個app都有一個唯一的linux user ID,則這樣權限就被設置成該應用程序的文件只對該用戶可見,只對該應用程序自身可見;而我們可以使他們對其他的應用程序可見,可以通過SharedUserId,也就是讓兩個apk使用相同的userID,這樣它們就可以看到對方的文件。為了節省資源,具有相同ID的apk也可以在相同的linux進程中進行(注意,并不是一定要在一個進程里面運行),共享一個虛擬機。
?
一、檢驗在多種情況下,應用AppA,AppB運行的相關信息: processName,pid,uid,和獲取其他資源的情況,可以通過獲取應用相關的context,來獲取相關資源,這里只是測試下
其他文件的資源string,代碼如下:
try{final String sharedPackageNameString = "com.sihaixuan.datashare.a";Context context = createPackageContext(sharedPackageNameString, CONTEXT_IGNORE_SECURITY);Resources resources = context.getResources();String resName = getString(R.string.app_share_resource_string_name,"name a");int resiD = resources.getIdentifier(resName, "string",sharedPackageNameString);Log.d("App toney","shared from "+sharedPackageNameString +" : "+resources.getString(resiD));}catch (Exception e){Log.d("App toney", e.getLocalizedMessage());}?
?
1)缺省情況
? ?
? android中每個應用都有自己的linux uid,分別運行自己的進程中。
??
2)配置相同的process <application android:process="com.sihaixuan.processName">
??
? ?相同的process name,運行在不同進程.
?
3)相同的shareUserId?<manifest android:sharedUserId="com.sihaixuan.shareUserId">元素?
?
應用配置相同shareUserId ,就有相同uid,不在同一進程運行。
4)配置相同 process name 和 相同的shareUserId
和單獨設置相同的process name 或者相同的shareUserId一樣,都用的相同的uid,運行在不同進程,可以共享資源。
?可以看出pid相同,運行在同一進程中,即共享進程和dvm 虛擬機實例。
?
二、 shareUserId 和 processName的資源共享的簡單分析。
? ? ? 1)pms管理著應用的安裝和卸載,會把應用程序的相關包管理信息記錄在/data/packages.xml中,開機、安裝app、卸載app會動態掃描和更新該文件。
? ? ? ? 例如:ApkA,ApkB共享進程 的包管理信息
<shared-user name="com.sihaixuan.shareUserId" userId="10087"> <sigs count="1"> <cert index="12" /> </sigs> <perms /> </shared-user><package name="com.toney.datashare.a" codePath="/data/app/com.toney.datashare.a-1.apk" nativeLibraryPath="/data/data/com.toney.datashare.a/lib"flags="1073741824" ft="14cd4bf0230" it="14cd4bf032f" ut="14cd4bf032f" version="1" sharedUserId="10087"> <sigs count="1"> <cert index="12" /> </sigs> <perms /> </package><package name="com.sihaixuan.datashare.b" codePath="/data/app/com.sihaixuan.datashare.b-1.apk" nativeLibraryPath="/data/data/com.sihaixuan.datashar e.b/lib" flags="1073741824" ft="14cd4bf40b0" it="14cd4bf4408" ut="14cd4bf4408" version="1" sharedUserId="10087"> <sigs count="1"> <cert index="12" /> </sigs> <perms /> </package>
?
? ? ? 1)uid的生成時機和賦值時機
? ? ? ? 安裝入口函數pms.installPackageAsUser
? ? ? ??
?
? ? ? 2)
?
? android 用ProcessRecord類表示進程相關信息 ,ams用ProcessMap維護著進程ProcessRecord管理。ProcessMap結構如下:
? ??
public class ProcessMap<E> {//不同進程的進程名可以相同final ArrayMap<String, SparseArray<E>> mMap = new ArrayMap<String, SparseArray<E>>();//通過 processName、 linux uid確定processRecordpublic E get(String name, int uid) {SparseArray<E> uids = mMap.get(name);if (uids == null) return null;return uids.get(uid);}public E put(String name, int uid, E value) {SparseArray<E> uids = mMap.get(name);if (uids == null) {uids = new SparseArray<E>(2);mMap.put(name, uids);}uids.put(uid, value);return value;}。。。。。。 }
可以看出根據 processName 和 uid來確定processRecord.可以通過設置<application>元素的process 和 shareUserId來共享進程和vm.
?
進程的啟動流程:都是從啟動activity開始的
context.startActivty()------>ipc調用ams.startActivity()------>.....----->activitystack.resumeTopActivityLocked()----->activityStackSupervisor.startSpecificActivityLocked()從processMap查詢processRecord.
processRecord找不到或者無效----->ams.startProcessLocked();新建processRecord并put進processMap中去,新建進程后,設置processRecord的pid---->Process.start()---->Process.startViaZygote()---->Process.zygoteSendArgsAndGetResult()(本地套接字通信)。----->activityThread.main()實例化--->ams.attachApplication();--->ActivityStackSupervisorattachApplicationLocked()---->applicationThread.attachApplicaton(),activitystack.resumeTopActivityLocked()---->activityStackSupervisor.realStartActivityLocked()---->applicatonThread異步消息通知 activityThread-啟動activity-
processRecord存在且有效,activityStackSupervisor.realStartActivityLocked()---->applicatonTreahd異步消息通知 activityThread-啟動activity.
?
?
?
?
?
?
?
1、通過獲取相同shareUserId的context
? ? 1)相同shareUserId,不同進程,shareUserId 和 lunix進程的uid不是同一概念。
? ? ? ??
? ? 2)相同shareUserId,相同進程
?
? ? ?資源共享原理分析。
2、contentprovider 共享數據
?
?
?
?
?
?
?
參看網址:
Android PackageManagerService分析一:PMS的啟動
android 安全機制
APK安裝過程及原理詳解
Android通過共享用戶ID來實現多Activity進程共享
轉載于:https://www.cnblogs.com/sihaixuan/p/4438198.html
總結
以上是生活随笔為你收集整理的android 应用间共享数据,调用其他app数据资源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Memcached原理分析
- 下一篇: 数据库 基础