2013-01-04 19 views
4

我在最近定製的Android內部版本中遇到過一個奇怪的問題?我有一個工作ROM數月,並使用這個ROM我已經能夠安裝平臺簽名apks到用戶空間(/數據/應用程序)。最近,在重建ROM後,我一直無法安裝這些相同的apks。安裝平臺簽署的應用程序(無論通過亞行的安裝,或下午安裝)任何企圖得到以下信息:是否可以安裝平臺簽名的應用程序到用戶空間?

Failure [INSTALL_FAILED_INVALID_INSTALL_LOCATION] 

通過Android源挖後,我發現了以下相關的代碼塊:

if ((compareSignatures(pkg.mSignatures, s1) == PackageManager.SIGNATURE_MATCH)) { 
    Slog.w(TAG, "Cannot install platform packages to user storage"); 
    mLastScanError = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION; 
    return null; 
} 

根據我的閱讀,似乎應該永遠不允許在用戶空間安裝系統應用程序。在用戶空間中安裝系統應用程序是否是異常的初始情況?是否有可能在用戶空間安裝平臺簽名的應用程序,如果是這樣,那麼如何做?

+1

簡短的回答是不!平臺簽名的應用程序是ROM的一部分,因此,如果需要用戶空間中的平臺簽名應用程序,則需要簽署密鑰**,該密鑰是在構建ROM時生成的** – t0mm13b

+0

因此,我可以訪問在編譯時間,我正在使用這些鍵。它工作了好幾個月,最近停止了工作,這讓我感到困惑。 (我希望我能夠清楚地知道發生了什麼變化,但據我所知,沒有任何變化)。如果我使用在最新版本中生成的密鑰重新簽署應用程序,我應該能夠將平臺認證簽名應用程序安裝到用戶空間嗎? – Fil

+1

是的,在我以前的評論中 - 僅適用於工廠ROM,但是滾動你自己的ROM,它*應該*仍然工作:)對不起,如果我困惑你在那裏...... :) – t0mm13b

回答

3

上述情況的發生是因爲我們有一個共享的Android構建機器(在公司內共享)。一位同事在沒有通知我的情況下轉換了Git分支,因此我們在我們的構建空間中留下了舊代碼。將其切換回正確的分支解決了問題。要更明確地回答上述問題,看起來除非您註釋掉以下代碼塊,否則在用戶空間中安裝平臺簽名的應用程序是不可能的。

(該類文件是/frameworks/base/services/src/com/android/server/pm/PackageManagerService.java);

if (!pkg.applicationInfo.sourceDir.startsWith(Environment.getRootDirectory().getPath()) && 
      !pkg.applicationInfo.sourceDir.startsWith("/vendor")) { 
     Object obj = mSettings.getUserIdLPr(1000); 
     Signature[] s1 = null; 
     if (obj instanceof SharedUserSetting) { 
      s1 = ((SharedUserSetting)obj).signatures.mSignatures; 
     } 
     if ((compareSignatures(pkg.mSignatures, s1) == PackageManager.SIGNATURE_MATCH)) { 
      Slog.w(TAG, "Cannot install platform packages to user storage"); 
      mLastScanError = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION; 
      return null; 
     } 
    } 
+0

啊okie!很高興知道它解決了:) – t0mm13b

相關問題