Адаптация Android14. На что следует обратить внимание при установке существующих приложений на телефоны Android14?
Адаптация Android14. На что следует обратить внимание при установке существующих приложений на телефоны Android14?

«Давно не виделись~ За последние месяцы произошло много изменений. Будь то наша семья или социальное окружение, это также незаменимая способность делать то, что мы можем, и медленно адаптироваться к новым изменениям!

Android 14 скоро выйдет официально. На что вам как разработчику следует обратить внимание? Короче говоря, давайте посмотрим~

В основном разделен на две части: Во-первых, это касается всех Android приложения, эти изменения затронут все Приложение, пока вы App установлен в Android14 Эти эффекты затронут все устройства; Второе, когда targetSdkVersion обновить до 34 После этого наш App полученныйиз Влияние。Давайте сначала поговорим о первой части этой статьи.изсодержание,Прямо сейчассуществующий App установить в Android14 Какое влияние это окажет на мобильные телефоны?

1. Разрешение SCHEDULE_EXACT_ALARM отключено по умолчанию.

Полное название этого разрешения: android.permission.SCHEDULE_EXACT_ALARM,Используется для включения настройки точного разрешения будильника. Точный из будильника подходит для указанного пользователем времени уведомлений.,илидасуществовать Точное время, необходимое для выполнения операции.

Если для targetSdkVersion приложения установлено значение 33 (Android13) или выше, это разрешение отключено по умолчанию при запуске на устройстве Android14. Поэтому, когда в приложении используется точный будильник и операции необходимо выполнять в точное время, вам необходимо явно подать заявку на это разрешение в файле манифеста и динамически получать это разрешение от пользователя при его использовании.

В частности, при использовании AlarmManager в setExact(int type, long triggerAtMillis, PendingIntent operation)setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation) При использовании этих трех функций, если targetSdkVersion >= 33 и в Android14 Если разрешение явно не запрошено на устройстве, SecurityException аномальный.

Особые обстоятельства: 1) Если пользователь использует функцию «Резервное копирование и восстановление» для App перевод в Android14 на устройстве, то это App Это разрешение по-прежнему отключено по умолчанию; 2) Если App Уже включил Должен Разрешения, когда устройство обновится до Android14 Позже это App Разрешение включено; 3) Когда прозвучит точный будильник OnAlarmListener настраиватьиз,Нет необходимости подавать заявку Долженразрешения.Например:setExact(int type, long triggerAtMillis, String tag, AlarmManager.OnAlarmListener listener, Handler targetHandler) Этот метод не требует применения.

Используется чаще API: 1)boolean canScheduleExactAlarms() Определите, можно ли установить точный сигнал тревоги (API >= 31 Этот метод суждения существует только); 2)AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED Широковещательные сообщения часто используются для прослушивания обратных вызовов, когда пользователи включают или отключают это разрешение (API >= 31 Существует только этот тип широковещательного сообщения).

Нерекомендуемые сценарии использования: 1) если App Чтобы запланировать повторяющиеся операции в течение жизненного цикла, вы можете использовать Handler в postAtTime Вместо этого подождите. Напротив, если вы хотите установить 30min позже или завтра днем 2 Рекомендуется использовать точечную операцию; 2) Организуйте некоторые операции в фоновом режиме, например загрузку и обновление приложений, загрузку журналов и т. д. Рекомендуется использовать WorkManager Вместо точного будильника; 3) Когда система простаивает и обрабатывает транзакции в приблизительный момент времени, могут вызываться некоторые неточные функции будильника. API обработка, например, с использованием setAndAllowWhileIdle() вместо setExactAndAllowWhileIdle() метод; 4) Транзакции, которые происходят примерно в определенный момент времени, указанный пользователем, или в пределах временного окна;

Процесс адаптации: 1) Позвонить alarmManager.canScheduleExactAlarms() Проверьте, есть ли у вас это разрешение; 2) Если у вас нет разрешения, вам нужно пройти Intent,настраивать Action для ACTION_REQUEST_SCHEDULE_EXACT_ALARM И добавьте имя пакета приложения, чтобы вызвать страницу настроек, позволить пользователю предоставить разрешения и вернуться к onResume В обратном вызове оценивается, было ли запрошено разрешение.

Вот пример:

Язык кода:javascript
копировать
// code 1
// MyFragment.kt в коде
    private val ALARM_REQUEST_CODE = 123
    private var getExactSchedulePermission = false
    @RequiresApi(Build.VERSION_CODES.S)
    private fun scheduleAlarm() {
        // Создайте Намерение используется для указания операции, которая будет выполнена при запуске запланированной задачи.
        val intent = Intent(requireContext(), AlarmReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            requireContext(),
            ALARM_REQUEST_CODE,
            intent,
            PendingIntent.FLAG_IMMUTABLE
        )

        // получать AlarmManager Пример
        val alarmManager = requireActivity().getSystemService(Context.ALARM_SERVICE) as AlarmManager

        // Время срабатывания (здесь используется относительное время)
        val triggerTime = SystemClock.elapsedRealtime() + 5000 // Срабатывает через 5 секунд

        // настройка запланированных задач
        if (alarmManager.canScheduleExactAlarms()) {
            alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent)
        } else {
            // если без Разрешения открывается страница настройки, позволяющая пользователю предоставить Должен App из Прецизионный будильник
            startActivity(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
            getExactSchedulePermission = true
        }
    }

    @RequiresApi(Build.VERSION_CODES.S)
    override fun onResume() {
        super.onResume()
        if (getExactSchedulePermission) {
            scheduleAlarm()
            getExactSchedulePermission = false
        }
    }

// AlarmReceiver.kt
class AlarmReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context, "Alarm triggered!", Toast.LENGTH_SHORT).show()
    }
}

После запуска метода ScheduleAlarm() через 5 секунд появится всплывающее сообщение~

Приложениям календаря или будильника необходимо отправлять напоминания календаря, сигналы пробуждения или напоминания, когда приложение перестает работать. Эти приложения могут запрашивать USE_EXACT_ALARM Общие разрешения. Система предоставит USE_EXACT_ALARM разрешение, приложения с этим разрешением смогут действовать так, как будто у них есть SCHEDULE_EXACT_ALARM Разрешения на установку точных будильников и приложений.

Резюме: не используйте его, если можете. Если точный будильник использовался ранее, вам необходимо добавить логику получения разрешений.

2. Динамическая трансляция будет поставлена ​​в очередь и сохранена, когда приложение перейдет в состояние кэша.

существовать Android14 , мы используем Context Регистрация контекста из приемника динамического вещания, может существовать App При входе в состояние кэша отправленные, но не полученные широковещательные сообщения помещаются в очередь на хранение. когда App Выйти из состояния кэша(Например, войдите в стойку регистрации.),Тогда система пропустит все поставленные в очередьизтранслировать。некоторыйтранслироватьизнесколько Пример Можеткслитьдляодинтранслировать。

исуществовать Manifest статические приемники вещания, зарегистрированные в файле, не могут быть поставлены в очередь, они будут существовать App Когда он выводится из состояния кэша и уничтожается, осуществляется широковещательная доставка.

«Что такое кэшированное состояние? Приложение? Простое понимание - дасуществовать За кулисамииз App,На данный момент нет обработки на стойке регистрации.,поэтому,если память необходима в другом месте системы,Система имеет право прекратить эти услуги по мере необходимости. Разумеется, приказ о прекращении действия является самым старым неиспользованным приказом и первым, который прекращается.

3. Приложение может завершить только свой фоновый процесс.

от Android14 начни, позвони killBackgroundProcesses() , вы можете завершить только фоновый процесс своего приложения. Если передается имя пакета другого приложения, этот метод не влияет на фоновый процесс этого приложения и Logcat Отображается следующее сообщение:

Язык кода:javascript
копировать
Invalid packageName: com.example.anotherapp

Официальное объяснение следующее:

«Ваше приложение не должно использовать killBackgroundProcesses() API, а также вы не имеете права иным образом пытаться повлиять на жизненный цикл других приложений, даже в старых операционных системах. Андроид цельсуществовать Разрешить применение кешасуществовать За кулисамибегать,И существование автоматически прекращает их, когда системе требуется память. если ваше приложение без необходимости завершает работу других приложений,Так как эти приложения позже потребуется полностью перезапустить,поэтому Можетможет снизить производительность системы и увеличить энергопотребление,Это потребляет гораздо больше ресурсов, чем восстановление существующего кэша приложения.

Должен API да ActivityManager Предоставлено полное объявление метода:

Язык кода:javascript
копировать
// code 2
public void killBackgroundProcesses (String packageName)

Кроме того, для его использования требуется существование Manifest Подать заявку на разрешение в файле Manifest.permission.KILL_BACKGROUND_PROCESSES.

После тестирования я нашел это API Немного странно: убит из За Кулисамипроцесс скоро возобновится, ага. . . Что это за операция? ?

Тестовый код относительно прост: просто откройте один в дасуществовать, а другой процесс. Service,а потом позвони killBackgroundProcesses метод, согласно напечатанному Service Жизненный цикл можно увидеть, Должен Service Сначала меня убили, а потом снова ушел onCreateonStartCommand Жизненный цикл, код и результаты следующие:

Язык кода:javascript
копировать
// code 3
// Manifest Декларация документа Service существует еще один процесс, который нужно начать в
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<service
    android:name=".MyService"
    android:process="com.secondProcess" />

// запускать Service
startService(Intent(requireContext(), MyService::class.java))
// убить За кулисамипроцесс
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
activityManager.killBackgroundProcesses(context.packageName)

результаты печати журнала:

это видно по картинке,существовать Android14 На устройстве вызовите killBackgroundProcesses способы убить себя App из За кулисамипроцесс,Но выстоит Прямо сейчассновазапускать。существовать Следующее также можно найти в исходном кодеизкод,Хотя устарело:

Язык кода:javascript
копировать
// code 3
    @Deprecated
    public void restartPackage(String packageName) {
        killBackgroundProcesses(packageName);
    }

Кажется, это API Просто используйте да, чтобы перезапустить App фоновый процесс?

Попробуйтесуществовать Android14 на устройстве A App Позвони этому API убить B App из За кулисамипроцесс, это действительно не имеет никакого эффекта, но еслидасуществовать; Android14 Вызывается на следующих устройствах, действительно может убить B App фоновый процесс. Заинтересованные студенты также могут попробовать.

краткое содержание:killBackgroundProcesses API Это бесполезно~ (советы начальства приветствуются)

4. Аспекты безопасности

существовать Android14 На системный телефон он не установится targetSdkVersion < 23 (ниже, чем Android6.0) App。

Название медиакитасуществовать Android14 может быть скрыто. В настоящее время медиатека поддерживает OWNER_PACKAGE_NAME Столбец запрашивает все медиа-файлы под определенным именем пакета. Приложение сохраняет медиа-файлы со своей собственной информацией об имени пакета. Эта информация будет существовать Скрыто на Android 14, если не выполнено одно из следующих условий: 1) Имя пакета приложения, в котором хранятся медиафайлы, всегда видно другим приложениям (само оно открыто для всех остальных приложений). App); 2) Приложение, запрашивающее медиатеку, получило QUERY_ALL_PACKAGES Разрешения (другие App Обратиться к пользователю и получить разрешение).

Дайте Кастан: Когда приложение сохраняет медиафайл (например, фотографию или видео),Он запишет файл Должен из информации о существовании в медиатеке.,включать Должендокументиз Имя пакета владельца。Другие приложения Можетк Запрос медиа-библиотекикполучатьэта информация,Ксуществовать самостоятельно из приложения, отображающего Должен файлы или для взаимодействия с ними.

существуют Android14 и более поздние версии,если сохраненные медиафайлы из приложения или имени пакета не всегда видны другим приложениям из,Затем существуют при запросе к медиатеке,Имя пакета владельца будет скрыто или заменено значением для анонимного. Например,Если имя пакета приложения для «com.example.app»,он хранит медиа-файл,Но оно из имени пакета скрыто,Затем, когда существуют запросы к медиатеке,Имя пакета владельца можно заменить на «com.android.providers.media».

Да,если в магазине медиафайлов из приложений есть имена пакетов, которые всегда видны другим приложениям из,или ВОЗЗапрос медиа-библиотекииз Приложение имеетQUERY_ALL_PACKAGES Разрешения,Вы можете увидеть полное имя пакета владельца медиа-библиотеки. Например,Имя приложения для «com.example.app»,он хранит медиа-файл,И имя пакета всегда видно другим приложениям.,Затем, когда существуют запросы к медиатеке,В имени пакета владельца будет указано «com.example.app».

5. Пользовательский опыт

5.1 Доступ к фотографиям и видео можно разрешить индивидуально.

если твой App к Android13 или более высокая версия для целевой платформы (т. е. targetSdkVersion >= 33),исуществовать Android14 При запуске на устройстве пользователи могут предоставить доступ к своим фото и видео разделу Разрешения, т.е. индивидуально настраивать. READ_MEDIA_IMAGES или READ_MEDIA_VIDEO

то есть применить READ_MEDIA_IMAGES Если разрешение предоставлено, пользователю будут доступны только все изображения на телефоне; READ_MEDIA_VIDEO Разрешения, будет отображаться только сотовый Все видео на телефоне доступны пользователям на выбор. Пользователи могут более подробно выбрать, на какие фотографии и видео лицензировать. App Прочитайте, используя.

Новое системное диалоговое окно выглядит следующим образом:

1) Выберите фото и видео: Android14. в Новые возможности. Пользователь выбирает конкретные фотографии и видео, которые он или она желает предоставить приложению. 2) Разрешить все: пользователь предоставляет разрешение всем. ВСЕ ФОТО и ВИДЕО устройства из разрешения ПОЛНОГО ДОСТУПА. 3) Не разрешено: пользователю запрещены все права доступа.

Уведомление: 1) Когда приложение существует в системе Photo Picker, вам не нужно ничего делать, чтобы поддержать это изменение; 2)READ_MEDIA_IMAGES и READ_MEDIA_VIDEO толькосуществовать Android13 Можно использовать только версию илик;

Добавлен новый READ_MEDIA_VISUAL_USER_SELECTED разрешения, принадлежащие Dangerous уровень. Используется, когда пользователи нажимают на кнопку выбора фотографий и им необходимо подать заявку на доступ к фотографиям и видео и з Разрешения, поэтому нет необходимости подавать заявку. READ_MEDIA_IMAGES и READ_MEDIA_VIDEO Эти два разрешения.

Резюме: разработчикам не нужно об этом беспокоиться.,Новое из Разрешения очень безвкусно,Недоступно на данный момент,Раньше не нужно менять логику, связанную с чтением фотографий и видео.

5.2 Более безопасное полноэкранное отображение уведомлений

существовать Android11(API level 30) Вызвать его можно нажав на Notification.Builder.setFullScreenIntent Метод существует. Показывать некоторые полноэкранные уведомления на экране блокировки, но существуют. Manifest Применить в файле USE_FULL_SCREEN_INTENT разрешения.

Полноэкранные уведомления предназначены для немедленного привлечения внимания пользователей к уведомлениям с высоким приоритетом.,Например, входящие вызовы или пользовательская конфигурация будильника.,существуют при показе полноэкранных уведомлений,Пользователи могут провести пальцем только вверх, чтобы выйти,Как показано на рисунке ниже, система предложит.

Рис. 3. Руководство по выходу из полноэкранного уведомления

от Android14 Начнем с того, что разрешенное использование этого приложения «Разрешенияиз» ограничено теми приложениями, которые обеспечивают только звонки и оповещения. Для других приложений Google Play Магазины отзовут свои дефолтные условия USE_FULL_SCREEN_INTENT разрешения.

Можно использовать новый из API NotificationManager.canUseFullScreenIntent() Проверьте, есть ли в приложении Разрешения, если нет, то можете использовать новое; ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT Приходитьзапускатьпользователь Можетк Грант Должен Разрешенияизнастраиватьстраница。

Странно издаясуществовать Официальное уведомление Android14 не включилось успешно на виртуальной машине,Не говоря уже о Включите полноэкранные уведомления Понятно。Но это правда Можетк Открытьнастраивать Полноэкранное уведомление Разрешениявыключательизстраница,Следующее полноэкранное уведомление. Разрешение изменения изображения и основные сопутствующие коды:

Рис. 4. Открытие страницы настройки разрешения полноэкранных уведомлений.

Язык кода:javascript
копировать
// code 4
val notificationBuilder = NotificationCompat.Builder(requireContext())
    .setSmallIcon(R.drawable.ic_lock_idle_alarm)
    .setContentTitle("Notification Title")
    .setContentText("Notification text")
// СоздайтеPendingIntent,Открыть указанную страницу при нажатии Уведомление
val намерение = намерение (контекст, NotificationFullActivity::class.java)
val fullScreenIntent =
    PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_MUTABLE)
 notificationBuilder.setFullScreenIntent(fullScreenIntent, true)  // Включите полноэкранные уведомления
//            notificationBuilder.setContentIntent(fullScreenIntent)  // Открыть обычную страницу

val notificationManager =
    requireContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// Android 8.0 на Oreok требуется канал уведомлений о настройках
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val channelId = "your_channel_id"
    val channelName: CharSequence = "Your Channel Name"
    val importance = NotificationManager.IMPORTANCE_HIGH
    val channel = NotificationChannel(channelId, channelName, importance)
    channel.description = "Channel description"
    notificationManager.createNotificationChannel(channel)
    notificationBuilder.setChannelId(channelId)
}
notificationManager.notify(5, notificationBuilder.build())
if (notificationManager.canUseFullScreenIntent()) {
    notificationManager.notify(5,уведомлениеBuilder.build())
} еще {
    // Настройки настройки Страница
    val намерение = Намерение (Settings.ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT)
    Intent.data = Uri.fromParts("пакет", requireActivity().packageName, null)
    startActivity(intent)
}

если Какой босссуществовать Android14 Полноэкранные уведомления были успешно включены на устройстве, поделитесь со мной, спасибо.

Резюме: Большинство приложений не использует эту функцию полноэкранных уведомлений, и лично я считаю, что это не очень важно. . .

5.3 Изменения в пользовательском интерфейсе для уведомлений, которые нельзя отключить

если приложение отображает пользователю внешнее уведомление, которое невозможно закрыть и требует Уведомление: Android14 Разрешить пользователям отключать такие уведомления. то есть прошло раньше Notification.Builder#setOngoing(true) или NotificationCompat.Builder#setOngoing(true) настраивать Notification.FLAG_ONGOING_EVENT Приходить阻止пользовательзакрытие前台通知из Будьте осторожны при подаче заявления Понятно。FLAG_ONGOING_EVENT из ХОРОШОдля изменился пользователем Android14 Вы можете отключить такие уведомления на к.

кпри обстоятельствах,Таких уведомлений до сих пор нет Можетзакрытие: 1) Когда телефон заблокирован; 2) Если пользователь решает отменить все действия с уведомлениями (помогает предотвратить случайное закрытие);

Кроме того, не изменились следующие условия: 1) Используйте CallStyle Созданное уведомление соответствует стилю уведомления о входящем вызове; 2)Контроллер политики устройств(DPC)и Для предприятийиз Пакет поддержки;

Резюме: Android Управление уведомлениями будет становиться все более строгим, и об этом давно следовало позаботиться. В действительности, даже если Android14 сотовый На телефоне такой функции нет, и большинство из них на данный момент есть. производители телефонов были запрещены App Всплывает уведомление, так что ничего. . .

Выше приведено все содержание данной статьи, в основном основанное на Официальной документация Я практиковал это некоторое время и вижу, что существующийиз App еслипрямойустановить в Android14 изсотовый На телефоне проблем не так уж и много. Многие вещи не требуют отдельного рассмотрения. Конечно, рекомендуется проверить наличие упущений и восполнить пробелы по содержанию данной статьи. если тоже хочешь знать targetSdkVersion обновить до 34 (Android14) На что еще стоит обратить внимание? Добро пожаловать, увидимся в следующей статье!

Розы, которые восхваляют людей, оставляют в их руках стойкий аромат! Добро пожаловать, ставьте лайки и делайте репосты~ При репосте указывайте источник~

Ссылки

  1. Официальная документация Android 14 https://developer.android.com/about/versions/14.
  2. https://developer.android.google.cn/about/versions/14/behavior-changes-all?hl=zh-cn
  3. https://developer.android.google.cn/about/versions/14/changes/schedule-exact-alarms?hl=zh-cn
  4. https://developer.android.google.cn/guide/components/activities/process-lifecycle?hl=zh-cn
  5. https://developer.android.google.cn/about/versions/14/behavior-changes-14
  6. Android 14 точек быстрой адаптации Ляньмао де Сяого https://juejin.cn/post/7231835495557890106?searchId=202307240025039D8229C74EA62159077B;
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose