Installiere / Deinstalliere den Befehl von der Shell in Android

Ich möchte ein Silent Installer-From-Apk-File und ein Unistaller-Package in Android implementieren. Das Thema wurde größtenteils auf SO und anderswo diskutiert, aber ich kann mich aus irgendeinem Grund, den ich vermisse, nicht bewerben. Der Anwendungsbereich ist offensichtlich schwer zu erreichen, da er im Erfolgsfall eine schwerwiegende Sicherheitsverletzung in Android darstellen würde. ABER ich muss es für ein spezielles Projekt umsetzen, nicht für den Verbrauchermarkt. Es gibt zwei Ansätze:

Erstellen eines benutzerdefinierten ROMs aus einem Quellcode (z. B. AOSP oder Cyanogen Mod) durch Optimieren des PackageManager-Installationsprogramms (eigentlich nur, um die Benutzerakzeptanzdialogfelder zu entfernen).Um dies programmatisch zu tun, erstellen Sie einen Prozess als Superuser und führen eine 'AdB-Shell-PM-Installation' aus. Ich habe zuvor 'su' in / system / xbin installiert und während der Laufzeit getestet, ob RootTools.rootIsAvailable () verfügbar ist.

Im ersten Fall habe ich mich mit dem Froyo-Quellcode befasst, bin aber mit einer @hide-Methode in eine Sackgasse geraten. Zum zweiten habe ich zuerst die Befehle vom Terminal aus ausprobiert

adb shell pm install /mnt/sdcard/HelloAndroid.apk

und

adb shell pm uninstall com.example.helloandroid

Beide arbeiten in Ordnung. Dann habe ich den folgenden Code verwendet, wobei die Entwicklung auf einem gerooteten Emulator (2.2 - Froyo) getestet wurde:

@Override
    public void onClick(View v) {
        switch (v.getId())
           {
              case R.id.btnInstall:
                  try {  
                      install = Runtime.getRuntime().exec("su\n");   
                      DataOutputStream os = new DataOutputStream(install.getOutputStream());
                      os.writeBytes("pm install /mnt/sdcard/HelloAndroid.apk\n"); 
                      os.writeBytes("exit\n"); 
                      os.flush();
                      install.waitFor();

                              if (install.exitValue() == 0) {  
                                  Toast.makeText(MainActivity.this, "Success!", Toast.LENGTH_LONG).show();
                              }  
                              else {  
                                  Toast.makeText(MainActivity.this, "Failure. Exit code: "+String.valueOf(install.exitValue()), Toast.LENGTH_LONG).show();
                              }
                  }
                  catch (InterruptedException e) {  
                      logError(e);
                  }
                  catch (IOException e) {  
                  logError(e);
                  } 
                  break;

              case R.id.btnUninstall:
                  try {
                      install = Runtime.getRuntime().exec("su\n"); 
                      install=Runtime.getRuntime().exec("pm uninstall "+txtPackageName.getText().toString()+"\n");

                } catch (Exception e) {
                    logError(e);
                }
                  break;
           }

    }

Um Tippfehler und andere Fehler zu vermeiden, habe ich den Parameter apk file des Befehls für die Installation fest codiert. bei 'case R.id.btnInstall' wird der Befehl nicht ausgeführt und der Exit ist bei "Failure" mit Exit-Wert 1, was bedeutet, dass "die Klasse nicht gefunden werden kann"; Keine Ahnung, was das bedeutet ... Ich weiß deine Hilfe zu schätzen!

EDITED: Ich habe die saubere Lösung, ich werde die Antwort von A-Z posten, sobald ich die Zeit und den Code in der richtigen Form habe !!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage