Instal aplikasi secara diam-diam, dengan izin INSTALL_PACKAGES diberikan

86

Saya mencoba menginstal apk secara diam-diam ke dalam sistem. Aplikasi saya terletak di / system / app dan berhasil mendapatkan izin "android.permission.INSTALL_PACKAGES"

Namun saya tidak dapat menemukan cara menggunakan izin ini di mana pun. Saya mencoba menyalin file ke / data / app dan tidak berhasil. Saya juga mencoba menggunakan kode ini

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(
            Uri.parse("file:///sdcard/app.apk"),
            "application/vnd.android.package-archive");
    startActivity(intent);

Tetapi kode ini membuka dialog penginstalan standar. Bagaimana saya bisa menginstal aplikasi secara diam-diam tanpa root dengan diberikan android.permission.INSTALL_PACKAGES?

PS Saya sedang menulis sebuah aplikasi yang akan menginstal banyak apks dari folder ke dalam sistem pada awal pertama (ganti Setup Wizard). Saya membutuhkannya untuk membuat firmware lebih ringan.

Jika Anda mengira saya sedang menulis virus: Semua program diinstal ke / data / app. Izin Install_packages hanya dapat diberikan ke program tingkat sistem yang terletak di / system / app atau ditandatangani dengan kunci sistem. Jadi virus tidak bisa sampai ke sana.

Seperti yang dikatakan http://www.mail-archive.com/[email protected]/msg06281.html aplikasi DAPAT diinstal secara diam-diam jika mereka memiliki izin install_packages. Selain itu, Anda tidak memerlukan izin Install_packages untuk menginstal paket secara tidak diam-diam. Ditambah http://www.androidzoom.com/android_applications/tools/silent-installer_wgqi.html

POMATu
sumber
9
@Fosco Misalkan dia membuat perangkat seperti pabrikan peralatan asli?
keren
41
@Fosco Siapa peduli? Ini pertanyaan yang valid seperti yang dijelaskan oleh pesolek. Biasanya tidak produktif ketika orang menanggapi pertanyaan seperti ini dengan "Anda tidak boleh melakukan itu". Pemahaman apa yang kita peroleh dengan jawaban semacam itu?
ZachM
3
Berbicara tentang tidak produktif .. Anda sedikit lebih dari 2 tahun terlambat ke pesta ini Zach, dan pertanyaannya terlihat jauh berbeda dari yang semula.
Fosco
2
@Tokopedia Juga saya dapat mengonfirmasi bahwa ini masih berfungsi di OS Android terbaru.
POMATu
1
@LarsH Saya baru saja menginstal aplikasi F-Droid: Mereka tidak menginstal sesuatu secara diam-diam, Mereka hanya meminta Pengelola Paket Android.
Joaquin Iurchuk

Jawaban:

60

Taruhan pertama Anda adalah melihat PackageInstaller asli Android . Saya akan merekomendasikan untuk memodifikasi aplikasi itu sesuka Anda, atau hanya mengekstrak fungsionalitas yang diperlukan.


Secara khusus, jika Anda melihat PackageInstallerActivity dan metodenya onClickListener:

 public void onClick(View v) {
    if(v == mOk) {
        // Start subactivity to actually install the application
        Intent newIntent = new Intent();
        ...
        newIntent.setClass(this, InstallAppProgress.class);
        ...
        startActivity(newIntent);
        finish();
    } else if(v == mCancel) {
        // Cancel and finish
        finish();
    }
}

Kemudian Anda akan melihat bahwa penginstal sebenarnya terletak di kelas InstallAppProgress . Memeriksa bahwa kelas Anda akan menemukan bahwa initViewadalah fungsi inti installer, dan hal terakhir yang dilakukannya adalah panggilan untuk PackageManager's installPackagefungsi:

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

Langkah selanjutnya adalah memeriksa PackageManager , yang merupakan kelas abstrak. Anda akan menemukan installPackage(...)fungsi di sana. Kabar buruknya adalah itu ditandai dengan @hide. Ini berarti itu tidak tersedia secara langsung (Anda tidak akan dapat mengkompilasi dengan panggilan ke metode ini).

 /**
  * @hide
  * ....
  */
  public abstract void installPackage(Uri packageURI,
             IPackageInstallObserver observer, 
             int flags,String installerPackageName); 

Tetapi Anda akan dapat mengakses metode ini melalui refleksi.

Jika Anda tertarik pada bagaimana PackageManager's installPackagefungsi diimplementasikan, lihatlah PackageManagerService .

Ringkasan

Anda harus mendapatkan objek manajer paket melalui Context's getPackageManager(). Kemudian Anda akan memanggil installPackagefungsi melalui refleksi.

inazaruk
sumber
2
Tolong! Teknik ini menghasilkan: Disebabkan oleh: java.lang.SecurityException: Baik pengguna 10101 maupun proses saat ini tidak memiliki android.permission.INSTALL_PACKAGES. Meskipun aplikasi saya memiliki izin itu
gregm
14
Aplikasi Anda meminta izin itu, tetapi Android tidak memberikan izin itu ke aplikasi pihak ketiga. Lihat LogCatlog terkait izin.
inazaruk
@inazaruk saya membaca bahwa aplikasi yang diinstal di / system / app akan mendapatkan izin secara otomatis untuk menggunakan install_pakages tetapi seperti yang dijelaskan dalam posting ini tampaknya tidak berfungsi. bisakah kamu memberi saya beberapa petunjuk?
Zorb
3
Bagaimana cara memanggil installPackage melalui refleksi? sebenarnya saya tidak bisa melakukan Metode metode = aPackageManagerClass.getMethod ("installPackage", Kelas baru [] {Uri.class, IPackageInstallObserver.class, Integer.TYPE, String.class}); mengingat bahwa IPackageInstallObserver juga disembunyikan, dapatkah seseorang membantu saya, posting kode yang benar untuk melakukan refleksi di sini.
Shilaghae
8
Semua tautan di jawaban sudah mati.
Mayur Gangurde
13

Saya telah memeriksa bagaimana ADB menginstal aplikasi.
- Ini menyalin APK ke / data / local / tmp
- menjalankan 'shell: pm install /data/local/tmp/app.apk'

Saya telah mencoba untuk meniru perilaku ini dengan melakukan: (di pc, menggunakan kabel usb)
adb push app.apk /sdcard/app.apk
adb shell
$ pm install /sdcard/app.apk
Ini berfungsi. Aplikasi sudah terpasang.

Saya membuat aplikasi (bernama AppInstall) yang seharusnya menginstal aplikasi lain.
(diinstal secara normal, perangkat yang tidak di-rooting)
Memang:
Runtime.getRuntime().exec("pm install /sdcard/app.apk").waitFor();
Tapi ini memberikan kesalahan:
java.lang.SecurityException: Neither user 10019 nor current process has android.permission.INSTALL_PACKAGES.
Sepertinya kesalahan dilemparkan oleh pm, bukan oleh AppInstall.
Karena SecurityException tidak ditangkap oleh AppInstall dan aplikasi tidak mogok.

Saya telah mencoba hal yang sama pada perangkat yang di-rooting (aplikasi dan AppInstall yang sama) dan itu bekerja dengan sangat baik.
(Juga biasanya diinstal, bukan di / sistem atau apa pun)
AppInstall bahkan tidak meminta izin root.
Tapi thats karena shell selalu #bukan $pada perangkat itu.

Btw, Anda perlu root untuk menginstal aplikasi di / system, benar?
Saya mencoba adb remount pada perangkat yang tidak di-rooting dan mendapatkan:
remount failed: Operation not permitted.
Itulah mengapa saya tidak dapat mencoba hal / sistem pada perangkat yang tidak di-rooting.

Kesimpulan: Anda harus menggunakan perangkat yang di-rooting
Semoga ini membantu :)

FrankkieNL
sumber
Sepertinya aku tidak bisa membuat ini bekerja. Sangat menarik bahwa perintah tersebut berfungsi dengan baik di shell ADB dan kemudian sepertinya tidak berfungsi ketika saya mencoba menjalankannya secara terprogram.
saulpower
Ya, saya memiliki masalah yang sama - bekerja di shell, tetapi tidak saat dipanggil dari aplikasi saya, bahkan jika saya memanggilnya lewat su)
velis
Apakah ada cara lain untuk bekerja di perangkat Google seperti mendapatkan izin admin super?
Ramesh Kumar
Jika Anda menginginkan izin admin super, Anda harus: 1) melakukan root pada perangkat Anda, 2) menginstal aplikasi pada partisi sistem, 3) atau aplikasi harus ditandatangani dengan kunci yang sama dengan OS itu sendiri.
FrankkieNL
1
Itu terjadi karena pengguna ADB dan pengguna aplikasi Anda memiliki izin yang berbeda
PHPoenX
13

Saya telah menerapkan penginstalan tanpa izin pengguna baru-baru ini - ini adalah aplikasi kios untuk API level 21+ di mana saya memiliki kendali penuh atas lingkungan.

Persyaratan dasarnya adalah

  • API level 21+
  • akses root untuk menginstal updater sebagai aplikasi dengan hak istimewa sistem.

Metode berikut membaca dan menginstal APK dari InputStream:

public static boolean installPackage(Context context, InputStream in, String packageName)
            throws IOException {
        PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        params.setAppPackageName(packageName);
        // set params
        int sessionId = packageInstaller.createSession(params);
        PackageInstaller.Session session = packageInstaller.openSession(sessionId);
        OutputStream out = session.openWrite("COSU", 0, -1);
        byte[] buffer = new byte[65536];
        int c;
        while ((c = in.read(buffer)) != -1) {
            out.write(buffer, 0, c);
        }
        session.fsync(out);
        in.close();
        out.close();

        Intent intent = new Intent(context, MainActivity.class);
        intent.putExtra("info", "somedata");  // for extra data if needed..

        Random generator = new Random();

        PendingIntent i = PendingIntent.getActivity(context, generator.nextInt(), intent,PendingIntent.FLAG_UPDATE_CURRENT);
            session.commit(i.getIntentSender());


        return true;
    }

Kode berikut memanggil penginstalan

 try {
     InputStream is = getResources().openRawResource(R.raw.someapk_source);
                    installPackage(MainActivity.this, is, "com.example.apk");
     } catch (IOException e) {
                    Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
     }

agar semuanya bekerja, Anda sangat membutuhkan INSTALL_PACKAGESizin, atau kode di atas akan gagal secara diam-diam

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

untuk mendapatkan izin ini, Anda harus menginstal APK Anda sebagai aplikasi Sistem yang MEMBUTUHKAN root (namun SETELAH Anda menginstal aplikasi pembaru, tampaknya berfungsi TANPA root)

Untuk menginstal sebagai aplikasi sistem saya membuat APK yang ditandatangani dan mendorongnya dengan

adb push updater.apk /sdcard/updater.apk

dan kemudian memindahkannya ke system/priv-app- yang membutuhkan pemasangan ulang FS (inilah mengapa root diperlukan)

adb shell
su
mount -o rw,remount /system
mv /sdcard/updater.apk /system/priv-app
chmod 644 /system/priv-app/updater.apk

untuk beberapa alasan itu tidak berfungsi dengan versi debug sederhana, tetapi logcat menampilkan info berguna jika aplikasi Anda priv-apptidak diambil karena alasan tertentu.

Boris Treukhov
sumber
"karena alasan tertentu ia tidak bekerja dengan versi debug sederhana" Apakah maksud Anda ia bekerja dalam rilis, atau versi debug lain yang kurang "sederhana"?
JM Lord
1
@JMLord Ini bekerja dengan versi rilis yang ditandatangani, dan tidak berfungsi baik dengan versi debug yang ditandatangani maupun yang tidak ditandatangani - Saya merasa aneh bahwa itu tidak berfungsi dengan versi debug yang ditandatangani, tetapi saya tidak punya waktu untuk menyelidikinya. Namun demikian, logcat log sistem sangat penting untuk mengetahui apakah APK telah diinstal atau tidak.
Boris Treukhov
Memang, untuk beberapa alasan, menginstal sebagai rilis adalah kunci untuk mendapatkan izin INSTALL_PACKAGES. Aplikasi dapat berjalan dalam debug bertanda tangan dari priv-app, tetapi permintaan izin ditolak. Terima kasih banyak!
JM Lord
@BorisTreukhov Hai, bisakah saya menanyakan kepada Anda tentang untuk apa parameter packageName itu? Saya mengubah InputStream ke FileInputStream tetapi saya mendapatkan pesan kesalahan ini: Gagal mengurai /data/app/vmdl676191029.tmp/COSU
bagaimana cara menginstal aplikasi privat sistem setelah perintah ini?
pengguna2323471
8

Anda harus mendefinisikan

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

dalam manifes Anda, jika Anda berada di partisi sistem (/ system / app) atau aplikasi Anda ditandatangani oleh pabrikan, Anda akan memiliki izin INSTALL_PACKAGES.

Saran saya adalah membuat proyek android kecil dengan tingkat kompatibilitas 1,5 yang digunakan untuk memanggil installPackages melalui refleksi dan mengekspor jar dengan metode untuk menginstal paket dan memanggil metode yang sebenarnya. Kemudian, dengan mengimpor jar di proyek Anda, Anda akan siap untuk memasang paket.

iLRedEiMAtTi
sumber
5

Saya mencoba di Android 4.2.2 yang di-root dan metode ini berfungsi untuk saya:

private void installApk(String filename) {
    File file = new File(filename); 
    if(file.exists()){
        try {   
            final String command = "pm install -r " + file.getAbsolutePath();
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
     }
}
Vladimir
sumber
2
Pertanyaannya adalah tentang menginstal aplikasi tanpa root, tetapi dengan izin "INSTALL_PACKAGES" sistem. Saya melihat "su" dalam jawaban Anda, jadi ini membutuhkan root.
POMATu
Terima kasih banyak atas jawaban ini! Saya memiliki kode yang sama tetapi saya menggunakan "adb install -r" daripada "pm install -r" dan itu TIDAK akan berhasil untuk saya. Anda telah menghemat banyak waktu saya di sini!
Jeff.H
@Vladmir saya butuh bantuan Anda. Bisakah kamu memberi saya waktu. Saya akan sangat berterima kasih kepada u
twana eng
4

Saya tidak tahu bagaimana melakukan ini, karena tidak ada yang menjawab saat itu, dan saya tidak menemukan dokumentasi tentang izin ini. Jadi saya menemukan solusi saya sendiri. Ini lebih buruk dari milik Anda, tetapi ini adalah solusi.

Saya menginstal busybox, yang menetapkan 777 izin ke / data / app (Saya tidak peduli dengan keamanan). Kemudian jalankan saja "busybox install" dari aplikasi. Ini berfungsi, tetapi memiliki kebocoran keamanan yang besar. Jika Anda mengatur izin 777, tidak diperlukan root.

POMATu
sumber
3
apakah kamu menggunakan kode seperti ini? Process install; install = Runtime.getRuntime().exec("/system/bin/busybox install " + myAPK.getAbsolutePath()); int iSuccess = install.waitFor();
Seseorang Di Suatu Tempat
4

Anda dapat menggunakan API tersembunyi android.content.pm.IPackageInstallObserverdengan refleksi:

public class PackageManagement {
    public static final int INSTALL_REPLACE_EXISTING = 0x00000002;
    public static final int INSTALL_SUCCEEDED = 1;

    private static Method installPackageMethod;
    private static Method deletePackageMethod;

    static {
        try {
            installPackageMethod = PackageManager.class.getMethod("installPackage", Uri.class, IPackageInstallObserver.class, Integer.TYPE, String.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static void installPackage(PackageManager pm, Uri mPackageUri, IPackageInstallObserver observer, int installFlags, String installerPackageName) {
        try {
            installPackageMethod.invoke(pm, mPackageUri, observer, installFlags, installerPackageName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Impor android.content.pm.IPackageInstallObserverke dalam proyek Anda. Aplikasi Anda harus sistem. Anda harus mengaktifkan izin android.permission.INSTALL_PACKAGESdalam file manifes Anda.

Hermann Poilpre
sumber
Sudahkah Anda menguji kode ini di Lollipop dan Marshamallow? Sepertinya pendekatan yang luar biasa bagi saya dan saya ingin menggunakannya
Farhad Faghihi
Saya telah menguji dari ICS ke Lollipop
Hermann Poilpre
Baris yang harus dilihat adalah "aplikasi Anda harus menjadi sistem". Saya cukup yakin ini akan berfungsi pada lollipop atau apa pun - asalkan aplikasi Anda adalah "sistem", yaitu, aplikasi Anda memiliki izin sistem (pada dasarnya root). Dalam hal ini, Anda juga dapat menggunakan penginstal baris perintah.
Lassi Kinnunen
1
bagaimana saya memanggil metode installPackage? Artinya, bagaimana cara mendapatkan IPackageInstallObserver misalnya?
phoebus
Berapa nilai installFlags?
Shivam Kumar
3

Anda cukup menggunakan perintah adb install untuk menginstal / memperbarui APK secara diam-diam. Kode sampel ada di bawah

public static void InstallAPK(String filename){
    File file = new File(filename); 
    if(file.exists()){
        try {   
            String command;
            filename = StringUtil.insertEscape(filename);
            command = "adb install -r " + filename;
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
        e.printStackTrace();
        }
     }
  }
ZeeShaN Abbas
sumber
Di sini apa yang dimaksud dengan StringUtils? Apakah menghadapi kesalahan karena tidak dapat diselesaikan?
AndroidOptimist
maaf saya harus menjelaskan. ini adalah kelas khusus saya untuk string dan metode ini memastikan jalur tersebut benar. Anda dapat mengabaikannya
ZeeShaN AbbA
3
apa itu kelas StringUtil. dapatkah Anda memposting metode StringUtil.insertEscape () ?. Karena jika saya mengomentari baris itu saya mendapatkan pengecualian Kesalahan menjalankan exec (). Perintah: [su, -c, adb install -r /storage/sdcard0/Android/data/com.install.file Terima kasih sebelumnya
sandeepmaaram
java.io.IOException: Kesalahan menjalankan exec (). Perintah: [su, -c, adb install -r /storage/emulated/0/download/SwipeAnimation.apk] Direktori Kerja: null Lingkungan: null - dapatkah Anda menjelaskan kesalahannya ..? dan jika ada izin dalam manifest
Sandeep P
1
@ZeeShaNAbbAs setelah masalah rooting diselesaikan .. terima kasih
Sandeep P
1

Prasyarat:

APK Anda perlu ditandatangani oleh sistem seperti yang ditunjukkan dengan benar sebelumnya. Salah satu cara untuk mencapainya adalah dengan membuat gambar AOSP sendiri dan menambahkan kode sumber ke dalam build.

Kode:

Setelah diinstal sebagai aplikasi sistem, Anda dapat menggunakan metode pengelola paket untuk menginstal dan menghapus APK sebagai berikut:

Install:

public boolean install(final String apkPath, final Context context) {
    Log.d(TAG, "Installing apk at " + apkPath);
    try {
        final Uri apkUri = Uri.fromFile(new File(apkPath));
        final String installerPackageName = "MyInstaller";
        context.getPackageManager().installPackage(apkUri, installObserver, PackageManager.INSTALL_REPLACE_EXISTING, installerPackageName);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

Copot pemasangan:

public boolean uninstall(final String packageName, final Context context) {
    Log.d(TAG, "Uninstalling package " + packageName);
    try {
        context.getPackageManager().deletePackage(packageName, deleteObserver, PackageManager.DELETE_ALL_USERS);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

Untuk mendapatkan panggilan balik setelah APK Anda diinstal / di-uninstal, Anda dapat menggunakan ini:

/**
 * Callback after a package was installed be it success or failure.
 */
private class InstallObserver implements IPackageInstallObserver {

    @Override
    public void packageInstalled(String packageName, int returnCode) throws RemoteException {

        if (packageName != null) {
            Log.d(TAG, "Successfully installed package " + packageName);
            callback.onAppInstalled(true, packageName);
        } else {
            Log.e(TAG, "Failed to install package.");
            callback.onAppInstalled(false, null);
        }
    }

    @Override
    public IBinder asBinder() {
        return null;
    }
}

/**
 * Callback after a package was deleted be it success or failure.
 */
private class DeleteObserver implements IPackageDeleteObserver {

    @Override
    public void packageDeleted(String packageName, int returnCode) throws RemoteException {
        if (packageName != null) {
            Log.d(TAG, "Successfully uninstalled package " + packageName);
            callback.onAppUninstalled(true, packageName);
        } else {
            Log.e(TAG, "Failed to uninstall package.");
            callback.onAppUninstalled(false, null);
        }
    }

    @Override
    public IBinder asBinder() {
        return null;
    }
}

/**
 * Callback to give the flow back to the calling class.
 */
public interface InstallerCallback {
    void onAppInstalled(final boolean success, final String packageName);
    void onAppUninstalled(final boolean success, final String packageName);
}

===> Diuji pada Android 8.1 dan bekerja dengan baik.

phoebus.dll
sumber
Saya membutuhkan bantuan Anda. Bisakah kamu memberi saya waktu. Saya akan sangat berterima kasih kepada u
twana eng
Saya ingin bantuan Anda. Saya perlu tahu bagaimana kita bisa membuat AOSP kita sendiri
twana eng
0

Saya membuat aplikasi uji untuk penginstalan diam-diam, menggunakan metode PackageManager.installPackage.

Saya mendapatkan metode installPackage melalui refleksi, dan membuat antarmuka android.content.pm.IPackageInstallObserver di folder src saya (karena tersembunyi di paket android.content.pm).

Ketika saya menjalankan installPackage, saya mendapat SecurityException dengan indikasi string, bahwa aplikasi saya tidak memiliki android.permission.INSTALL_PACKAGES, tetapi didefinisikan di AndroidManifest.xml.

Jadi, menurut saya, tidak mungkin menggunakan metode ini.

PS. Saya mengujinya di Android SDK 2.3 dan 4.0. Mungkin itu akan bekerja dengan versi sebelumnya.

Андрей Москвичёв
sumber
Ini berfungsi di 4.1 dan 4.0 serta di versi Android apa pun yang lebih tinggi dari 2.1 (termasuk 2.1). Saya menggunakan 4.0 SDK sekarang. Anda perlu menambahkannya ke folder / system / app, jika tidak, aplikasi Anda tidak akan memerlukan izin tingkat sistem (bukan root). Saya juga dapat menghapus aplikasi secara diam-diam dengan metode ini, periksa pertanyaan saya yang lain terkait dengan penghapusan.
POMATu
Ya, ini berfungsi, tetapi hanya dengan izin root. Dan tidak mungkin untuk menginstal aplikasi ke dalam sistem / aplikasi pada perangkat yang tidak di-rooting.
Андрей Москвичёв
Bukan dengan root, tetapi dengan izin tingkat sistem. Anda dapat menambahkannya ke / system / app jika Anda adalah produsen firmware. Dalam kasus saya - saya (saya meminta produsen perangkat untuk menambahkan APK saya ke firmware). Anda tidak akan dapat menginstal aplikasi secara diam-diam dengan cara lain - jika tidak, itu akan menjadi lubang keamanan yang hebat.
POMATu
Tentang lubang keamanan - saya sangat setuju dengan Anda. Dan itu akan menjadi kejutan bagi saya, jika metode ini berfungsi dengan aplikasi apa pun. Bagaimana cara menginstal aplikasi ke / system / app tanpa rooting? Saya bukan pabrikan.
Андрей Москвичёв
1
Tanpa root atau reflashing Anda tidak bisa.
POMATu
0

Coba ini LD_LIBRARY_PATH=/vendor/lib:/system/libsebelum menginstal. Ini bekerja dengan baik.

Ankita Gujar
sumber
0

Aplikasi pihak ketiga tidak dapat menginstal Aplikasi Android secara diam-diam. Namun, aplikasi pihak ke-3 dapat meminta OS Android untuk menginstal aplikasi.

Jadi Anda harus mendefinisikan ini:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file:///sdcard/app.apk", "application/vnd.android.package-archive");
startActivity(intent);

Anda juga dapat mencoba menginstalnya sebagai aplikasi sistem untuk memberikan izin dan mengabaikan definisi ini. (Diperlukan Root)

Anda dapat menjalankan perintah berikut pada aplikasi pihak ketiga Anda untuk menginstal aplikasi pada perangkat yang di-rooting.

Kodenya adalah:

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

Saya harap jawaban ini bermanfaat untuk Anda.


sumber
0

Dimungkinkan untuk melakukan penginstalan diam-diam di Android 6 ke atas. Menggunakan fungsi yang disediakan dalam jawaban oleh Boris Treukhov, abaikan semua yang lain di pos, root juga tidak diperlukan.

Pasang aplikasi Anda sebagai admin perangkat, Anda dapat memiliki mode kios penuh dengan pemasangan pembaruan diam-diam di latar belakang.

Raymie
sumber
0

Saya memeriksa semua jawaban, kesimpulannya tampaknya Anda harus memiliki akses root ke perangkat terlebih dahulu untuk membuatnya berfungsi.

Tapi kemudian saya menemukan artikel ini sangat berguna. Karena saya membuat perangkat "milik perusahaan".

Cara Memperbarui Aplikasi Android Secara Diam-diam Tanpa Interaksi Pengguna

Pemilik Perangkat Android - Aplikasi Minimal

Berikut adalah dokumentasi Google tentang "perangkat-terkelola"

Perangkat yang dikelola sepenuhnya

h - n
sumber
0

Anda dapat menggunakan ini di terminal atau shell

adb shell install -g MyApp.apk

lihat lebih lanjut di develope google

Rasoul Miri
sumber
-6

! / bin / bash

f=/home/cox/myapp.apk   #or $1 if input from terminal.

#backup env var
backup=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=/vendor/lib:/system/lib
myTemp=/sdcard/temp.apk
adb push $f $myTemp
adb shell pm install -r $myTemp
#restore env var
LD_LIBRARY_PATH=$backup

Ini berhasil untuk saya. Saya menjalankan ini di ubuntu 12.04, di terminal shell.

pengemudi
sumber