7

プログラムで apk をインストールしようとしていますが、うまくいきません。物理デバイスを対象とする自動テスト フレームワークをセットアップしています。テストを実行する前に、テスト デバイスにビルド サーバーから最新の apk を取得させたいと考えています。ユーザーの同意なしに apk を実際にインストールする一般的な方法がないことは承知していますが、開発者が apk とデバイスの両方を所有している場合に利用できるアプローチがあるかどうか知りたいです。

過去に試したアプローチ (apk は pathName/apkFilename にダウンロードされています):

String command = "adb install " + pathName + apkFilename;
Runtime.getRuntime().exec(command);

と:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(pathName + apkFilename)), "application/vnd.android.package-archive");
getActivity().startActivity(intent);

最初のアプローチを機能させることはできませんでしたが、2 回目の試みでは、ユーザーにインストールを確認するよう求めるシステム ダイアログが作成されます (ほぼ完了ですが、完全ではありません)。これはシステム ダイアログであるため、残念ながら Robotium を使用して確認することはできません。

4

2 に答える 2

2

多くの人が同様の問題を解決しようとしています。確認なしで APK をインストールすることは、少なくとも簡単にはできないと思います。

Android にアプリケーションをサイレント インストールすることは不可能であることを、しばらくの間認めてきました。

アプリをサイレント インストールすることはできません。明らかな理由により、Android ではサポートされていません。アプリケーションのインストールを続行するには、ユーザーの介入が必要です。

回避策?

android.permission.INSTALL_PACKAGES許可を得るにはアプリが必要です。

これらのスレッドには、特定の特権を持っている場合にこれを行う方法に関するヒントがいくつかありますが、アプリをそのように実行するのは難しいかもしれません. 特別なディレクトリにインストールする必要がある場合や、特別なユーザーとして実行する必要がある場合があります (これは難しい場合があります)。

権限を昇格してアプリを実行する方法の 1 つ: Android SDK を介してルート権限を取得するにはどうすればよいですか?

このスレッドでは、その権限を有効にするには、電話を「ルート化」する必要があるかもしれないと述べています。

これが保証を無効にしても、私は驚かないでしょう。投稿のコメントで、「デバイスを制御する」ことができないと述べたので、このオプションも無効になる可能性があります。

このスレッドには、一部のアプリが使用するエクスプロイトに関する言及がありますが、サポートされていないと思います。それらがまだ機能している場合、ある時点で機能しなくなる可能性があります。

于 2011-12-08T03:18:00.747 に答える
0

私たちが制御するデバイスに更新をプッシュするために、同じことをしようとしています。私たちの場合、それらはすでにルート化されており、アプリケーションにはスーパーユーザーが付与されているため、既存のファイルの上に .apk をコピーするだけでおそらくうまくいくと思いますが、これは非常にハッキリしているようです.

より良いアプローチのように見えるのは (機能する場合)、pmPackage Manager アプリケーションを使用することです。

# /system/bin/pm
usage: pm [list|path|install|uninstall]
       pm list packages [-f]
       pm list permission-groups
       pm list permissions [-g] [-f] [-d] [-u] [GROUP]
       pm list instrumentation [-f] [TARGET-PACKAGE]
       pm list features
       pm path PACKAGE
       pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH
       pm uninstall [-k] PACKAGE
       pm enable PACKAGE_OR_COMPONENT
       pm disable PACKAGE_OR_COMPONENT
       pm setInstallLocation [0/auto] [1/internal] [2/external]

The list packages command prints all packages.  Options:
  -f: see their associated file.

The list permission-groups command prints all known
permission groups.

The list permissions command prints all known
permissions, optionally only those in GROUP.  Options:
  -g: organize by group.
  -f: print all information.
  -s: short summary.
  -d: only list dangerous permissions.
  -u: list only the permissions users will see.

The list instrumentation command prints all instrumentations,
or only those that target a specified package.  Options:
  -f: see their associated file.

The list features command prints all features of the system.

The path command prints the path to the .apk of a package.

The install command installs a package to the system.  Options:
      -l: install the package with FORWARD_LOCK.
  -r: reinstall an exisiting app, keeping its data.
  -t: allow test .apks to be installed.
  -i: specify the installer package name.
  -s: install package on sdcard.
  -f: install package on internal flash.

The uninstall command removes a package from the system. Options:
  -k: keep the data and cache directories around.
after the package removal.

The enable and disable commands change the enabled state of
a given package or component (written as "package/class").

The getInstallLocation command gets the current install location
  0 [auto]: Let system decide the best location
  1 [internal]: Install on internal device storage
  2 [external]: Install on external media

The setInstallLocation command changes the default install location
  0 [auto]: Let system decide the best location
  1 [internal]: Install on internal device storage
  2 [external]: Install on external media
于 2012-02-08T04:54:14.307 に答える