回答:
プレインストールされたアプリケーションは/system/app
フォルダにあります。ユーザーがインストールしたアプリケーションはにあり/data/app
ます。根ざした電話がないとアクセスできないと思います。私はここに根ざした電話を持っていませんが、このコードを試してください:
public class Testing extends Activity {
private static final String TAG = "TEST";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File appsDir = new File("/data/app");
String[] files = appsDir.list();
for (int i = 0 ; i < files.length ; i++ ) {
Log.d(TAG, "File: "+files[i]);
}
}
それは私の根付いたhtcマジックとemuにapkをリストします。
パッケージマネージャー(pm
)を使用してパッケージadb shell
を一覧表示できます。
adb shell pm list packages | sort
そして、.apk
ファイルの場所を表示するには:
adb shell pm path com.king.candycrushsaga
package:/data/app/com.king.candycrushsaga-1/base.apk
そして、adb pull
APKをダウンロードします。
adb pull data/app/com.king.candycrushsaga-1/base.apk
adb pull /data/app/com.example.app-filename.apk path/to/desired/destination
以前にインストールしたもののAPKファイルを取得する場合は、次のようにします。
スマートフォンをルート化したり、を使用adb
したり、何かを記述したりする必要はありません。
標準の場所はありませんが、PackageManagerを使用してパッケージについて調べることができます。そこから取得できるApplicationInfoクラスには、特定のパッケージに関するさまざまな情報があります。その.apkへのパス、そのデータディレクトリへのパス、パスリソースのみの.apk(フォワードロックされたアプリの場合)など。他のアプリとの関係に応じて、これらのディレクトリを読み取る権限がある場合とない場合があります。ただし、すべてのアプリはリソース.apkを読み取ることができます(これは、前方ロックされていないアプリの実際の.apkでもあります)。
シェルをざっと見ているだけの場合、現在、前方ロックされていないアプリは/data/app/.apkにあります。シェルユーザーは特定の.apkを読み取ることができますが、ディレクトリをリストすることはできません。将来のリリースでは、命名規則が少し変更される予定なので、同じままにしてはいけませんが、パッケージマネージャーから.apkのパスを取得すれば、シェルで使用できます。
プリインストールされたアプリは通常/ system / appにあり、ユーザーがインストールしたアプリは/ data / appにあります。
「adb pull」を使用できますが、APKファイルの完全パスを知っている必要があります。エミュレータでは、「adb shell」+「ls」を使用してディレクトリリストを取得できます。ただし、Androidデバイスでは、セキュリティ上の理由により、「/ data」フォルダーでこれを行うことはできません。では、APKファイルの完全なパスをどのように把握するのでしょうか。
PackageManagerにクエリを実行するプログラムを作成すると、インストールされているすべてのアプリの完全なリストを取得できます。以下の短いコードスニペット:
PackageManager pm = getPackageManager();
List<PackageInfo> pkginfo_list = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
List<ApplicationInfo> appinfo_list = pm.getInstalledApplications(0);
for (int x=0; x < pkginfo_list.size(); x++){
PackageInfo pkginfo = pkginfo_list.get(x);
pkg_path[x] = appinfo_list.get(x).publicSourceDir; //store package path in array
}
そのような情報を提供するアプリを見つけることもできます。それらはたくさんあります。 これを試してください(AppSender)。
マーケットプレイスからインストール
インストール後にapkを保持するかどうかは、マーケットプレイスの動作です。グーグルプレイはインストール後にAPKを保持しません。他のサードパーティマーケットプレイスでは、動作が異なる場合があります。
開発/デバッグツールからインストール(adb、eclipse、android studio)
デバッグツールからapkをインストールするとき、直接呼び出すadb install
か、eclipse / android studioから、apkはadb push
パブリックな読み取りおよび書き込み可能なディレクトリ(通常は)に転送されます()/data/local/tmp/
。その後、ツールはpm
コマンドを使用してインストールし、インストール/data/local/tmp/
が成功した後、一時的なapkを削除します。
これらの情報は、次のようにデバッグ出力から取得できます。
$ adb install bin/TestApplication.apk
3155 KB/s (843375 bytes in 0.260s)
pkg: /data/local/tmp/TestApplication.apk
Success
システムがAPKを保持する方法
もちろん、システムはすべてのAPKをどこかに保存する必要があります。異なるタイプのAPKに基づいてシステムがAPKを保持する場所は3つあります。
ストックアプリ用
これらは通常、システム実行用のコアアプリやgoogleサービスを含め、デバイスごとにデバイスで出荷され、ディレクトリ/system/app
およびで見つけることができます/system/priv-app
。
ユーザーがインストールしたアプリ
ほとんどのAPKはこのカテゴリに分類されます。これらのapkは通常、ユーザーによって、またはオプションadb install
なしでマーケットプレイスからインストールされ-s
ます。/data/app
ルート権限を取得されたデバイスのディレクトリの下にあります。
SDカード上のアプリ
APK android:installLocation="auto"
がマニフェストでsdcard内のインストール場所を有効にすると、システムのアプリマネージャーメニューからアプリをsdcardに移動できます。これらのAPKは通常、SDカードの安全なフォルダにあります/mnt/sdcard/asec
。
インストール場所をsdcardに強制する別の方法は、コマンドを使用することadb install -s apk-to-install.apk
です。
注意点として、プレインストールされたアプリの.apk
ファイルは単一のファイルではなくなりました。ディレクトリ内のすべてのプリインストールされたアプリ/system/app
または/system/priv-app
最新のAndroidリリースのファイルを含むフォルダーがあります。
Eclipse goto DDMSを使用していて、そこにファイルエクスプローラーを使用している場合、System / Appsフォルダーが表示され、apksがそこにあります
エミュレータにアプリをインストールすると、.apkファイルが表示されました
data / app次に、ls data / app //を使用して、存在するかどうかを確認しました
アプリをインストールしたら、lsコマンドvie shellを使用して目的のディレクトリを確認しますが、インストールしようとしているアプリケーションの種類によって異なります。 問題がある場合は、この方法を使用してポイントをインストールしました。
選ばれた解答に書かれているものとは対照的に、あなたはルートを必要としない、私が(私のアプリでそれをやった方法である、インストールされたアプリのAPKのを取得することが可能であるここ)。例:
List<PackageInfo> packages=getPackageManager().getInstalledPackages(0);
次に、リストの各項目について、packageInfo.applicationInfo.sourceDirにアクセスできます。これは、インストールされているアプリのAPKの完全パスです。