歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android PackageInstaller 靜默安裝的實現

Android PackageInstaller 靜默安裝的實現

日期:2017/3/1 10:36:22   编辑:Linux編程
要求在安裝APK應用時不顯示權限信息和安裝過程。
  1. Google的安全策略要求任何應用應該提示APK安裝包的權限,對於一些內置特定廠商應用,可以跳過安裝過程的信息加快安裝,或者運營商強制安裝。

  2. 這個功能的實現在src/package/app/PackageInstaller中,需要修改。添加靜默安裝的功能。又兼容正常安裝。

實現的分析

在窗口中點擊一個APK時,觸發單擊事件,PackageInstaller接收系統服務PackageManagerService傳來的intent信息,傳來的Intent信息中有APK的一些參數。實現的關鍵是區分一般APK和特定APK

  1. 通過傳給PackageManagerServiceintent中添加特別的參數,PackageInstaller接收後進行判斷,進行特別的隱藏安裝流程。這個實現只能通過程序調用的方式安裝。

  1. 安裝過程的信息窗口在PackageInstallActivity.java中實現的。安裝過程的信息窗口有4個:需要實現一個PakkageInstallActivityHide.JAVA的文件,去掉下面的dialog和窗口

    1. 安裝權限確認窗口:installPermissionConfirm

    2. 安裝進度條:installProgress

    3. 安裝結果窗口:installResult

    4. 安裝錯誤提示對話框

文件列表大概如下:

InstallAppProgress.java

PackageInstallerActivity.java

+PackageInstallerActivityHide.java

PackageUtil.java

UninstallAppProgress.java

UninstallerActivity.java

+UninstallerActivityHide.java

具體實現

1 在Androidmainfest.xml聲明一個特定的intent:android.intent.action.VIEW.HIDE,由PackageInstallActivityHide.java來接受

注意這裡的兩點:

  1. 把原先的 <application android:label="@string/app_name" android:theme="@android:style/Theme.Holo.DialogWhenLarge">
  2. 改成 <application android:label="@string/app_name">,
  3. 把android:theme="@android:style/Theme.Holo.DialogWhenLarge"主題的顯示放在每一個<activity 中,兼容正常按裝的UI主題不變
  4. 隱藏安裝的PakkageInstallActivityHide <activity的主題只能是:
  5. android:theme="@android:style/Theme.NoDisplay" 只能是這個,沒有窗口

內容如下:

  1. <application android:label="@string/app_name">
  2. <activity android:name=".PackageInstallerActivity" android:theme="@android:style/Theme.Holo.DialogWhenLarge" android:configChanges="orientation|keyboardHidden">
  3. <intent-filter>
  4. <action android:name="android.intent.action.VIEW"/>
  5. <category android:name="android.intent.category.DEFAULT"/>
  6. <data android:scheme="content"/>
  7. <data android:scheme="file"/>
  8. <data android:mimeType="application/vnd.android.package-archive"/>
  9. </intent-filter>
  10. </activity>
  11. <activity android:name=".PackageInstallerHideActivity" android:theme="@android:style/Theme.NoDisplay" android:configChanges="orientation|keyboardHidden">
  12. <intent-filter>
  13. <action android:name="android.intent.action.VIEW.HIDE"/>
  14. <category android:name="android.intent.category.DEFAULT"/>
  15. <data android:scheme="content"/>
  16. <data android:scheme="file"/>
  17. <data android:mimeType="application/vnd.android.package-archive"/>
  18. </intent-filter>
  19. </activity>
  20. <activity android:name=".UninstallerActivityHide" android:theme="@android:style/Theme.NoDisplay" android:configChanges="orientation|keyboardHidden" android:excludeFromRecents="true">
  21. <intent-filter>
  22. <action android:name="android.intent.action.VIEW"/>
  23. <action android:name="android.intent.action.DELETE.HIDE"/>
  24. <category android:name="android.intent.category.DEFAULT"/>
  25. <data android:scheme="package"/>
  26. </intent-filter>
  27. </activity>

2 實現PakkageInstallActivityHide.java,UninstallerActivityHide.java。 只需把PakkageInstallActivity.java修改去掉dialog和對話框。

3 安裝程序調用者發一個上面定義的intent即可。如下例子,靜默安裝/sdcard/hello.apk

卸載的方法類似。

  1. Intent install_hide_intent = new Intent("android.intent.action.VIEW.HIDE");
  2. install_hide_intent .setDataAndType(Uri.parse("file:///sdcard/hello.apk"),
  3. "application/vnd.android.package-archive");
  4. startActivityForResult(install_hide_intent, INSTALL_RUSULT);

4 注意,這個方法需要PackageInstall這個apk必須與系統一起編譯。這個apk在/system/app/目錄下面;android.intent.action.VIEW.HIDE 這個靜默安裝的接口需要開放給第三方。

Copyright © Linux教程網 All Rights Reserved