APK файл для Android — что это такое и как его открыть?

Что такое APK

Для загрузки игр и приложений на Андроид стоит понимать, что это — расширение APK. Android Package Kit — файловый формат, используемый для установки программного обеспечения на Android и включающий в себя его архивированные компоненты. Одного такого файла достаточно для инсталляции работоспособного приложения. АПК поддерживается не только платформой Android. С помощью специальных утилит открывать их можно на Windows, Linux или Mac.

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

Открытие файлов Office

Трудно найти пользователя, который никогда не сталкивался с файлами, созданными в программах Word и Excel.

Для работы с ними на Андроид можно использовать приложения от компании Microsoft, выпустившей аналог своего MS Office для популярной смартфонной платформы.

Функциональность пакета практически не уступает настоящим Ворду и Экселю, но для получения полноценных версий придётся подписаться на платный пакет Office 365 (от $100 в год).

На смартфонах с операционной системой Windows Phone мобильный MS Office предоставляется бесплатно.

Рис.8. Word ля Android

Возможность открывать и файлы с расширением .doc, .docx, .xls, .xlsx, .ppt и .pptx есть и в программах QuickOffice Connect, Smart Office и Kingsoft Office.

Приложение OfficeSuite, кроме того, поддерживает ещё и работу с документами Open Office.

Рис.9. Создание диаграмм в Smart Office

Немного теории

  • Apk – это формат установочного пакета для операционной системы Android. Представляет собой один файл, в названии которого после точки написано apk.
  • Сам по себе файл является архивом, в котором лежит вся необходимая информация – это изображения, программный код и составляющие программы, как ей вести себя на таком-то таком-то устройстве и так далее.
  • Открыть файл можно с помощью обычного архиватора, а ещё лучше из тотал командера. Это для тех, кому особенно интересно посмотреть, что же находится внутри.
  • Файлы нужны для того, чтобы самостоятельно устанавливать сторонние приложения, которых или нет на маркете, или лень их там искать. Как устанавливать, смотрим и читаем ниже.

Какие файлы открывает Андроид

Без смарт-гаджета больше не обходится ни одно дело, будь то учёба, работа или другое. Андроид умеет открывать множество стандартных файлов: mp3, mp4, avi. Конечно, для того чтобы открыть файл на Андроид требуется специальное приложение. Таким образом можно открыть почти любой файл на Андроид, если установить подходящую утилиту.

Давайте разберём, какие файлы можно открывать на Андроид:

  • txt
  • doc
  • xls
  • zip
  • apk
  • pdf
  • html

Открыть avi, mp3, mp4 можно с помощью программ, которые мы описывали в наших статьях:

  • Как смотреть видео на Андроид
  • – некоторые приложения из этой статьи не только загружают аудиофайлы, но и воспроизводит их

Что находится внутри APK файла?

Файлы в формате APK имеют четко определенную структуру.

  • META-INF: MANIFEST.MF – файл с данными о других файлах, находящихся в данном архиве (контрольные суммы файлов);
  • CERT.RSA – сертификат, которым подписано приложение;
  • CERT.SF – файл с данными о сертификате и ресурсах;
  • lib – здесь хранятся linux-библиотеки для каждого из поддерживаемых типов процессоров:
      armeabi – для процессоров ARMv6 и более старых;
  • armeabi-v7a – для процессоров ARMv7 и более новых;
  • x86 – для процессоров с архитектурой x86;
  • mips – для MIPS процессоров;
  • res – ресурсы, не содержащиеся в resources.arsc (см. ниже).
  • Assets –ресурсы, которые используются AssetManager.
  • AndroidManifest.xml – файл с описанием приложения. В данном файле хранится имя, название пакета, версия, а также другие данные относящиеся к этому приложению.
  • classes.dex – исполняемый код в формате DEX;
  • resources.arsc – компилированные ресурсы;
  • Посмотреть содержимое APK файла очень просто и это может сделать любой желающий. Все что нужно сделать, это открыть APK файл любым архиватором. Например, вы можете использовать бесплатный архиватор 7Zip.

    Зачем мне нужно устанавливать APK файл?

    Приложения на Android не ограничиваются магазином Google Play Store. Сторонние разработчики выпускают собственные приложения в APK файлах, которые предлагают захватывающие возможности. Кроме того, некоторые приложения в Google Play Store нельзя установить в вашей стране. Однако вы можете скачать APK файл, и установить нужное приложение в обход Google Play Store.

    Если ваше Android устройство не имеет доступа к Google Play Store, APK файлы являются единственным вариантом для установки приложений.

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

    Причины для запуска Андроид приложений на Windows

    Причины, по которым необходимо запускать Андроид приложения на ПК, могут быть следующие:

    • Программное обеспечение может отсутствовать в официальном магазине приложений Play Market. В этом случае нужно искать сторонний ресурс, где потребуется скачать файл формата apk. Как правило, не все программы, скачанные через сторонние источники, могут быть безопасными. В некоторые из них может быть внедрен вредоносный код, который позволит злоумышленникам завладеть персональными данными пользователя.

    Запуск ПО Андроид на персональном компьютере

    • Мобильный телефон не имеет достаточного объема памяти и не поддерживает флэш-карты большого формата. В таком случае рекомендовано устанавливать и запускать Android программы на персональном компьютере.
    • Пользователь ведет онлайн бизнес и хочет упорядочить приложения на своем смартфоне. Важные программы установить на смартфон, а приложения, которыми владелец телефона пользуется не так часто, перенести на ПК.
    • Пользователь является владельцем смартфона iPhone от производителя Apple, и нужного приложения нет в App Store. В этом случае актуально будет скачать программу эмулятор Android и запустить требуемое программное обеспечение через него.

    Интересно! Одна из распространенных причин – когда пользователю нужно создать несколько аккаунтов на разных устройствах.

    Как скачать и установить

    Самое большое хранилище АПК — это Play Market. Его особенность в том, что площадка не позволяет скачать на мобильное устройство сам файл, а сразу выполняет его инсталляцию, поэтому пользователю не приходится задумываться о том, как и чем открыть на Android APK

    Если пользователю необходим контент, которого нет на Google Play — отыскать АПК он сможет в Сети. Важно загружать их только с проверенных сайтов, иначе существует риск скачать вредоносное ПО или заразить технику вирусами.

    Найти в Сети APK и скачать его можно на компьютер, а затем перенести через кабель, Bluetooth или другим способом на телефон или планшет. Ещё одно решение — выполнить загрузку непосредственно в память мобильного устройства через его браузер.

    После скачивания:

    • Открыть настройки смартфона.
    • Перейти во вкладку «Безопасность».

    • Найти строку «Неизвестные источники» и активировать функцию, чтобы разрешить установку ПО из APK.

    • В памяти телефона отыскать загруженный АПК и нажать на него для начала инсталляции.

    • Подтвердить установку.

    Далее останется дождаться окончания операции, а затем приступить к работе с приложением или запустить игру.

    Подготовка ОС Android

    Смартфон автоматически распознает любое приложение, поступившее не из Google Play, как «неизвестное приложение». Поэтому в настройках нужно разрешить установку из неизвестных источников.

    Сделать это достаточно просто. Перейдите в раздел настроек. Выберите «Безопасность» (или «Блокировка экрана и безопасность»). Найдите пункт «Администрирование устройства» и включите установку из неизвестных источников.

    После разрешения установки приложений из неизвестных источников понадобится найти APK-файл в смартфоне. Обычно на Android уже есть стандартный диспетчер файлов. Если же его нет, зайдите в Google Play и поищите приложения по ключевому словау «Диспетчер файлов». Появится много вариантов. Выберите любой из них или просто скачайте самый популярный — Cx File Explorer.

    Совместимость типов файлов

    PDFDOCXXLSXPPTXODTRTFODSTXT
    GOOGLE DRIVEДаДаДаДаДаДаДаДа
    WPS OFFICEДаДаДаДаДаДаДаДа
    MICROSOFT APPSНетДаДаДаНетНетНетНет

    Многие производители смартфонов также предварительно устанавливают WPS Office. Это приложение содержит рекламу, и если вы хотите разблокировать новые шрифты и конвертировать документы / файлы на Android, вам придется потратить деньги. Тем не менее, многие пользователи ценят беспроблемное подключение к Dropbox и хорошие возможности синхронизации между смартфоном / планшетом и ПК.

    SmartOffice – еще одно полезное приложение для тех, кто ищет совершенно бесплатную альтернативу Microsoft Office для Android. Это приложение по-прежнему имеет ряд недочетов (в зависимости от вашего устройства), но оно не содержит рекламы, простое в работе и регулярно обновляется.


    Начните работать с WPS Office.

    Простой способ

    Самый простой способ установить APK на Android – это скачать его с помощью мобильного браузера. Найдите сайт, предлагающий приложение для Android. На нем вы увидите ссылку для скачивания. Может появиться всплывающее окно с вопросом, хотите ли вы разрешить браузеру сохранять файлы в хранилище смартфона. Ответьте согласием. Вы также увидите предупреждение о том, что «этот тип файла может повредить ваше устройство». Просто нажимайте «ОК» и продолжайте.

    Если браузер смартфона не позволяет открыть файл после скачивания, откройте файловый менеджер и найдите папку Downloads. Нажмите на скачанный файл и разрешите приложению выполнить необходимые действия, которые оно запрашивает. Затем в нижней части окна нажмите кнопку «Установить».

    Вы увидите уведомление о том, что приложение установлено. После этого оно должно появиться в списке программ. Если же что-то не получилось, попробуйте воспользоваться другими способами.

    Способ средней сложности

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

    С помощью браузера на компьютер скачайте APK. Затем подключите смартфон к компьютеру и скопируйте на него файл. Если раньше вы никогда не делали этого, нужно будет включить отладку по USB.

    Для этого выберите «Настройки», прокрутите вниз до пункта «Об устройстве» и семь раз нажмите «Номер сборки». Это откроет вам скрытое меню разработчика. Вернитесь в «Настройки», выберите «Параметры разработчика» и нажмите «Отладка по USB». Установите флажок напротив пункта «Отладка по USB».

    Теперь вы можете подключить смартфон к компьютеру при помощи USB-кабеля. Устройство должно определиться так же, как карта памяти или флешка. Переместите файл, скачанный с сайта, на смартфон. Вот что нужно сделать для этого:

    1. Найдите нужный файл на компьютере.
    2. Кликните по нему правой кнопкой мышки и выберите пункт «Копировать».
    3. Найдите на ПК смартфон, который отображается как съемный диск.
    4. Откройте его и найдите папку /sdcard/download.
    5. Скопируйте APK в эту папку.

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

    Если у вас нет USB-кабеля, можно установить WiFi FTP-Server из Google Play, а затем использовать FTP-клиент на компьютере для переноса файла. Но это более сложный вариант, USB-кабель обычно легче найти.

    В Панели управления NVIDIA нет выбора графического процессора — что делать?

    Если нет возможности добавить в контекстное меню запуск с определенным графическим процессором ни в Панели управления Nvidia, ни в настройках дисплея, вполне вероятно, что ваш чипсет GPU не поддерживает технологию Nvidia Optimus. Технология Optimus позволяет графическому процессору Nvidia задействоваться в определенный момент, когда это необходимо. Чтобы проверить, поддерживает ли ваша графическая карта NVIDIA эту технологию, перейдите по этой ссылке. Там представлен список всех графических процессоров, поддерживающих технологию Optimus.

    Кроме того, убедитесь, что у Вас установлен последний драйвер для видеокарты. Старые драйверы и устаревшие версии панели управления Nvidia могут не иметь такой возможности.

    Продвинутый способ

    Если по какой-либо причине установщик APK не запускается, когда вы нажимаете на него на смартфоне, можно прибегнуть к экстренному решению. В данном случае предполагается запуск APK Installer с Minimal ADB и Fastboot. Вы можете установить приложение на Android-устройство с компьютера, используя простой инструмент под названием Minimal ADB и Fastboot.

    Вам необходимо выполнить действия, описанные в предыдущем разделе, чтобы подключить смартфон к ПК. Затем скачайте и установите на компьютер последнюю версию Minimal ADB и Fastboot. Запустите инструмент, и откройте командную строку. После синхронизации смартфона с ПК введите команду:

    adb devices

    Если программа обнаружит смартфон, то вы увидите его идентификатор в списке подключенных устройств.

    Теперь с помощью проводника Windows перейдите в папку Minimal ADB и Fasbtoot (обычно это C:Program Files (x86)Minimal ADB and Fastboot). Вставьте файл APK в эту папку. Можно переименовать файл, присвоив ему короткое название. Так его будет легче вручную вводить в командную строку.

    Вернувшись в то же командное окно, которое вы открывали ранее, введите команду

    Как установить APK с Вашего Android устройства

    Для начала установки можно воспользоваться обычным браузером на смартфоне, при чём любого производителя.

    Инструкция:

    1. Запустить веб-обозреватель и найти файл на тематическом сайте.
    2. Начать загрузку элемента, о чём свидетельствует уведомление в верхней панели устройства.
    3. После завершения скачивания стоит открыть раздел «Загрузки» и коснуться APK-файла.
    4. В момент запуска система попросит разрешение, в котором нужно нажать на кнопку «Да».
    5. Дождаться окончания установки и наслаждаться программой.

    Как установить файлы APK с компьютера?

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

    Руководство:

    1. Изначально нужно найти целевой файл на просторах интернета и загрузить его в удобное место для дальнейшего использования.
    2. Взять в руку смартфон и перейти в «Настройки», а затем «Безопасность». Здесь или в одном из подразделов нужно активировать пункт «Неизвестные источники», если этого не было сделано ранее. Действие позволит устанавливать приложения не из Google Play Store. В последних версиях Android не нужно устанавливать глобальный параметр, разрешающий инсталляцию из сторонних источников. Вместо этого в момент попытки установки появляется уведомление с предложение разрешить действие.

    3. Синхронизировать компьютер со смартфоном на базе Android, и выбрать режим «Мультимедийное устройство» или накопитель. Так ПК сможет работать с файлами на телефоне.
    4. Открыть новый диск с названием гаджета в Windows, а именно – в разделе «Этот компьютер».
    5. Скопировать APK-файл и положить в подходящую папку на Android-устройстве.
    6. На телефоне найти загруженный элемент через «Проводник» или файловый менеджер, коснуться его и выбрать опцию «Установить».

    После определённого времени ожидания, приложение появится в системе. Теперь его можно открыть и проверить правильность работы. Если процедура не принесла ожидаемого результата, стоит повторить её с другим APK-файлом. Скорее всего придётся сменить источник для загрузки.

    Как запустить программу без операционной системы

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

    Итак, цель: затратив как можно меньше усилий, создать собственную загрузочную флешку, которая всего-навсего печатает на экране компьютера классический “Hello World”.

    Если быть более точным, то нам нужно “попасть” в защищенный режим с отключенной страничной адресацией и прерываниями – самый простой режим работы процессора с привычным поведением для простой консольной программы. Самый разумный способ достичь такой цели – собрать ядро поддерживающее формат multiboot и загрузить его с помощью популярного загрузчика Grub. Альтернативой такого решения является написание собственного volume boot record (VBR), который бы загружал написанный собственный загрузчик (loader). Приличный загрузчик, как минимум, должен уметь работать с диском, с файловой системой, и разбирать elf образы. Это означает необходимость написания множества ассемблерного кода, и немало кода на С. Одним словом, проще использовать Grub, который уже умеет делать все необходимое.

    Начнем с того, что для дальнейших действий необходим определенный набор компиляторов и утилит. Проще всего воспользоваться каким-нибудь Linux (например, Ubuntu), поскольку он уже будет содержать все что нужно для создания загрузочной флэшки. Если вы привыкли работать в Windows, то можно настроить виртуальную машину с Linux (при помощи Virtual Box или VMware Workstation).

    Если вы используете Linux Ubuntu, то прежде всего необходимо установить несколько утилит: 1. Grub. Для этого воспользуемся командой:

    sudo apt-get install grub

    2. Qemu. Он нужен, чтобы все быстро протестировать и отладить, для этого аналогично команда:

    sudo apt-get install qemu

    Теперь наш план выглядит так: 1. создать программу на C, печатающую строку на экране. 2. собрать из нее образ (kernel.bin) в формате miniboot, чтобы он был доступен для загрузки с помощью GRUB. 3. создать файл образа загрузочного диска и отформатировать его. 4. установить на этот образ Grub. 5. скопировать на диск созданную программу (kernel.bin). 6. записать образ на физический носитель или запустить его в qemu.

    а процесс загрузки системы:

    Чтобы все получилось, необходимо будет создать несколько файлов и каталогов:

    kernel.c Код программы, написанный на языке С. Программа печатает на экран сообщение.
    makefile Makefile, скрипт, выполняющий всю сборку программы и создание загрузочного образа.
    linker.ld Скрипт компановщика для ядра.
    loader.s Код на ассемблере, который вызывается Grub’ом и передает управление функции main из программы на С.
    include/ Папка с заголовочными файлами.
    grub/ Папка с файлами Grub’а.
    common/ Папка с функциями общего назначения. В том числе реализация printf.

    Шаг 1. Создание кода целевой программы (ядра):

    Создаем файл kernel.c, который будет содержать следующий код, печатающий сообщение на экране:

    #include «printf.h» #include «screen.h» #include «types.h» void main(void) { clear_screen(); printf(«\n>>> Hello World!\n»); }

    Тут все привычно и просто. Добавление функций printf и clear_screen будет рассмотрено дальше. А пока надо дополнить этот код всем необходимым, чтобы он мог загружаться Grub’ом. Для того что бы ядро было в формате multiboot, нужно что бы в первых 8-ми килобайтах образа ядра находилась следующая структура:

    0x1BADB002 = MAGIC Сигнатура формата Multiboot
    0x0 = FLAGS Флаги, которые содержат дополнительные требования к загрузке ядра и параметрам, передаваемым загрузчиком ядру (нашей программе). В данном случае все флаги сброшены.
    0xE4524FFE= -(MAGIC + FLAGS) Контрольная сумма.

    Если все указанные условия выполнены, то Grub через регистры %eax и %ebx передает указатель на структуру multiboot Information и значение 0x1BADB002 соответственно. Структура multiboot Information содержит различную информацию, в том числе список загруженных модулей и их расположение, что может понадобиться для дальнейшей загрузки системы. Для того, чтобы файл с программой содержал необходимые сигнатуры создадим файл loader.s, со следующим содержимым:

    .text .global loader # making entry point visible to linker # setting up the Multiboot header — see GRUB docs for details .set FLAGS, 0x0 # this is the Multiboot ‘flag’ field .set MAGIC, 0x1BADB002 # ‘magic number’ lets bootloader find the header .set CHECKSUM, -(MAGIC + FLAGS) # checksum required .align 4 .long MAGIC .long FLAGS .long CHECKSUM # reserve initial kernel stack space .set STACKSIZE, 0x4000 # that is, 16k. .lcomm stack, STACKSIZE # reserve 16k stack .comm mbd, 4 # we will use this in kmain .comm magic, 4 # we will use this in kmain loader: movl $(stack + STACKSIZE), %esp # set up the stack movl %eax, magic # Multiboot magic number movl %ebx, mbd # Multiboot data structure call main # call C code cli hang: hlt # halt machine should kernel return jmp hang

    Рассмотрим код подробнее. Этот код в почти не измененном виде взят с wiki.osdev.org/Bare_Bones. Так как для компиляции используется gcc, то используется синтаксис GAS. Рассмотрим подробнее, что делает этот код.

    .text Весь последующий код попадет в исполняемую секцию .text. .global loader Объявляем символ loader видимым для линковщика. Это требуется, так как линковщик будет использовать loader как точку входа. .set FLAGS, 0x0 # присвоить FLAGS = 0x0 .set MAGIC, 0x1BADB002 # присвоить MAGIC = 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) # присвоить CHECKSUM = -(MAGIC + FLAGS) .align 4 # выровнять последующие данные по 4 байта .long MAGIC # разместить по текущему адресу значение MAGIC .long FLAGS # разместить по текущему адресу значение FLAGS .long CHECKSUM # разместить по текущему адресу значение CHECKSUM Этот код формирует сигнатуру формата Multiboot. Директива .set устанавливает значение символа в выражение справа от запятой. Директива .align 4 выравнивает последующее содержимое по 4 байта. Директива .long сохраняет значение в четырех последующих байтах. .set STACKSIZE, 0x4000 # присвоить STACKSIZE = 0x4000 .lcomm stack, STACKSIZE # зарезервировать STACKSIZE байт. stack ссылается на диапазон .comm mbd, 4 # зарезервировать 4 байта под переменную mdb в области COMMON .comm magic, 4 # зарезервировать 4 байта под переменную magic в области COMMON В процессе загрузки grub не настраивает стек, и первое что должно сделать ядро это настроить стек, для этого мы резервируем 0x4000(16Кб) байт. Директива .lcomm резервирует в секции .bss количество байт, указанное после запятой. Имя stack будет видимо только в компилируемом файле. Директива .comm делает то же что и .lcomm, но имя символа будет объявлено глобально. Это значит что, написав в коде на Си следующую строчку, мы сможем его использовать. extern int magic

    И теперь последняя часть:

    loader: movl $(stack + STACKSIZE), %esp # инициализировать стек movl %eax, magic # записать %eax по адресу magic movl %ebx, mbd # записать %ebx по адресу mbd call main # вызвать функцию main cli # отключить прерывания от оборудования hang: hlt # остановить процессор пока не возникнет прерывание jmp hang # прыгнуть на метку hang

    Первой инструкцией происходит сохранение значения верхушки стека в регистре %esp. Так как стек растет вниз, то в %esp записывается адрес конца диапазона отведенного под стек. Две последующие инструкции сохраняют в ранее зарезервированных диапазонах по 4 байта значения, которые Grub передает в регистрах %eax, %ebx. Затем происходит вызов функции main, которая уже написана на Си. В случае возврата из этой процедуры процессор зациклится.

    Шаг 2. Подготовка дополнительного кода для программы (системная библиотека):

    Поскольку вся программа пишется с нуля, то функцию printf нужно написать с нуля. Для этого нужно подготовить несколько файлов. Создадим папку common и include:

    mkdir common mkdir include

    Создадим файл common\printf.c, который будет содержать реализацию привычной функции printf. Этот файл целиком можно взять из проекта www.bitvisor.org. Путь до файла в исходниках bitvisor: core/printf.c. В скопированном из bitvisor файле printf.c, для использования в целевой программе нужно заменить строки:

    #include «initfunc.h» #include «printf.h» #include «putchar.h» #include «spinlock.h» на строки: #include «types.h» #include «stdarg.h» #include «screen.h»

    Потом, удалить функцию printf_init_global и все ее упоминания в этом файле:

    static void printf_init_global (void) { spinlock_init (&printf_lock); } INITFUNC («global0», printf_init_global);

    Затем удалить переменную printf_lock и все ее упоминания в этом файле:

    static spinlock_t printf_lock; … spinlock_lock (&printf_lock); … spinlock_unlock (&printf_lock);

    Функция printf использует функцию putchar, которую так же нужно написать. Для этого создадим файл common\screen.с, со следующим содержимым:

    #include «types.h» #define GREEN 0x2 #define MAX_COL 80 // Maximum number of columns #define MAX_ROW 25 // Maximum number of rows #define VRAM_SIZE (MAX_COL*MAX_ROW) // Size of screen, in short’s #define DEF_VRAM_BASE 0xb8000 // Default base for video memory static unsigned char curr_col = 0; static unsigned char curr_row = 0; // Write character at current screen location #define PUT(c) ( ((unsigned short *) (DEF_VRAM_BASE)) \ [(curr_row * MAX_COL) + curr_col] = (GREEN << 8) | (c)) // Place a character on next screen position static void cons_putc(int c) { switch (c) { case ‘\t’: do { cons_putc(‘ ‘); } while ((curr_col % 8) != 0); break; case ‘\r’: curr_col = 0; break; case ‘\n’: curr_row += 1; if (curr_row >= MAX_ROW) { curr_row = 0; } break; case ‘\b’: if (curr_col > 0) { curr_col -= 1; PUT(‘ ‘); } break; default: PUT(c); curr_col += 1; if (curr_col >= MAX_COL) { curr_col = 0; curr_row += 1; if (curr_row >= MAX_ROW) { curr_row = 0; } } }; } void putchar( int c ) { if (c == ‘\n’) cons_putc(‘\r’); cons_putc(c); } void clear_screen( void ) { curr_col = 0; curr_row = 0; int i; for (i = 0; i < VRAM_SIZE; i++) cons_putc(‘ ‘); curr_col = 0; curr_row = 0; }

    Указанный код, содержит простую логику печати символов на экран в текстовом режиме. В этом режиме для записи символа используется два байта (один с кодом символа, другой с его атрибутами), записываемые прямо в видео память отображаемую сразу на экране и начинающуюся с адреса 0xB8000. Разрешение экрана при этом 80×25 символов. Непосредственно печать символа осуществляется при помощи макроса PUT. Теперь не хватает всего несколько заголовочных файлов: 1. Файл include\screen.h. Объявляет функцию putchar, которая используется в функции printf. Содержимое файла:

    #ifndef _SCREEN_H #define _SCREEN_H void clear_screen( void ); void putchar( int c ); #endif

    2. Файл include\printf.h. Объявляет функцию printf, которая используется в main. Содержимое файла:

    #ifndef _PRINTF_H #define _PRINTF_H int printf (const char *format, …); #endif

    3. Файл include\stdarg.h. Объявляет функции для перебора аргументов, количество которых заранее не известно. Файл целиком берется из проекта www.bitvisor.org. Путь до файла в коде проекта bitvisor: include\core\stdarg.h. 4. Файл include\types.h. Объявляет NULL и size_t. Содержимое файла:

    #ifndef _TYPES_H #define _TYPES_H #define NULL 0 typedef unsigned int size_t; #endif Таким образом папки include и common содержат минимальный код системной библиотеки, которая необходима любой программе.

    Шаг 3. Создание скрипта для компоновщика:

    Создаем файл linker.ld, который будет использоваться компоновщиком для формирования файла целевой программы (kernel.bin). Файл должен содержать следующее:

    ENTRY (loader) LMA = 0x00100000; SECTIONS { . = LMA; .multiboot ALIGN (0x1000) : { loader.o( .text ) } .text ALIGN (0x1000) : { *(.text) } .rodata ALIGN (0x1000) : { *(.rodata*) } .data ALIGN (0x1000) : { *(.data) } .bss : { *(COMMON) *(.bss) } /DISCARD/ : { *(.comment) } }

    Встроенная функция ENTRY() позволяет задать входную точку для нашего ядра. Именно по этому адресу передаст управление grub после загрузки ядра. Компоновщик при помощи этого скрипта создаст бинарный файл в формате ELF. ELF-файл состоит из набора сегментов и секций. Список сегментов содержится в Program header table, список секций в Section header table. Линковщик оперирует с секциями, загрузчик образа (в нашем случае это GRUB) с сегментами.

    Как видно на рисунке, сегменты состоят из секций. Одним из полей, описывающих секцию, является виртуальный адрес, по которому секция должна находиться на момент выполнения. На самом деле, у сегмента есть 2 поля, описывающих его расположение: виртуальный адрес сегмента и физический адрес сегмента. Виртуальный адрес сегмента это виртуальный адрес первого байта сегмента в момент выполнения кода, физический адрес сегмента это физический адрес по которому должен быть загружен сегмент. Для прикладных программ эти адреса всегда совпадают. Grub загружает сегменты образа, по их физическому адресу. Так как Grub не настраивает страничную адресацию, то виртуальный адрес сегмента должен совпадать с его физическим адресом, поскольку в нашей программе виртуальная память так же не настраивается.

    SECTIONS Говорит о том, что далее описываются секции. . = LMA; Это выражение указывает линковщику, что все последующие секции находятся после адреса LMA. ALIGN (0x1000) Директива выше, означает, что секция выровнена по 0x1000 байт. .multiboot ALIGN (0x1000) : { loader.o( .text ) } Отдельная секция multiboot, которая включает в себя секцию .text из файла loader.o, сделана для того, что бы гарантировать попадание сигнатуры формата multiboot в первые 8кб образа ядра. .bss : { *(COMMON) *(.bss) } *(COMMON) это область, в которой резервируется память инструкциями .comm и .lcomm. Мы располагаем ее в секции .bss. /DISCARD/ : { *(.comment) } Все секции, помеченные как DISCARD, удаляются из образа. В данном случае мы удаляем секцию .comment, которая содержит информацию о версии линковщика.

    Теперь скомпилируем код в бинарный файл следующими командами:

    as -o loader.o loader.s gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o kernel.o -c kernel.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o printf.o -c common/printf.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o screen.o -c common/screen.c ld -T linker.ld -o kernel.bin kernel.o screen.o printf.o loader.o С помощью objdump’а рассмотрим, как выглядит образ ядра после линковки: objdump -ph ./kernel.bin

    Как можно видеть, секции в образе совпадают с теми, что мы описали в скрипте линковщика. Линковщик сформировал 3 сегмента из описанных секций. Первый сегмент включает в себя секции .multiboot, .text, .rodata и имеет виртуальный и физический адрес 0x00100000. Второй сегмент содержит секции .data и .bss и располагается по адресу 0x00104000. Значит все готово для загрузки этого файла при помощи Grub.

    Шаг 4. Подготовка загрузчика Grub: Создать папку grub:

    mkdir grub

    Скопировать в эту папку несколько файлов Grub, которые необходимы для его установки на образ (указанные далее файлы существуют, если в системе установлен Grub). Для этого нужно выполнить следующие команды:

    cp /usr/lib/grub/i386-pc/stage1 ./grub/ cp /usr/lib/grub/i386-pc/stage2 ./grub/ cp /usr/lib/grub/i386-pc/fat_stage1_5 ./grub/

    Создать файл grub/menu.lst, со следующим содержимым:

    timeout 3 default 0 title mini_os root (hd0,0) kernel /kernel.bin

    Шаг 5. Автоматизация и создание загрузочного образа:

    Для автоматизации процесса сборки будем использовать утилиту make. Для этого создадим файл makefile, который будет собирать компилировать исходный код, собирать ядро и создавать загрузочный образ. Makefile должен иметь следующее содержимое: CC = gcc CFLAGS = -Wall -fno-builtin -nostdinc -nostdlib LD = ld OBJFILES = \ loader.o \ common/printf.o \ common/screen.o \ kernel.o image: @echo «Creating hdd.img…» @dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/NULL 2>&1 @echo «Creating bootable first FAT32 partition…» @losetup /dev/loop1 ./hdd.img @(echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/NULL 2>&1 || true @echo «Mounting partition to /dev/loop2…» @losetup /dev/loop2 ./hdd.img \ —offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk ‘{print $$3}’\`*512 | bc` \ —sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk ‘{print $$4}’\`*512 | bc` @losetup -d /dev/loop1 @echo «Format partition…» @mkdosfs /dev/loop2 @echo «Copy kernel and grub files on partition…» @mkdir -p tempdir @mount /dev/loop2 tempdir @mkdir tempdir/boot @cp -r grub tempdir/boot/ @cp kernel.bin tempdir/ @sleep 1 @umount /dev/loop2 @rm -r tempdir @losetup -d /dev/loop2 @echo «Installing GRUB…» @echo «device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n» | grub —batch 1>/dev/NULL @echo «Done!» all: kernel.bin rebuild: clean all .s.o: as -o [email protected] $< .c.o: $(CC) -Iinclude $(CFLAGS) -o [email protected] -c $< kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o [email protected] $^ clean: rm -f $(OBJFILES) hdd.img kernel.bin
    В файле объявлены две основные цели: all – компилирует ядро, и image – которая создает загрузочный диск. Цель all подобно привычным makefile содержит подцели .s.o и .c.o, которые компилируют *.s и *.c файлы в объектные файлы (*.o), а так же цель для формирования kernel.bin, которая вызывает компоновщик с созданным ранее скриптом. Эти цели выполняют ровно те же команды, которые указаны в шаге 3. Наибольший интерес здесь представляет создание загрузочного образа hdd.img (цель image). Рассмотрим поэтапно, как это происходит.

    dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/NULL 2>&1 Эта команда создает образ, с которым будет происходить дальнейшая работа. Количество секторов выбрано не случайно: 16065 = 255 * 63. По умолчанию fdsik работает с диском так, как будто он имеет CHS геометрию, в которой Headers (H) = 255, Sectors (S) = 63, а Cylinders( С ) зависит от размера диска. Таким образом, минимальный размер диска, с которым может работать утилита fdsik, без изменения геометрии по умолчанию, равен 512 * 255 * 63 * 1 = 8225280 байт, где 512 – размер сектора, а 1 – количество цилиндров. Далее создается таблица разделов: losetup /dev/loop1 ./hdd.img (echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/NULL 2>&1 || true Первая команда монтирует файл hdd.img к блочному устройству /dev/loop1, позволяя работать с файлом как с устройством. Вторая команда создает на устройстве /dev/loop1 таблицу разделов, в которой находится 1 первичный загрузочный раздел диска, занимающий весь диск, с меткой файловой системы FAT32. Затем форматируем созданный раздел. Для этого нужно примонтировать его как блочное устройство и выполнить форматирование. losetup /dev/loop2 ./hdd.img \ —offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk ‘{print $$3}’\`*512 | bc` \ —sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk ‘{print $$4}’\`*512 | bc` losetup -d /dev/loop1 Первая команда монтирует ранее созданный раздел к устройству /dev/loop2. Опция –offset указывает адрес начала раздела, а –sizelimit адрес конца раздела. Оба параметра получаются с помощью команды fdisk. mkdosfs /dev/loop2 Утилита mkdosfs форматирует раздел в файловую систему FAT32. Для непосредственной сборки ядра используются рассмотренные ранее команды в классическом синтаксисе makefile. Теперь рассмотрим как установить GRUB на раздел: mkdir -p tempdir # создает временную директорию mount /dev/loop2 tempdir # монтирует раздел в директорию mkdir tempdir/boot # создает директорию /boot на разделе cp -r grub tempdir/boot/ # копируем папку grub в /boot cp kernel.bin tempdir/ # копирует ядро в корень раздела sleep 1 # ждем Ubuntu umount /dev/loop2 # отмонтируем временную папку rm -r tempdir # удаляем временную папку losetup -d /dev/loop2 # отмонтируем раздел После выполнения вышеприведенных команд, образ будет готов к установке GRUB’а. Следующая команда устанавливает GRUB в MBR образа диска hdd.img. echo «device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n» | grub —batch 1>/dev/NULL

    Все готово к тестированию!

    Шаг 6. Запуск:

    Для компиляции, воспользуемся командой:

    make all После которой должен появиться файл kernel.bin. Для создания загрузочного образа диска, воспользуемся командой: sudo make image В результате чего должен появиться файл hdd.img. Теперь с образа диска hdd.img можно загрузиться. Проверить это можно с помощью следующей команды: qemu -hda hdd.img -m 32 или: qemu-system-i386 -hda hdd.img

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

    sudo dd if=./hdd.img of=/dev/sdb

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

    Ссылки на следующие статьи цикла: «Как запустить программу без операционной системы: часть 2

    » «
    Как запустить программу без операционной системы: часть 3: Графика
    » «
    Как запустить программу без операционной системы: часть 4. Параллельные вычисления
    » «
    Как запустить программу без операционной системы: часть 5. Обращение к BIOS из ОС
    » «
    Как запустить программу без операционной системы: часть 6. Поддержка работы с дисками с файловой системой FAT
    «

    Установка APK при помощи устройства на Android

    Samsung Galaxy S10 в руке

    Для установки файла APK обычно не требуется ничего, кроме самого планшета или смартфона на Android, в который и нужно установить ту или иную программу. Чтобы это сделать, следует немного подготовиться. Первым делом идём в Настройки и выбираем там вкладку «Безопасность». Далее ставим «галочку» в пункте «Разрешить установку приложений из неизвестных источников». Это позволит ставить приложения не только из магазина Google Play Store, но и из других источников. Как раз то, что нужно! В более новых версиях Android порядок действий может отличаться. Иногда система уже в процессе установки приложения из файла APK задаёт вопрос о том, разрешает ли пользователь это делать. Разрешить нужно, иначе ничего не получится.

    Теперь, когда подготовка завершена, нужно просто открыть браузер, найти нужный файл APK, загрузить его на устройство, а затем запустить его для установки приложения. Запоминайте, куда скачали файл. Обычно это папка «Загрузки», если перед скачиванием не был выбран другой путь. Найдя загруженный файл, достаточно просто нажать на него, а затем согласиться на установку, тапнув «Да». После этого приложение начнёт устанавливаться. Готово!

    Рейтинг
    ( 2 оценки, среднее 4 из 5 )
    Понравилась статья? Поделиться с друзьями:
    Для любых предложений по сайту: [email protected]