Установка APK, который обновляет то же приложение, не удалось на Android 10; java.lang.securityexception: файлы все еще Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Установка APK, который обновляет то же приложение, не удалось на Android 10; java.lang.securityexception: файлы все еще

Сообщение Anonymous »

Наше приложение загружает APK с нашего сервера и запускает его для обновления. Как упомянуто в Android 10 - не обнаружено, что активность, которая обрабатывает намерения, и Xamarin Android 10 устанавливает APK - не обнаружено, что это не обращает внимания на намерения, это не работает, как ранее, если мобильное устройство было обновлено до Android 10, получая «не обнаружено активности, которое вызывает намерение».

Мы попытались переписать это, используя PackageInstaller, как в примере
https://android.googlesource.com/platfo ... apscession. < /p>

signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: 'JNI DETECTED ERROR IN APPLICATION: JNI GetStaticMethodID called with pending exception java.lang.SecurityException: Files still open
at java.lang.Exception android.os.Parcel.createException(int, java.lang.String) (Parcel.java:2071)
at void android.os.Parcel.readException(int, java.lang.String) (Parcel.java:2039)
at void android.os.Parcel.readException() (Parcel.java:1987)
at void android.content.pm.IPackageInstallerSession$Stub$Proxy.commit(android.content.IntentSender, boolean) (IPackageInstallerSession.java:593)
at void android.content.pm.PackageInstaller$Session.commit(android.content.IntentSender) (PackageInstaller.java:1072)
at void com.mycompany.myApp.QtJavaCustomBridge.JIntentActionInstallApk(java.lang.String) (QtJavaCustomBridge.java:301)
at void org.qtproject.qt5.android.QtNative.startQtApplication() (QtNative.java:-2)
at void org.qtproject.qt5.android.QtNative$7.run() (QtNative.java:374)
at void org.qtproject.qt5.android.QtThread$1.run() (QtThread.java:61)
at void java.lang.Thread.run() (Thread.java:919)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.pm.PackageInstallerSession.assertNoWriteFileTransfersOpenLocked(PackageInstallerSession.java:837)
at com.android.server.pm.PackageInstallerSession.sealAndValidateLocked(PackageInstallerSession.java:1094)
at com.android.server.pm.PackageInstallerSession.markAsCommitted(PackageInstallerSession.java:987)
at com.android.server.pm.PackageInstallerSession.commit(PackageInstallerSession.java:849)
at android.content.pm.IPackageInstallerSession$Stub.onTransact(IPackageInstallerSession.java:306)
(Throwable with no stack trace)

< /code>

Вот код, который мы используем: < /p>

public static final String TAG = "JAVA";
public static final String PACKAGE_INSTALLED_ACTION = "com.mycompany.myApp.SESSION_API_PACKAGE_INSTALLED";

public static void JIntentActionInstallApk(final String filename)
{
PackageInstaller.Session session = null;
try {
Log.i(TAG, "JIntentActionInstallApk " + filename);
PackageInstaller packageInstaller = MyAppActivity.getActivityInstance().getPackageManager().getPackageInstaller();
Log.i(TAG, "JIntentActionInstallApk - got packageInstaller");
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
Log.i(TAG, "JIntentActionInstallApk - set SessionParams");
int sessionId = packageInstaller.createSession(params);
session = packageInstaller.openSession(sessionId);
Log.i(TAG, "JIntentActionInstallApk - session opened");

// Create an install status receiver.
Context context = MyAppActivity.getActivityInstance().getApplicationContext();
addApkToInstallSession(context, filename, session);
Log.i(TAG, "JIntentActionInstallApk - apk added to session");

Intent intent = new Intent(context, MyAppActivity.class);
intent.setAction(MyAppActivity.PACKAGE_INSTALLED_ACTION);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.getIntentSender();
// Commit the session (this will start the installation workflow).
session.commit(statusReceiver);
Log.i(TAG, "JIntentActionInstallApk - commited");
} catch (IOException e) {
throw new RuntimeException("Couldn't install package", e);
} catch (RuntimeException e) {
if (session != null) {
session.abandon();
}
throw e;
}
}

private static void addApkToInstallSession(Context context, String filename, PackageInstaller.Session session)
{
Log.i(TAG, "addApkToInstallSession " + filename);
// It's recommended to pass the file size to openWrite(). Otherwise installation may fail
// if the disk is almost full.
try {
OutputStream packageInSession = session.openWrite("package", 0, -1);
InputStream input;
Uri uri = Uri.parse(filename);
input = context.getContentResolver().openInputStream(uri);

if(input != null) {
Log.i(TAG, "input.available: " + input.available());
byte[] buffer = new byte[16384];
int n;
while ((n = input.read(buffer)) >= 0) {
packageInSession.write(buffer, 0, n);
}
}
else {
Log.i(TAG, "addApkToInstallSession failed");
throw new IOException ("addApkToInstallSession");
}

}
catch (Exception e) {
Log.i(TAG, "addApkToInstallSession failed2 " + e.toString());
}
}

...

@Override
protected void onNewIntent(Intent intent) {
Bundle extras = intent.getExtras();
if (PACKAGE_INSTALLED_ACTION.equals(intent.getAction())) {
int status = extras.getInt(PackageInstaller.EXTRA_STATUS);
String message = extras.getString(PackageInstaller.EXTRA_STATUS_MESSAGE);
switch (status) {
case PackageInstaller.STATUS_PENDING_USER_ACTION:
// This test app isn't privileged, so the user has to confirm the install.
Intent confirmIntent = (Intent) extras.get(Intent.EXTRA_INTENT);
startActivity(confirmIntent);
break;
case PackageInstaller.STATUS_SUCCESS:
Toast.makeText(this, "Install succeeded!", Toast.LENGTH_SHORT).show();
break;
case PackageInstaller.STATUS_FAILURE:
case PackageInstaller.STATUS_FAILURE_ABORTED:
case PackageInstaller.STATUS_FAILURE_BLOCKED:
case PackageInstaller.STATUS_FAILURE_CONFLICT:
case PackageInstaller.STATUS_FAILURE_INCOMPATIBLE:
case PackageInstaller.STATUS_FAILURE_INVALID:
case PackageInstaller.STATUS_FAILURE_STORAGE:
Toast.makeText(this, "Install failed! " + status + ", " + message,
Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "Unrecognized status received from installer: " + status,
Toast.LENGTH_SHORT).show();
}
}
}
< /code>

Target SDK установлен в API 23, чтобы иметь возможность поддерживать старые устройства, которые имеют некоторые клиенты. Мы используем QT в качестве платформы приложения, но Java для нативных функций Android, подобных этому. < /p>

Некоторые мысли по этому поводу:

* в Xamarin Android 10 Установить APK - не обнаружено, что и намерение, они упоминают, что им необходимо сделать дополнительную коллекцию мусора в Xamarin. Может, это из -за той же проблемы, с которой мы здесь есть? Если так, как мы могли бы пройти это в Java напрямую? Будет ли это работать вообще с помощью установщика пакета? Если нет, то нужно ли тогда использовать второе приложение для обновления оригинала?>

Подробнее здесь: https://stackoverflow.com/questions/583 ... g-security
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»