2017-08-01 49 views
0

首先,我在AOSP環境中工作,這裏提到的兩個應用程序都是使用Android源代碼構建的,並且都是系統應用程序(UID是系統)。啓用和禁用Android中的活動或整個應用程序(AOSP源)

在第一次引導/恢復出廠設置時啓動的應用程序被編寫爲利用android.intent.action.DEVICE_INITIALIZATION_WIZARD意圖過濾器。當應用程序做它的工作,它禁用它的代碼活動

PackageManager pm = mContext.getPackageManager(); 
pm.setComponentEnabledSetting(new ComponentName("com.xyzapp", 
       "com.xyzapp.MainActivity"), 
       PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); 

這一切工作正常。我面臨的問題是重新啓用我想從另一個應用程序執行的活動(服​​務更精確)。

我們幾乎一樣將其關閉:

PackageManager pm = mContext.getPackageManager(); 
pm.setComponentEnabledSetting(new ComponentName("com.xyzapp", 
       "com.xyzapp.MainActivity"), 
       PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0); 

這種方法是行不通的,我想不通爲什麼。

下面是簡要概述應該如何工作的:

  • 首先啓動 - 啓動發射開始
  • com.xyzapp.MainActivity以前如果OTA更新可用並且用戶決定要下載並安裝它,在遠端應重新啓用前要恢復和安裝更新com.xyzapp.MainActivity過程,因此前發射器開始在下次開機

任何提示,想法?

感謝名單

回答

0

所以,檢查private void setEnabledSetting(final String packageName, String className, int newState, final int flags, int userId, String callingPackage)PackagemanagerService.java這些都是關鍵的安全檢查有:

  1. 檢查調用進程的uidsystem與否。如果是system,則全部爲保存,否則應具有android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE權限。
  2. 檢查它是否是受保護的軟件包,不允許其他人修改其狀態。

對於這兩種情況,您會得到一個帶有不同消息的SecurityException

  1. throw new SecurityException( "Permission Denial: attempt to change component state from pid=" + Binder.getCallingPid() + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
  2. throw new SecurityException("Cannot disable a protected package: " + packageName);

你得到任何的SecurityExceptions的?嘗試添加權限:CHANGE_COMPONENT_ENABLED_STATE。 你想從哪些進程啓用應用程序?它有什麼UID?如果你能使它成爲系統,我會說你會避免一些安全檢查。

希望它有幫助。

+0

謝謝,但那不幸對我來說並不奏效。但是,我錯過了清單中的CHANGE_COMPONENT_ENABLED_STATE權限,所以這是一個更少的錯誤,我猜測:)。如果我弄清楚發生了什麼,我會更加努力地工作,並會發布。 –

+0

但是你有沒有在logcat中的任何錯誤?您撥打的服務的UID是什麼? – Olaia

+1

我得檢查一下,沒有時間去做。很可能會在週末那樣做。不想粗魯,不想回復這麼久。我將很快發佈logcat的詳細信息。 –

相關問題