INSTALL_PACKAGES izni ile uygulamaları sessizce yükleyin


86

Sisteme sessizce apk yüklemeye çalışıyorum. Uygulamam / system / app konumunda bulunuyor ve "android.permission.INSTALL_PACKAGES" izni başarıyla verildi

Ancak bu izni nasıl kullanacağımı hiçbir yerde bulamıyorum. Dosyaları / data / app konumuna kopyalamaya çalıştım ve başarılı olamadım. Ayrıca bu kodu kullanmayı denedim

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

Ancak bu kod standart kurulum iletişim kutusunu açar. Uygulamayı root olmadan sessizce nasıl yükleyebilirim android.permission.INSTALL_PACKAGES?

PS İlk çalıştırmada sisteme klasörden birçok apk yükleyecek bir uygulama yazıyorum (Kurulum Sihirbazını değiştirin). Aygıt yazılımını daha hafif hale getirmek için ona ihtiyacım var.

Bir virüs yazdığımı düşünüyorsanız: Tüm programlar / data / app içine yüklenir. Kurulum_ paketleri izni yalnızca / system / app içinde bulunan veya sistem anahtarıyla imzalanan sistem düzeyindeki programlara verilebilir. Yani virüs oraya ulaşamaz.

Dediğim gibi http://www.mail-archive.com/android-porting@googlegroups.com/msg06281.html uygulamalar, yükleme_ paketleri izinlerine sahiplerse sessizce yüklenebilir. Dahası, paketleri sessizce kurmak için Install_packages iznine ihtiyacınız yoktur. Ayrıca http://www.androidzoom.com/android_applications/tools/silent-installer_wgqi.html


9
@Fosco Orijinal ekipman üreticisi gibi bir cihaz yaptığını varsayalım?
dascandy

41
@Fosco Kimin umurunda? Dascandy'nin tanımladığı gibi geçerli bir soru. İnsanlar bunun gibi sorulara "Bunu yapmamalısın" diye cevap verdiklerinde genellikle verimsizdir. Bu tür bir cevapla nasıl bir anlayış kazanıyoruz?
ZachM

3
Verimsizlikten bahsetmişken .. bu partiye 2 yıldan biraz daha geç kaldın Zach ve soru başlangıçta olduğundan çok daha farklı görünüyor.
Fosco

2
@Fosco LOL. Ayrıca bunun hala en yeni android işletim sisteminde çalıştığını doğrulayabilirim.
POMATu

1
@LarsH F-Droid uygulamasını yeni yükledim: Her şeyi sessizce yüklemiyorlar, sadece Android'in Paket Yöneticisine yönlendiriyorlar.
Joaquin Iurchuk

Yanıtlar:


60

İlk bahsiniz, Android'in yerel PackageInstaller'ına bakmaktır . Bu uygulamayı istediğiniz gibi değiştirmenizi veya sadece gerekli işlevselliği çıkarmanızı öneririm.


Özellikle, PackageInstallerActivity ve yöntemine bakarsanız 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();
    }
}

Ardından, gerçek yükleyicinin InstallAppProgress sınıfında olduğunu fark edeceksiniz . Bu sınıfı incelerken initView, bunun temel yükleyici işlevi olduğunu göreceksiniz ve yaptığı son şey PackageManager's installPackageişlevini çağırmaktır :

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

Sonraki adım, soyut sınıf olan PackageManager'ı incelemektir . installPackage(...)Orada işlev bulacaksınız . Kötü haber, @hide ile işaretlenmiş olmasıdır. Bu, doğrudan kullanılamayacağı anlamına gelir (bu yönteme çağrı yaparak derleyemezsiniz).

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

Ancak bu yöntemlere yansıtma yoluyla erişebileceksiniz.

Nasıl ilgilenen varsa PackageManagerbireyin installPackagefonksiyonu uygulanır, bakmak PackageManagerService .

Özet

Context'S aracılığıyla paket yöneticisi nesnesini almanız gerekir getPackageManager(). Ardından installPackageyansıma yoluyla işlevi çağıracaksınız .


2
Yardım! Bu teknik şunlarla sonuçlanır: Neden olduğu: java.lang.SecurityException: Ne kullanıcı 10101 ne de geçerli işlem android.permission.INSTALL_PACKAGES'a sahip değildir. Uygulamamın bu izni olmasına rağmen
gregm

14
Uygulamanız bu izni istiyor, ancak Android bu izni üçüncü taraf uygulamalara vermiyor. LogCatİzinle ilgili günlükler için bakın .
inazaruk

@inazaruk / system / app dizinine yüklenen uygulamaların otomatik olarak install_pakages'ı kullanmak için izin alacağını okudum, ancak bu yazıda açıklandığı gibi çalışmıyor gibi görünüyor. bana biraz ipucu verebilir misin?
Zorb

3
Yansıma yoluyla installPackage'ı nasıl çağırabilirim? aslında Yöntem yapamıyorum method = aPackageManagerClass.getMethod ("installPackage", new Class [] {Uri.class, IPackageInstallObserver.class, Integer.TYPE, String.class}); IPackageInstallObserver'ın da gizli olduğu göz önüne alındığında, birisi bana yardımcı olabilir, burada yansıma yapmak için doğru kodu gönderebilir.
Shilaghae

8
Cevaptaki tüm bağlantılar öldü.
Mayur Gangurde

13

ADB'nin uygulamaları nasıl yüklediğini kontrol ettim.
-
APK'yi / data / local / tmp konumuna kopyalar - 'shell: pm install /data/local/tmp/app.apk' çalıştırır

Bunu yaparak bu davranışı kopyalamaya çalıştım: (pc'de, usb kablosu kullanarak)
adb push app.apk /sdcard/app.apk
adb shell
$ pm install /sdcard/app.apk
Bu işe yarıyor. Uygulama yüklendi.

Diğer uygulamayı yüklemesi gereken bir uygulama (AppInstall adlı) yaptım.
(normal olarak kurulur, köklü olmayan cihaz)
Bunu yapar:
Runtime.getRuntime().exec("pm install /sdcard/app.apk").waitFor();
Ancak bu hatayı verir:
java.lang.SecurityException: Neither user 10019 nor current process has android.permission.INSTALL_PACKAGES.
Hata, AppInstall tarafından değil, pm tarafından atılmış gibi görünüyor.
Çünkü SecurityException AppInstall tarafından yakalanmaz ve uygulama çökmez.

Aynı şeyi köklü bir cihazda (aynı uygulama ve AppInstall) denedim ve bir cazibe gibi çalıştı.
(Ayrıca normalde kurulur, / system veya herhangi bir şeye
değil ) AppInstall root izni bile istemedi.
Ama kabuk daima şu nedeniyle #yerine $o cihazdaki.

BTW, bir uygulamayı / sisteme yüklemek için root'a ihtiyacınız var, doğru mu?
Rootlu olmayan cihazda adb'yi yeniden kurmayı denedim ve aldım:
remount failed: Operation not permitted.
Bu yüzden root olmayan cihazda / system olayını deneyemedim.

Sonuç: Köklü bir cihaz kullanmalısınız
Umarım bu yardımcı olur :)


Bunu çalıştıracak gibi görünmüyorum. Komutun ADB kabuğunda iyi çalışması ve programlı olarak çalıştırmayı denediğimde çalışmıyor olması ilginç.
saulpower 01

Evet, bende de aynı sorun var - kabukta çalışıyor, ancak uygulamamdan çağrıldığında değil, onu kullanarak su
çağırsam

Google cihazlarında çalışmanın süper yönetici izinleri gibi başka bir yolu var mı?
Ramesh Kumar

Süper yönetici izinleri istiyorsanız: 1) cihazınızı köklendirmelisiniz, 2) uygulamanın sistem bölümünde yüklü olmasını sağlamalı, 3) veya uygulama işletim sisteminin kendisiyle aynı anahtarla imzalanmalıdır.
FrankkieNL

1
Bu, ADB kullanıcısının ve uygulamanızın kullanıcısının farklı izinlere sahip olması nedeniyle olur
PHPoenX

13

Son zamanlarda kullanıcı izni olmadan kurulum gerçekleştiriyorum - bu, ortam üzerinde tam kontrole sahip olduğum API seviyesi 21+ için bir kiosk uygulamasıydı.

Temel gereksinimler

  • API seviyesi 21+
  • Güncelleyiciyi sistem ayrıcalıklı bir uygulama olarak yüklemek için kök erişimi .

Aşağıdaki yöntem, APK'yı InputStream'den okur ve yükler:

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;
    }

Aşağıdaki kod kurulumu çağırır

 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();
     }

her şeyin çalışması için çaresizce INSTALL_PACKAGESizne ihtiyacınız var , yoksa yukarıdaki kod sessizce başarısız olur

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

Bu izni almak için APK'nızı kök GEREKTİREN Sistem uygulaması olarak yüklemeniz gerekir (ancak güncelleyici uygulamanızı yükledikten SONRA, kök OLMADAN çalışıyor gibi görünüyor)

Sistem uygulaması olarak yüklemek için imzalı bir APK oluşturdum ve

adb push updater.apk /sdcard/updater.apk

ve sonra buraya taşıdı system/priv-app- bu, FS'nin yeniden bağlanmasını gerektirir (bu nedenle kök gereklidir)

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

bazı nedenlerden dolayı basit hata ayıklama sürümüyle çalışmadı, ancak logcat , uygulamanız priv-appherhangi bir nedenle alınmadıysa yararlı bilgiler gösterir .


"bazı nedenlerden dolayı basit hata ayıklama sürümüyle çalışmadı" Sürümde mi yoksa daha az "basit" hata ayıklama sürümünde mi çalıştığını mı söylüyorsunuz?
JM Lord

1
@JMLord İmzalı yayın sürümüyle çalıştı ve hem imzalı hem de imzasız hata ayıklama sürümleriyle çalışmadı - imzalı hata ayıklama sürümüyle çalışmamasını garip buldum, ancak araştırmaya zamanım olmadı. Bununla birlikte, sistem logcat günlüğü, APK'nin yüklü olup olmadığını öğrenmek için çok önemlidir.
Boris Treukhov

Aslında, bazı nedenlerden dolayı, INSTALL_PACKAGES iznini almanın anahtarı sürüm olarak kurmaktı. Uygulama, özel uygulamadan imzalı hata ayıklamada çalıştırılabilir, ancak izin isteği reddedildi. Çok teşekkürler!
JM Lord

@BorisTreukhov Hey, packageName parametresinin ne için olduğunu sizinle kontrol edebilir miyim? InputStream'i FileInputStream olarak değiştirdim ancak şu hata mesajını alıyorum: /data/app/vmdl676191029.tmp/COSU ayrıştırılamadı

bu komutlardan sonra sistem özel uygulaması nasıl kurulur?
user2323471

8

Tanımlamalısın

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

bildiriminizde, ister sistem bölümünde (/ system / app) olun, ister uygulamanızı üretici tarafından imzaladıysanız, INSTALL_PACKAGES iznine sahip olacaksınız.

Benim önerim, yansıma yoluyla installPackages'ı çağırmak için kullanılan 1.5 uyumluluk düzeyine sahip küçük bir android projesi oluşturmak ve paketleri kurmak ve gerçek yöntemleri çağırmak için yöntemler içeren bir kavanozu dışa aktarmaktır. Ardından, projenize kavanozu içe aktararak paketleri kurmaya hazır olacaksınız.


5

Köklü Android 4.2.2'yi denedim ve bu yöntem benim için çalışıyor:

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();
        }
     }
}

2
Soru, kök olmadan, ancak sistem "INSTALL_PACKAGES" iznine sahip uygulamaları yüklemekle ilgiliydi. Cevabınızda "su" görüyorum, bu yüzden root gerektiriyor.
POMATu

Bu cevap için çok teşekkür ederim! Aynı koda sahiptim ama "pm install -r" yerine "adb install -r" kullanıyordum ve bu benim için çalışmıyordu. Bana burada çok zaman kazandırdın!
Jeff.H

@Vladmir yardımına ihtiyacım var. Bana biraz zaman verir misin? U
twana tur 8'20

4

Bunu nasıl yapacağım hakkında hiçbir fikrim yoktu, çünkü o zaman kimse cevap vermedi ve bu izinle ilgili hiçbir belge bulamadım. Bu yüzden kendi çözümümü buldum. Seninkinden daha kötü, ama yine de bu bir çözüm.

Meşgul kutusu yükledim, 777 iznini / data / app'a ayarladım (güvenlik umurumda değil). Ardından uygulamadan "busybox yüklemesi" gerçekleştirildi. Bu işe yarıyor, ancak büyük bir güvenlik sızıntısı var. 777 izinlerini ayarlarsanız, kök gerekmez.


3
böyle bir kod kullandın mı? Process install; install = Runtime.getRuntime().exec("/system/bin/busybox install " + myAPK.getAbsolutePath()); int iSuccess = install.waitFor();
Someone Somewhere

4

Gizli API'yi android.content.pm.IPackageInstallObserveryansıtarak kullanabilirsiniz:

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();
        }
    }
}

android.content.pm.IPackageInstallObserverProjenize aktarın . Uygulamanız sistem olmalıdır. android.permission.INSTALL_PACKAGESManifest dosyanızdaki izni etkinleştirmelisiniz .


Bu kodu Lollipop ve Marshamallow'da test ettiniz mi? Bana harika bir yaklaşım gibi görünüyor ve onu kullanmak istiyorum
Farhad Faghihi


Bakılacak satır "uygulamanız sistem olmalıdır". Uygulamanızın "sistem" olduğu, yani uygulamanızın sistem izinlerine (temelde kök) sahip olduğu varsayılırsa, bunun lolipop veya her neyse üzerinde çalışacağından oldukça eminim. Bu durumda, komut satırı yükleyicisini de kullanabilirsiniz.
Lassi Kinnunen

1
installPackage yöntemini nasıl çağırıyorum? Yani, örneğin bir IPackageInstallObserver'ı nasıl edinebilirim?
phoebus

İnstallFlags değeri nedir?
Shivam Kumar

3

APK'yi sessizce yüklemek / güncellemek için adb install komutunu kullanabilirsiniz. Örnek kod aşağıdadır

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();
        }
     }
  }

StringUtils ile kastedilen nedir? Çözülemeyen bir hatayla mı karşılaşıyorum?
AndroidOptimist

üzgünüm açıklamalıydım. bu benim dizeler için özel sınıfım ve bu yöntem yolun doğru olduğundan emin oluyor. bunu görmezden gelebilirsin
ZeeShaN AbbAs

3
StringUtil sınıfı nedir. StringUtil.insertEscape () yöntemini gönderebilir misiniz ?. çünkü bu satırı yorum yaparsam istisna alıyorum exec () çalıştırılırken hata oluştu. Komut: [su, -c, adb install -r /storage/sdcard0/Android/data/com.install.file Şimdiden teşekkürler
sandeepmaaram

java.io.IOException: exec () çalıştırılırken hata oluştu. Komut: [su, -c, adb install -r /storage/emulated/0/download/SwipeAnimation.apk] Çalışma Dizini: boş Ortam: null - hatayı açıklayabilir misiniz ..? ve manifestte herhangi bir izin varsa
Sandeep P

1
@ZeeShaNAbbAs köklenme sorunu çözüldükten sonra .. teşekkürler
Sandeep P

1

Ön koşul:

APK'nızın daha önce doğru bir şekilde belirtildiği gibi sistem tarafından imzalanması gerekiyor. Bunu başarmanın bir yolu, AOSP görüntüsünü kendiniz oluşturmak ve kaynak kodunu yapıya eklemektir.

Kod:

Sistem uygulaması olarak yüklendikten sonra, bir APK'yi yüklemek ve kaldırmak için paket yöneticisi yöntemlerini aşağıdaki gibi kullanabilirsiniz:

Yüklemek:

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;
    }
}

Kaldır:

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;
    }
}

APK'nız yüklendikten / kaldırıldıktan sonra geri aranmak için şunu kullanabilirsiniz:

/**
 * 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);
}

===> Android 8.1'de test edildi ve iyi çalıştı.


yardımınıza ihtiyaçım var. Bana biraz zaman verir misin? U
twana tur

Yardımını istiyorum. Kendi
AOSP'imizi

0

PackageManager.installPackage yöntemini kullanarak sessiz yüklemeler için bir test uygulaması yaptım.

Yansıma yoluyla installPackage yöntemini aldım ve src klasörümde android.content.pm.IPackageInstallObserver arayüzünü yaptım (çünkü android.content.pm paketinde gizli).

İnstallPackage'ı çalıştırdığımda, uygulamamın android.permission.INSTALL_PACKAGES içermediğini, ancak AndroidManifest.xml'de tanımlandığını belirten dize göstergeli SecurityException aldım.

Yani bence bu yöntemi kullanmak mümkün değil.

PS. Android SDK 2.3 ve 4.0'da test ettim. Belki daha önceki sürümlerle çalışacaktır.


4.1 ve 4.0'da ve 2.1'den daha yüksek herhangi bir android sürümünde (2.1 dahil) çalışıyor. Şimdi 4.0 SDK kullanıyorum. Bunu / system / app klasörüne eklemeniz gerekir, aksi takdirde uygulamanız gerekli sistem düzeyinde (kök değil) izinlere sahip olmayacaktır. Ayrıca bu yöntemle uygulamaları sessizce silebilirim, silme ile ilgili diğer sorumu kontrol edin.
POMATu

Evet, çalışıyor, ancak yalnızca kök izinleriyle. Ayrıca rootlu olmayan cihazda sisteme / uygulamaya uygulama yüklemek mümkün değildir.
Андрей Москвичёв

Kök ile değil, sistem düzeyinde izinlerle. Bir üretici yazılımı üreticiyseniz, bunu / system / app'a ekleyebilirsiniz. Benim durumumda - öyleyim (cihaz üreticilerinden apks'imi bellenime eklemelerini istiyorum). Uygulamaları başka hiçbir şekilde sessizce yükleyemezsiniz - aksi takdirde bu büyük bir güvenlik açığı olur.
POMATu

Güvenlik açığı hakkında - kesinlikle size katılıyorum. Ve bu yöntemin herhangi bir uygulamada işe yaraması benim için sürpriz olacak. Uygulamayı köklendirme yapmadan / sistem / uygulamaya nasıl yükleyebilirim? Ben üretici değilim.
Андрей Москвичёв

1
Kök olmadan veya yeniden yanıp sönmeden yapamazsınız.
POMATu

0

Bunu LD_LIBRARY_PATH=/vendor/lib:/system/libpm kurulumundan önce deneyin . İyi çalışıyor.


0

Bir 3. taraf uygulaması, bir Android Uygulamasını kolayca yükleyemez. Ancak, bir 3. taraf uygulaması Android işletim sisteminden bir uygulama yüklemesini isteyebilir.

Yani şunu tanımlamalısınız:

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

Ayrıca izin vermek ve bu tanımlamayı göz ardı etmek için onu bir sistem uygulaması olarak yüklemeyi deneyebilirsiniz. (Root gerekli)

Köklü cihaza bir uygulama yüklemek için 3. taraf uygulamanızda aşağıdaki komutu çalıştırabilirsiniz.

Kod:

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();
    }
 }
}

Umarım bu cevap size yardımcı olur.


0

Android 6 ve üzeri sürümlerde sessiz kurulum yapmak mümkündür. Boris Treukhov tarafından verilen cevapta verilen işlevi kullanarak, gönderideki diğer her şeyi yok sayın, kök de gerekmez.

Uygulamanızı cihaz yöneticisi olarak yükleyin, arka planda güncellemelerin sessiz yüklenmesi ile tam kiosk moduna sahip olabilirsiniz.




-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

Bu benim için çalışıyor. Bunu ubuntu 12.04'te, kabuk terminalinde çalıştırıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.