2012-04-03 155 views
8

我試圖瞭解是否可以將Android應用拆分爲兩部分(從一個APK安裝)。我正在研究這個功能,將一部分安裝在設備內存上,另一部分安裝在SD-CARD上。這兩部分屬於一起,不應單獨安裝。將Android應用拆分爲兩部分

注:我需要單獨不僅資源,而且活動,使APK Expansion Files不是一個解決方案,因爲沒有提供這樣的功能。

+0

你是什麼意思與「單獨安裝」?我想你有一些資源(如圖像,視頻)安裝在SD卡內存問題,對不對?或者你是什麼意思? – 2012-04-03 06:35:24

+0

我的意思是說,對於設備,兩個部分應該一起安裝/拆卸。我正在考慮的應用程序中有一部分我希望始終可用(安裝在設備內存上),另一部分用戶可通過刪除SD-CARD使其不可用(臨時)。另外,當用戶決定將應用程序移入或移出SD-CARD時,我想要在設備內存中安裝的部分應該始終保持在那裏。 – Louis 2012-04-03 07:09:22

+0

這不適用於單個應用程序。但你應該可以用2個獨立的應用程序來完成它。 – 2017-01-30 18:54:59

回答

0

你可以,但不是你的理由。多個APK只是爲了確保您的應用適用於多個設備 - 不要在內部存儲器和SD卡之間劃分總大小。

Multiple APK Support

雖然我們鼓勵您開發和發佈單個APK是 支持儘可能多的設備配置成爲可能,這樣做是 有時是不可能的。爲了幫助您儘可能多地發佈儘可能多的設備,Google Play允許您在相同的應用程序列表中發佈多個 APK。然後Google Play會根據您在每個APK的清單文件中聲明的配置支持 將每個APK提供 到相應設備。

通過與多個APK發佈應用,您可以:

支持OpenGL的不同紋理壓縮格式的每個APK。

支持每個APK的不同屏幕配置。

支持與每個APK不同的平臺版本。

目前,這些是唯一的設備特性,谷歌播放 支持發佈多個APK爲相同的應用程序。

+0

謝謝你的迴應,但這不是我的意思。我的應用程序有兩個部分應該始終可用,一部分在用戶取出SD卡時可能不可用,然後在再次插入卡時可用。 – Louis 2012-04-03 08:06:02

0

您的應用程序只能檢查sd卡當前是否可用(「插入」)。如果它可用,你的應用程序就像正常一樣工作,如果SD卡不可用,應用程序將自動退出/顯示彈出/啓動不同的活動/任何。

+0

如何在「移動」過程中向sd卡推送所選活動和服務? – msangel 2017-01-25 13:35:31

+0

對不起,我完全不瞭解您的句子:作者評論x – jdstaerk 2017-01-25 13:55:24

+0

:「我正在考慮的應用程序有一個部分,我希望始終可用(安裝在設備內存上)和一個用戶可能製作的部分通過移除SD-CARD不可用(暫時)。「 – msangel 2017-01-25 14:25:57

0

如果你只是尋找一種方式來保持外部驅動器上的應用程序資源,Harry's answer將是有益的。

否則無法將一個應用程序的安裝分爲兩個部分。您可以使用android:installLocation清單屬性來定義要安裝它,你甚至可以將它強制僅在內部在設備上安裝,但沒有選項來分離它。

替代

兩個應用程序

創建兩個獨立的兩個應用程序,並檢查它們中任開始時,如果安裝了另一個。如果沒有,請求用戶安裝另一個用戶並將用戶轉發到應用商店。

一個應用程序將檢查外部存儲

我不知道你的使用情況,但是從你的意見聽起來像你找錯了解決方案。

我正在考慮的應用程序有一個部分,我希望始終可用(安裝在設備內存上),另一部分用戶可通過刪除SD-CARD使其不可用(臨時)。另外,當用戶決定將應用程序移入或移出SD-CARD時,我想要在設備內存中安裝的部分應該始終保持在那裏。

您可以檢查外部存儲是否可用,如果不存在則阻止某些活動。如果你想確定,這是同一個SD卡,你可以在第一次運行時創建一個UUID並在內部和外部保存它。如果它們匹配,則它是正確的SD卡。

結論

您的解決方案可能是太複雜了,你應該尋找替代品。

1

APK擴展文件

目前谷歌Play要求您的APK文件不能超過100MB以上。對於大多數應用程序來說,這對於所有應用程序的代碼和資產都有足夠的空間。但是,某些應用程序需要更多空間來存儲高保真圖形,媒體文件或其他大型資產。以前,如果您的應用超過100MB,則在用戶打開應用時,您必須自己主持並下載其他資源。託管和提供額外的文件可能代價高昂,用戶體驗往往不甚理想。爲了讓此過程更輕鬆,讓用戶更加愉快,Google Play允許您附加兩個大型擴展文件,以補充APK。

Google Play爲您的應用程序託管擴展文件並將它們免費提供給設備。擴展文件保存到設備的共享存儲位置(SD卡或USB可安裝分區,也稱爲「外部」存儲),您的應用可以訪問它們。在大多數設備上,Google Play會在下載APK的同時下載擴展文件,以便您的應用程序在用戶第一次打開它時擁有所需的全部內容。然而,在某些情況下,您的應用程序必須在您的應用程序啓動時從Google Play下載文件。

下載擴展文件

在大多數情況下,谷歌Play的下載,並在安裝或更新的APK的同時節省了您的擴展文件到設備。這樣,擴展文件在您的應用程序第一次啓動時可用。但是,在某些情況下,您的應用必須通過從Google Play的應用授權服​​務響應中提供給您的URL請求這些文件來下載擴展文件。

您需要下載擴展文件的基本邏輯如下:

應用程序啓動時,尋找在共享存儲位置擴展文件(在Android/OBB //目錄)。 如果擴展文件存在,您就全部設置好了,並且您的應用程序可以繼續。 如果擴展文件不存在: 使用Google Play的應用程序許可執行請求以獲取應用程序的擴展文件名稱,大小和URL。 使用Google Play提供的網址下載擴展文件並保存擴展文件。您必須將文件保存到共享存儲位置(Android/obb //),並使用Google Play響應提供的確切文件名。

Source

+0

擴展文件適用於不屬於活動等程序代碼的資產。 – 2017-01-31 11:38:49

0

是的,這是可能的。但有一點需要注意的是,可以分別安裝兩個應用程序,因爲它們都應該上傳到商店。你只需要使用很多意圖。

您需要使用意圖處理兩個應用程序之間的所有通信。這意味着,第一個應用程序需要的所有內容都必須使用第二個應用程序的意圖來詢問,而未能在設備中找到其他應用程序應觸發Play商店的意圖。這樣,你將有兩個應用程序像一個工作。請記住,用戶仍然會確定應用的安裝位置,但正如christian-strempfer指出的那樣,SD卡可以設置爲首選目標。

如果這樣做的目的是節省空間,您應該使您的資源(圖像,聲音等)變爲動態。由於所有這些只是apk內的文件,您可以輕鬆地用SD卡中的文件替換它們。你只需要將它們上傳到應用程序安裝完成後下載。這樣,您可以提供每種資產的確切版本,並在需要時將其刪除。您可以瞭解哪些屏幕最常用,並刪除少用的資產。等

3

我認爲這將是可能的。你可以嘗試下面的方法嗎?

  1. 創建兩個應用程序
  2. 在第一個APK的清單文件,你應該有一個活動,是MAIN和LAUNCHER類別。這樣,您的應用程序將在啓動器列表中可見
  3. 您不應該在第2個APK中擁有MAIN和LAUNCHER類別的任何活動,但是您知道必須打開哪個活動作爲第二個應用程序的啓動器活動,因爲它是您自己的應用程序。這樣,在應用程序的啓動列表中你的第二個應用程序將永遠不會出現
  4. 將第二APK在第一APK
  5. 的資產文件夾每當你的主應用程序要使用內容從第二個應用程序,從資產的文件夾中安裝第二個應用程序(as mentioned here)與設置在SD卡的安裝位置是這樣的:android:installLocation="preferExternal",然後啓動你想要的第二應用

我還沒有試過這種尚未的活動,但在理論上似乎是合法的。

讓我知道這是否工作。謝謝!

+0

可能您首先必須在安全選項中啓用APK「未知來源的安裝」。 – 2017-01-31 11:41:15

+0

可能是的。但我相信這將是路易斯問題的最接近的解決方案。 – Shrikant 2017-02-01 07:53:05

0

通過在Manifest中定義兩個MAIN LAUNCHER條目,您可以從一個APK創建兩個不同的啓動活動。XML

<activity android:name=".ChooserActivity" 
      android:label="Auth Firebase"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


     <activity android:name=".GoogleSignInActivity" 
      android:label="Auth Google" 
      android:installLocation="preferExternal"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

這會爲應用程序創建兩個入口點,兩個不同的啓動圖標一個名爲「驗證火力地堡」等命名爲「谷歌驗證」都將打開不同的活動。

+0

我想你誤解了這個問題。 – 2017-02-01 08:17:31