簡體   English   中英

在后台以編程方式安裝 APK

[英]Installing APK programmatically in background

我有一個場景,我必須在后台下載 apk 並安裝它,而不向用戶提示任何對話框。 但是,當我嘗試使用以下代碼安裝它時

File file = new File(filename);
if(file.exists()){
    try {
        String command;
        command = "pm install -r " + filename;
        Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
        proc.waitFor();
        Config.debug("Apk installed");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

它要求超級用戶訪問。 有沒有辦法在沒有超級用戶並提示用戶的情況下安裝 apk?

有沒有辦法在沒有超級用戶並提示用戶的情況下安裝 apk?

幸運的是,沒有,出於明顯的安全原因。

更新:一個例外是在 Android 5.0+ 設備上,如果您使用的是設備所有者系統,我認為有一些 API 可用於安裝設備所有者應用程序可用的軟件包。 我還沒有玩過這些,目前還不清楚它們是否能滿足你的需求。

我問這個是因為我擁有的用戶群,以前從未使用過應用程序或設備

然后要么不給他們這項技術,要么教他們如何使用這項技術。

您可以靜默安裝啟動 Android Marshmallow 的應用程序(在此處查找信息)。 您必須是設備所有者才能完成任務。

您可以在此處找到有關設備所有者的更多幫助。 感謝弗洛倫特杜邦。

是的,您可以通過使用系統簽名對應用程序進行簽名來靜默安裝 apk 而無需生根。

您應該首先查看 Android 的原生Package Installer 我認為您只需要提取所需的功能。


具體來說,如果您查看此方法及其 OnClickListener:

public void onClick(View v) {
    if(v == mOk) {
        ...
        startActivity(newIntent);
        finish();
    } else if(v == mCancel) {
        // Cancel and finish
        setResult(RESULT_CANCELED);
        finish();
    }
}

然后您可能會注意到實際安裝程序所在位置的InstallAppProgress類,最后要做的是調用PackageManager的 installPackage(...) 函數。

public void initView() {
  ...
  pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);
}

下一步是檢查PackageManager這是一個抽象類。 您會在那里找到 installPackage(...) 函數。 壞消息是它被標記為@hide 這意味着它不能直接供外部開發人員使用。

/**
 * @hide
 **/
public abstract void installPackage(Uri packageUri, IPackageInstallObserver installObserver, int flags, String installerPackageName);

但是您將能夠使用反射訪問該方法。

概括

您將使用yourContext.getPackageManager()反映它。 然后你可以調用 installPackage(...) 函數。

以下代碼調用安裝:

try {
  getPackageManager().installPackage(packageUri, myObserver, PackageManager.INSTALL_REPLACE_EXISTING, "com.your.package.name");
} catch (Exception e) {
   Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}

為了使整個工作正常運行,您需要在清單中聲明這一點,否則代碼將靜默失敗。

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

要獲得此權限,您必須將 APK 安裝為需要 ROOT 的系統。

但是,在您將 APK 安裝為系統后,它似乎無需 ROOT 即可工作。

為此,我創建了一個簽名的 APK 並將其推送:

adb push C:\Users\Example01\Desktop\release\app-release.apk /system/priv-app/MyApp.apk

有了這個,我將它復制到/system/priv-app這需要寫訪問這就是為什么需要 ROOT。

我使用調試版本對其進行了測試,當我嘗試時,我得到了SecurityException

結論

您應該使用有根設備將其安裝為系統特權應用程序。

希望這可以幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM