Я хочу реализовать в Android безмолвный файл installer-from-apk файл и unistaller-package. Тема в основном обсуждалась в SO и в других местах, но я не могу применить по какой-то причине, что мне не хватает. Масштабы, очевидно, трудно достичь, поскольку в случае успеха это будет серьезное нарушение безопасности в Android. НО, мне нужно реализовать его для специального проекта, а не для потребительского рынка. Существует два подхода:
- для создания пользовательского ПЗУ из исходного кода (например, AOSP или Cyanogen mod), путем настройки инсталлятора PackageManager (на самом деле просто для удаления диалоговых окон принятия пользователем).
- сделать это программно, создав процесс как суперпользователя и выполнив "adb shell pm install". Я ранее устанавливал 'su' в /system/xbin, и я тестировал во время выполнения RootTools.rootIsAvailable().
В первом случае я выкопал исходный код Froyo, но попал в тупик с помощью метода @hide. Для второго я сначала попробовал команды из терминала
adb shell pm install /mnt/sdcard/HelloAndroid.apk
и
adb shell pm uninstall com.example.helloandroid
Оба работают нормально. Затем я использовал следующий код: разработка тестировалась на внедренном эмуляторе (2.2 - Froyo):
@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;
}
}
Чтобы избежать опечаток и других обрезков, я жестко запрограммировал параметр файла apk команды для установки; on 'case R.id.btnInstall' команда не выполняется, а выход включен в "Failure" с значением выхода 1, что означает, что "класс не может быть найден"; не знаю, что это значит... Я ценю вашу помощь!
EDITED: у меня есть чистое решение, я отправлю ответ от A-Z, как только у меня появится время и код в правильной форме!