- Как пользоваться apt
- Синтаксис и опции apt
- Как пользоваться apt
- 1. Обновление пакетов
- 2. Установка пакетов
- 3. Удаление пакетов
- Выводы
- Русские Блоги
- Как использовать Android APT
- 1. Реализовать легкий «ButterKnife»
- 1.1, установить модуль
- 1.2, написать правила генерации кода
- 1.3 Аннотация связывающего эффекта
- Во-вторых, персистентность объекта + сериализация + десериализация
- 2.1, определить цель
- 2.3, реализовать интерфейс работы
- 2.4, написать правила генерации кода
- 2.5, реальный опыт
- Сбор информации Нажмите на ссылку, чтобы присоединиться к групповому чату, чтобы получить расширенную информацию об Android [обмен технологиями Android] 940780115:https://jq.qq.com/?_wv=1027&k=58dqn5n
Как пользоваться apt
Пакетный менеджер Apt или Advanced Package Tool используется во множестве дистрибутивов, основанных на Debian или Ubuntu, а таких дистрибутивов сейчас очень много. Этот пакетный менеджер поддерживает все необходимые функции, вы можете устанавливать и удалять пакеты, обновлять то, что было уже установлено, искать пакеты, устанавливать их из файла или загружать без установки. При этом все зависимости будут разрешаться автоматически.
Утилита apt ничем не уступает пакетному менеджеру yum, используемому в RPM дистрибутивах, да, здесь все ещё не поддерживается частичное обновление пакетов, как в Zypper, но в целом всё выглядит очень неплохо. В этой статье мы подробно рассмотрим как пользоваться apt в Linux для решения задач работы с программами.
Синтаксис и опции apt
Синтаксис команды apt очень простой и похож на другие команды Linux:
$ apt опции команда параметры_команды
Опции указывают общее поведение утилиты, команда — действие, которое надо выполнить, а в параметрах команды обычно передается имя пакета, с которым следует работать, например, установить или удалить. Вот основные опции утилиты:
- -v, —version — выводит версию утилиты;
- -h, —help — выводит справку по использованию утилиты;
- -y, —yes — автоматически отвечать «да» на все возникающие вопросы;
- —assume-no — автоматически отвечать «нет» на все возникающие вопросы;
- -d, —download-only — только скачать пакеты и больше ничего не делать;
- -f, —fix-broken — исправить недостающие зависимости;
- —no-download — ничего не загружать, использовать только пакеты из кэша;
- -s, —simulate — режим симуляции, никакие операции не выполняются, только выводится информация на экран;
- —allow-unauthenticated — позволяет установить пакеты, из репозиториев, для которых нет GPG подписи;
- —no-install-recommends — не устанавливать рекомендованные пакеты, по умолчанию будут установлены;
- -m, —ignore-missing — игнорировать пакеты, которые существует;
- -q, —quiet — выводить минимум информации, не показывать прогресс бар;
- -V, —verbose-versions — показывать полные версии обновленных пакетов;
- —only-upgrade — не устанавливать новые пакеты, только обновлять;
- —allow-downgrades — разрешить откатывать версию пакетов;
- —reinstall — переустановить пакет если он уже установлен;
А теперь давайте пройдёмся по командам apt, которые вы можете использовать:
- install — установить пакет;
- remove — удалить пакет, конфигурационные файлы, которые были изменены в вашей системе удалены не будут;
- purge — полностью удалить пакет, вместе со всеми его конфигурационными файлами;
- autoremove — очистить ненужные пакеты;
- autoclean — очистить кэш пакетов;
- update — обновить списки пакетов из репозиториев;
- upgrade — обновить версию пакета до последней, если пакет не указан будут обновлены все пакеты;
- full-upgrade — полное обновление системы, включая удаление несовместимых или больше ненужных пакетов;
- list — список установленных пакетов;
- search — поиск пакетов;
- show — посмотреть информацию о пакете;
- download — скачать пакет в текущую папку;
- edit-sources — открыть с настройками репозиториев в текстовом редакторе.
- source — скачать исходный код пакета в текущую папку;
- build-dep — установить зависимости необходимые для сборки выбранного пакета;
Дальше рассмотрим несколько примеров работы с apt, которые пригодятся как начинающим, так и более опытным пользователям.
Как пользоваться apt
1. Обновление пакетов
Сначала давайте обновим список пакетов apt из репозиториев. Репозитории находятся на удалённых серверах и когда утилита apt ищет пакет для установки, естественно, что она не обращается ко всем репозиториям подряд чтобы узнать где он находится. В системе уже есть сохранённых кэш информации о том, какие пакеты вообще есть и где их можно скачать. Для обновления этого кэша используйте команду update:
sudo apt update
Во время загрузки URL репозиториев обозначаются специальными префиксами, вот что они означают:
- Hit (Сущ) — список не изменился с момента предыдущей загрузки;
- Ign (Игн) — репозиторий игнорируется, либо он слишком новый, либо произошла незначительная ошибка во время загрузки;
- Get(Пол) — доступна новая версия и она будет загружена.
Когда кэш обновлен вы можете посмотреть для каких пакетов доступны обновления:
sudo apt list —upgradable
Аналогично можно посмотреть установленные пакеты apt:
sudo apt list —installed
Или всех доступных:
sudo apt list —all-versions
Затем можно обновить все пакеты в системе:
sudo apt full-upgrade
2. Установка пакетов
Чтобы установить пакет apt используйте команду install, например, для установки программы Gimp используйте команду install:
sudo apt install gimp
Если пакет установился неверно и вы хотите его переустановить, можно использовать опцию —reinstall:
sudo apt install gimp —reinstall
Как видите, опции можно указывать не только перед командой, но и после неё, аналогично можно установить несколько пакетов сразу, например:
sudo apt install gimp inkskape -y
Чтобы не подтверждать установку вручную используем опцию -y. Допустим вы установили пакет с помощью dpkg и теперь хотите установить для него зависимости, запустите команду install без параметров с опцией -f или —fix-broken:
sudo apt install —fix-broken
Можно скачать deb пакет в текущую папку без установки:
apt download gimp
Скачивать пакеты надо от имени обычного пользователя, иначе тогда они не будут доступны для работы с ними. Если вам нужно установить пакет из файла, просто передайте путь к файлу команде install:
sudo apt install gimp_2.8.22-1_amd64.deb
Чтобы установить определенную версию пакета просто укажите нужную версию после имени пакета через знак =, например:
sudo apt install linux-headers-generic=4.15.0.20.23
Чтобы найти доступные версии можно использовать команду policy. Она отображает информацию о том какая версия установлена, а также какие версии доступны:
sudo apt policy linux-headers-generic
Если вы не знаете как точно называется пакет, можно выполнить поиск пакетов apt с помощью команды search:
sudo apt search gimp
3. Удаление пакетов
Чтобы удалить ненужный пакет используйте команду remove:
sudo apt remove gimp
Однако если вы изменяли какие-либо конфигурационные файлы из состава пакета, то при таком способе удаления они останутся в системе, чтобы удалить всё полностью используйте команду purge:
sudo apt purge gimp
Чтобы удалить лишние пакеты, которые в системе больше не нужны выполните команду autoremove:
sudo apt autoremove
А для очистки кэша пакетов — autoclean:
sudo apt autoclean
Выводы
В этой статье мы рассмотрели примеры использования и основные команды apt Ubuntu, как видите, команд у этой утилиты хватает на все случаи жизни. Но, как видите, всё очень просто если разобраться. Я не рассказал только об одной команде, попробуйте ввести в терминале apt moo, увидите что будет. Это небольшая пасхалка от разработчиков.
Источник
Русские Блоги
Как использовать Android APT
APT (инструмент обработки аннотаций) — это процессор аннотаций, который является инструментом обработки аннотаций, который используется для сканирования и обработки аннотаций во время компиляции и генерации их с помощью аннотаций
Java-файл. То есть, используя аннотации в качестве моста, файлы Java автоматически генерируются по заранее заданным правилам генерации кода. Представители таких рамок аннотаций
ButterKnife, Dragger2, EventBus и другие API Java предоставили платформу для сканирования исходного кода и анализа аннотаций, разработчики могут наследовать
Класс AbstractProcessor для реализации собственной логики анализа аннотаций. APT
Принцип заключается в том, что после аннотирования определенных элементов кода (таких как поля, функции, классы и т. Д.) Компилятор проверяет подкласс AbstractProcessor во время компиляции и автоматически вызывает его
process (), а затем передают все элементы кода с указанными аннотациями в качестве параметров методу, а затем разработчик выводит соответствующий код Java во время компиляции в соответствии с элементами аннотации
1. Реализовать легкий «ButterKnife»
Здесь мы берем ButterKnife в качестве цели. Объясняя содержание Android APT, мы постепенно внедряем облегченную инфраструктуру привязки элементов управления, то есть автоматически генерируем следующий код findViewById () с помощью аннотаций.
Метод контрольного связывания заключается в следующем
1.1, установить модуль
Сначала создайте в проекте новую библиотеку Java с именем apt_processor, используемую для хранения класса реализации AbstractProcessor. Создайте новую библиотеку Java и назовите ее apt_annotation для хранения различных аннотаций
Среди них apt_processor необходимо импортировать следующие зависимости
Среди них JavaPoet — это инфраструктура генерации Java-кода с открытым исходным кодом, которая может легко генерировать код в указанном формате (модификатор, возвращаемое значение, параметр, тело функции и т. Д.) С помощью предоставляемого им API. автосервис — это процессор регистрации аннотаций, открытый от Google
Фактически вышеупомянутые две зависимые библиотеки не являются необходимыми и могут быть заменены жестко закодированными правилами генерации кода, но все же рекомендуется использовать эти две библиотеки, поскольку код будет читабельным Выше и может улучшить эффективность разработки
Модуль приложения должен зависеть от этих двух библиотек Java
Таким образом, все основные зависимости, которые нам нужны, созданы
1.2, написать правила генерации кода
Сначала ознакомьтесь с автоматически сгенерированным кодом, вы можете суммировать несколько моментов, которые необходимо реализовать:
1. Файл и исходная активность находятся под одним и тем же именем пакета
2. Имя класса состоит из имени действия + ViewBinding
3. Метод bind () создает свой объявленный объект управления, передавая объект Activity, который также требуется ButterKnife для привязки переменных управления, которые не могут быть объявлены как частные причина
Создайте класс BindViewProcessor в модуле apt_processor и унаследуйте абстрактный класс AbstractProcessor, который содержит абстрактный метод process () и неабстрактный метод getSupportedAnnotationTypes (), который нам нужно реализовать
Метод getSupportedAnnotationTypes () используется для указания целевого объекта аннотации AbstractProcessor, а метод process () — для обработки элементов кода, содержащих указанный объект аннотации.
Ниже показано объявление аннотации BindView, которое помещается в apt_annotation, а значение значения аннотации используется для объявления viewId.
Чтобы автоматически сгенерировать метод findViewById (), вам нужно получить ссылку на управляющую переменную и соответствующий viewid, поэтому вам нужно сначала просмотреть все объекты аннотаций, содержащиеся в каждом действии.
@Override
public boolean process(Set set, RoundEnvironment roundEnvironment) <
// Получить все элементы с аннотацией BindView
Set elementSet = roundEnvironment.getElementsAnnotatedWith(BindView.class);
Map > typeElementMapHashMap = new HashMap<>();
for (Element element : elementSet) <
// Поскольку объект BindView является FIELD, элемент может быть непосредственно преобразован в VariableElement
VariableElement variableElement = (VariableElement) element;
// Метод getEnclosingElement возвращает самый внутренний элемент, который инкапсулирует этот элемент
// Если элемент непосредственно инкапсулирован в объявлении другого элемента, возвращается инкапсулированный элемент
// Здесь представлен объект активности
TypeElement typeElement = (TypeElement) variableElement.getEnclosingElement();
Map variableElementMap = typeElementMapHashMap.get(typeElement);
if (variableElementMap == null) <
variableElementMap = new HashMap<>();
typeElementMapHashMap.put(typeElement, variableElementMap);
>
// Получить значение аннотации, а именно ViewId
BindView bindAnnotation = variableElement.getAnnotation(BindView.class);
int viewId = bindAnnotation.value();
// Сохраняем каждый объект поля, содержащий аннотацию BindView и ее значение аннотации
variableElementMap.put(viewId, variableElement);
>
…
return true;
>
Среди них Element используется для представления элемента программы, этим элементом могут быть: пакет, класс, интерфейс, переменная, метод и другие понятия. Здесь в качестве ключа используется объект Activity, а все объекты аннотаций в рамках различных действий хранятся на карте.
После получения всех объектов аннотаций вы можете создать метод bind ()
MethodSpec — это концепция, предоставляемая JavaPoet. Она используется для абстрагирования основных элементов, необходимых для генерации функции. Если смотреть непосредственно на следующий метод, то должно быть легко понять его значение.
Заполните обязательные элементы параметра с помощью метода addCode () и выполните цикл для генерации каждой строки метода findView.
Полная декларация кода показана ниже
1.3 Аннотация связывающего эффекта
Сначала объявите две аннотации BindView в MainActivity, затем перестройте проект, чтобы компилятор генерировал нужный нам код в соответствии с BindViewProcessor
После того, как перестроение закончено, вы можете видеть, что класс MainActivityViewBinding автоматически генерируется в папке generateJava
В настоящее время существует два способа вызова метода bind ().
Непосредственный вызов метода bind () метода MainActivityViewBinding в методе MainActivity
Поскольку путь имени пакета MainActivityViewBinding и Activity одинаков, вы также можете вызвать метод bind () MainActivityViewBinding посредством отражения
Оба метода имеют свои преимущества и недостатки. Первый способ — генерировать код после каждого проекта сборки, а до этого нельзя ссылаться на соответствующий класс ViewBinding. Второй способ может использовать фиксированный вызов метода, но по сравнению со способом
Отражение будет потреблять немного больше производительности
Но результаты этих двух методов абсолютно одинаковы
Во-вторых, персистентность объекта + сериализация + десериализация
Благодаря содержанию первого раздела, читатели должны понимать мощные функции APT. В этом разделе мы реализуем фреймворк, который может облегчить постоянство + сериализацию + десериализацию объектов.
2.1, определить цель
Как правило, наше приложение имеет много элементов конфигурации, которые необходимо кэшировать, например, информацию о пользователе, переключатели элементов настройки, IP-адрес сервера и т. Д. Если вы используете для реализации собственные SharedPreferences, легко написать следующий уродливый код, не только нужно поддерживать значение ключа нескольких элементов данных, но также каждый раз, когда вы сохраняете и извлекаете данные, будет большой фрагмент повторяющегося кода, который нелегко поддерживать
SharedPreferences sharedPreferences = getSharedPreferences(“SharedPreferencesName”, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(“IP”, “192.168.0.1”);
editor.commit();
String userName = sharedPreferences.getString(“userName”, “”);
String ip = sharedPreferences.getString(“IP”, “”);
Следовательно, здесь необходимо создать среду, которая может удобно сохранять + сериализовать + десериализовать данные через APT. Конкретные цели заключаются в следующем:
1. Вы можете сериализовать Object и предоставить метод для десериализации в Object.
2. Сериализованный результат Object можно сохранить в локальном
3. Уникальное значение ключа, необходимое для сохранения данных, автоматически поддерживается внутри структуры
4. Конкретные процессы сериализации, десериализации и персистентности реализованы вне фреймворка, а фреймворк отвечает только за построение логики операций.
Цель 1 может быть достигнута с помощью Gson, цель 2 может быть достигнута с использованием среды MMKV с открытым исходным кодом Tencent, и необходимо импортировать следующие две зависимости
implementation ‘com.google.code.gson:gson:2.8.5’
implementation ‘com.tencent:mmkv:1.0.16’
2.2, предварительный просмотр эффекта
Здесь сначала рассмотрим, как использовать фреймворк. Новая аннотация называется Preferences, при условии, что в классе User есть три значения поля, которые необходимо кэшировать локально, поэтому все они добавляются с аннотациями Preferences
И мы должны автоматически сгенерировать подкласс UserPreferences для класса User через APT, а последующие операции кэширования данных будут выполнены через UserPreferences.
кэширует весь объект
User user = new User();
UserPreferences.get().setUser(user);
Кэшировать одно значение атрибута
Получить кешированные объекты
User user = UserPreferences.get().getUser();
Удалить кэшированные объекты
Как видите, вся операция очень лаконична, а потом начинайте работать
2.3, реализовать интерфейс работы
Для достижения цели 4 необходимо сначала определить интерфейс операции и передать конкретную реализацию извне
Вышеупомянутые три операции должны быть уникальными в рамках, поэтому они могут поддерживаться глобально через одноэлементный режим. Код, сгенерированный APT, использует эту запись для вызова метода постоянства + сериализации + десериализации
Перейдите в конкретную реализацию в методе Application onCreate ()
2.4, написать правила генерации кода
То же самое нужно для наследования класса AbstractProcessor, подкласс называется PreferencesProcessor
Во-первых, класс PreferencesProcessor должен сгенерировать метод для сериализации всего объекта. Например, вам нужно создать подкласс UserPreferences для класса User, а UserPreferences содержит метод setUser (экземпляр пользователя)
Соответствующие правила генерации метода следующие. Видно, что общие правила аналогичны первому разделу, и весь код должен быть сшит вместе через строку. Среди них, T является символом замены, функция похожа на MessageFormat
Кроме того, необходим метод десериализации локально кэшированных данных.
Соответствующие правила генерации метода следующие
Для достижения третьей цели (уникальное значение ключа, необходимое для сохранения данных, автоматически поддерживается платформой), значение ключа, используемое во время сохранения, определяется текущим именем пакета + имя класса, тем самым обеспечивая уникальность значения ключа.
Например, значение ключа, используемое данными кэша класса UserPreferences,
Соответствующие правила генерации метода следующие
Другие соответствующие правила генерации методов get и set не будут описаны подробно, студенты, которые интересуются исследованиями, могут загрузить исходный код для чтения
2.5, реальный опыт
Изменить макет MainActivity
Сбор информации Нажмите на ссылку, чтобы присоединиться к групповому чату, чтобы получить расширенную информацию об Android [обмен технологиями Android] 940780115:https://jq.qq.com/?_wv=1027&k=58dqn5n
Источник