- Improving app startup with I/O prefetching
- Iorap cmd compiler андроид
- Создание нативных Android-приложений с использованием компилятора Intel C++ Compiler в Android Studio 1.0.1
- Требуемые программные инструменты
- Использование компилятора Intel C++ Compiler в Android Studio 1.0.1
- 1. Создание нового проекта Android с нативным интерфейсом:
- 2. Добавление нативного исходного кода: main.c
- 3. Добавление make-файла: Android.mk
- 4. Добавление make-файла: Application.mk
- 5. Сконфигурируйте свое приложение для выполнения ndk-build с помощью make-файлов
- 6. Добавьте ID «hello_textview» в виджет textview
- 7. Обновите «MainActivity.java», чтобы UI textview вызов нативной библиотеки:
- 8. Запустите виртуальную машину Android Virtual Machine «Intel-Nexus 7 x64» и выполните приложение, щёлкнув кнопку «Run».
Improving app startup with I/O prefetching
In Android 11, we introduced IORap, a new feature which greatly improves application startup times. We have observed that apps start more than 5% faster (cold startup) on average across a variety of devices. Some hero cases show 20%+ faster startup times. Users get this additional performance without any developer app changes!
IORap prefetching for Android apps
IORap reduces app startup times by predicting which I/O will be required and doing it ahead of time. Many app startups have a lot of time that the IO request queue isn’t being saturated because of blocking I/O. As a result, we aren’t maximizing IO latency. After prefetching the data and compacting the I/O, the app can access this data nearly instantly from the pagecache , significantly reducing app startup latency.
When we evaluated some popular top apps from the Play Store, 80%+ spent 10%+ time in blocking I/O during launch time. while
50% of the apps even spent 20%+ time. A majority of apps we looked at could benefit from IORap.
IORap works as an independent service on the device. It interacts with package manager, activity manager, perfetto service, etc via IPC. The overall architecture of IORap is shown in the following figure:
Step 1: Collecting perfetto traces
IORap uses a profiling-based strategy to determine the I/O to be prefetched. The knowledge comes from perfetto trace, which records the kernel pagecache page removals/additions (from ftrace). In the first several cold-runs of an app, the perfetto tracing is on to get the pagecache missing events. Our study shows the overhead of perfetto tracing on startup time is neglectable.
Step 2: Generating prefetch list
Based on the perfetto traces obtained from the prior step, IORap generates a prefetch list during the idle time of the device. Basically, the prefetch list contains the information of the file (name, offset, length) that was accessed by an app when it’s launched. IORap analyzes the mm_pagemap events from the perfetto trace and converts its result ( inode , offset, length) to (name, offset, length) by reversing inode to filename. Data is then stored in the prefetch list, which is a protobuf file.
Step 3: I/O prefetching
After the prefetch list is generated, IORap can prefetch the corresponding data for the following runs of the app. The perfetto tracing is not needed any more. The user and developer don’t need to do anything. The prefetching is performed when the user taps on the icon or indirectly via another app requesting it via Intent. Enjoy the speedup!
Step 4: Obsoleting the prefetch list
The prefetch list doesn’t live forever. Several events may cause the prefetch list to become obsolete. When an app is updated, the prefetch list is deprecated because the app may change and the previous data may be inaccurate. Also, the dexopt service can optimize the app after installation. Once the app is optimized, the layout may differ making the prefetch list obsolete. The obsolete prefetch list will be removed and a new round will start with perfetto trace collections.
Collating results from several experiments in our lab we determined that IORap benefits cover the spectrum from low end to high end devices. On average, IORap could provide up to
26% speedup. It’s extremely helpful for apps that have heavy I/O during startup. For example, Spotify shows double digit improvement for both low-end devices (Go and Pixel 3A) and high end-devices (Pixel 3 or 4).
One interesting observation during the experiment is that the performance of IORap is largely impacted by the amount of prefetched data. An accurate trace duration is super important for IORap. A shorter trace duration causes less data than necessary to be prefetched and less performance gain. On the other hand, a longer one leads to more data than necessary being prefetched, which may result in slower startup in worst case scenarios. IORap uses the timestamp of when an app reports the ReportFullyDrawn event to estimate trace duration. For apps not reporting this event, the display time is used. So invoking the reportFullyDrawn callback at the right time can improve the performance of IORap.
We’re excited about the improvement that IORap has shown, and we plan to explore this concept more in the future in the following two directions. Firstly, prefetching more often. It would be great if prefetching could be done during profiling. Then we could eliminate some of the performance gap before generating the prefetching list by providing a prebuilt prefetching list. Secondly, IORap could predict that an app will start and begin prefetching earlier, further speeding up startup time.
You can help IORap out by invoking the ReportFullyDrawn callback when your app completes its startup. IORap mainly helps reduce the I/O blocking time, so consider profiling your app startup for other possible performance issues.
Источник
Iorap cmd compiler андроид
Этот материал не претендует на абсолютную истину, может быть, что-то можно сделать проще и быстрее. Автор как знает, так и делает. Кроме того он не является большим экспертом в области nix-систем. Всё, что написано ниже, найдено на просторах интернета, в большинстве своём на не русскоязычных форумах, систематизировано и изложено на родном для автора языке — русском.
Коллеги, не задавайте мне вопросы по данной теме в личку, уже несколько лет как я забросил Android и не интересуюсь развитием ядер, как впрочем и самого Android-a.
Сообщение отредактировал PaWill — 08.03.16, 14:54
Часть 1. Необходимые инструменты и исходники
Для компиляции ядра нам потребуется nix-подобная операционная система. Я использовал Ubuntu 10.04 LTS — Long-term support 32-bit, которую установил на виртуальную машину VMware Workstation. Где всё это добро скачать/купить, как установить мы здесь обсуждать не будем. Если вы это не смогли сделать самостоятельно или с помощью гугла, то читать эту статью для вас ещё рано (или уже поздно). 🙂
И так, у нас всё установлено и работает. Теперь проверим все ли необходимые компоненты присутствуют в системе, возможно какие то пакеты придётся доустановить.
Запускаем терминал:
В терминале вводим следующую команду [1]:
Судя по последней строке у меня все пакеты на месте:
У вас, вероятней всего, не будет важного пакета — sun-java6-jdk on Ubuntu 10.04 (Lucid). Для его автоматической загрузки нужно в адреса репозитория добавить дополнительные ссылки. Введите в терминале:
После того как всё скачается и установится опять команда [1] пока не будет ошибок. Будем считать что с Ubuntu покончили.
Теперь нам потребуются собственно сами исходники ядра. Их можно найти на http://opensource.samsung.com/. В строке поиска вводим «I9000» и получаем:
Нас интересует JPX GT-I9000_OpenSource_Froyo_update2.zip (211 МБ), делаем как на скрине и жмём «Continue».
Ещё нам потребуется кросс-компилятор, которым будем собирать ядро:
http://www.codesourcery.com/sgpp/lite/arm/. nux-gnu.tar.bz2 (80 МБ)
И последнее что потребуется — это initramfs.cpio. Я выдрал его из JS8. Как это сделать расскажу как-нибудь отдельно.JS8_initramfs.tar ( 2.64 МБ )
Пока всё, продолжение следует.
Сообщение отредактировал PaWill — 19.03.11, 19:38
Часть 2. Распаковка исходников
Всё что вы скачали будет находится в каталоге /home/имя_пользователя/Загрузки. У меня этот путь выглядит как:
Источник
Создание нативных Android-приложений с использованием компилятора Intel C++ Compiler в Android Studio 1.0.1
На момент написания этого текста текущей версией Android Studio была версия 1.0.1. Компилятор Intel C++ Compiler for Android, будучи частью Intel Integrated Native Developer Experience (Intel INDE), поддерживает Android Studio 1.0.1 в Intel INDE 2015 Update 1. Поскольку Android Studio 1.0.1 не поддерживает Android NDK, в этой статье описаны шаги для создания нативного Android-приложения с использованием Android NDK r10d и компилятора Intel C++ Compiler for Android. Поехали!
Android Studio в качестве системы сборки использует Gradle. На момент написания статьи Gradle в процессе сборки вызывала систему NDK. В Android NDK r10 и более поздней версии после инсталляции Intel INDE компилятор Intel C++ Compiler for Android (ICC) не является более используемым по умолчанию компилятором в системе сборки NDK.
Представленные ниже шаги дают общее описание подготовки, сборки и выполнения нативного приложения в Android Studio 1.0.1.
Если вы используете Android Studio 0.8.6, почитайте статью «Сборка нативных Android-приложений с использованием компилятора Intel C++ Compiler в Android Studio», где рассказывается о применении Intel C++ Compiler.
Требуемые программные инструменты
Успешная инсталляция INDE 2015 Update 1 с Android Studio Integration гарантирует, что вы располагаете всем необходимым программным обеспечением. Детальные требования к программному обеспечению и системе описаны в документе Intel C++ Compiler Release Notes for Intel Integrated Native Developer Experience 2015.
Приведенные в данной статье инструкции предполагают использование следующего ПО для архитектуры IA-32 и Intel-64:
- Oracle JDK 7 (нативный Intel-64 JDK для систем Windows x64)
- Android SDK 20 или старше
- NDK r10d (предполагается инсталляция в [ndk-dir] )
- Android Studio 1.0.1
Убедитесь, что в переменную среды PATH добавлены следующие директории Android NDK (если они отсутствуют, добавьте):
Использование компилятора Intel C++ Compiler в Android Studio 1.0.1
После инсталляции Intel C++ Compiler 15.0 for Android в папку «[ndk-dir]\toolchains» (директория по умолчанию – «C:\Intel\INDE\IDEintegration\android-ndk-r10d\toolchains») устанавливаются следующие элементы:
- x86-icc
- x86-icc15.0.X.YYY
- x86_64-icc (если NDK поддерживает 64-разрядные цели)
- x86_64-icc15.0.X.YYY (если NDK поддерживает 64-разрядные цели)
Для NDK до r9d: после инсталляции нативным компилятором C/C++ будет Intel C++ Compiler. Дополнительных шагов для использования Intel C++ Compiler с Android Studio не требуется. Ели вы хотите для построения нативного кода использовать GNU gc, следуйте инструкциям в «Замена компилятора по умолчанию с Intel C++ Compiler на GCC для целевых приложений x86».
Для NDK r10 — r10d: компилятор Intel C++ после инсталляции не является компилятором по умолчанию. Чтобы использовать Intel C++ Compiler из Android Studio, следуйте шагам 3, 4, 5 ниже.
Если у вас установлено несколько Android NDK, следуйте инструкциям в статье «Интеграция Intel C++ Compiler for Android с несколькими Android NDK».
Теперь создадим новый проект Android для Intel-64 с нативным вызовом функции, продемонстрировав тем самым использование компилятора Intel C++ Compiler:
1. Создание нового проекта Android с нативным интерфейсом:
1. Откройте Android Studio, создайте новый Android-проект «nativeDemo» с параметрами по умолчанию, например:
2. Откройте «app\src\main\java\MainActivity.java» и добавьте в конец класса «MainActivity» нативную функцию как показано ниже:
Должно получиться примерно так:
3. Чтобы создать проект «nativeDemo», выберите: «Build > Make Project», после чего можно будет использовать «javah».
4. В «View > Tools Windows > Terminal» откройте терминальное окно и выполните указанные ниже шаги для запуска «javah» и создания заголовка jni:
a) В терминальном окне перейдите в подпапку «src\main»:
b) Чтобы создать «com_example_nativedemo_app_MainActivit.h» в папке src\main\jni, выполните следующую команду «javah» cmd:
5. В окне Project измените вид на Project, щелкните правой кнопкой мыши на папке «src» и выберите «Synchronize ‘src». Теперь в папке «src\main\jni» можно видеть файл заголовка «com_example_mydemo_nativedemo_MainActivity.h».
2. Добавление нативного исходного кода: main.c
1. Создайте «main.c»: выделите файл «com_example_mydemo_nativedemo_MainActivity.h», используйте волшебные клавиши copy/paste для создания нового «main.c» со следующим кодом:
2. Сохраните изменения
3. Теперь в папке «jni» у вас два файла: com_example_mydemo_nativedemo_MainActivity.h и main.c
3. Добавление make-файла: Android.mk
1. Щелкните правой кнопкой на папке «jni», выберите «New > File»
2. Наберите «Android.mk» и щёлкните на «OK»
3. Добавьте в этот файл следующие строки (обратите внимание, что строка LOCAL_SRC_FILES должна содержать исходные файлы, которые находятся в папке «jni»):
4. Добавление make-файла: Application.mk
1. Щелкните правой кнопкой на папке «jni», выберите «New > File»
2. Наберите «Application.mk» и щёлкните на «OK»
3. Добавьте в этот файл следующие строки:
4. [Опционально] Для изменения параметров компилятора используйте следующее:
5. Сконфигурируйте свое приложение для выполнения ndk-build с помощью make-файлов
1. Откройте файл «app\build.gradle»
2. Добавьте в начало файла следующий импорт:
3. И эти строки после секции «defaultConfig»:
4. А следующие строки – в конец файла:
5. Сохраните изменения
6. Теперь создадим проект: выберите [Build > Make Project]. Вы увидите все выходные папки и файлы «libmain.so» в папках «main\libs» и «main\obj\local».
6. Добавьте ID «hello_textview» в виджет textview
Откройте «res\layout\activity_main.xml» и измените виджет «textview» как показано ниже:
7. Обновите «MainActivity.java», чтобы UI textview вызов нативной библиотеки:
Для импорта виджета TextView и сохранения изменений нажмите ALT+Enter.
8. Запустите виртуальную машину Android Virtual Machine «Intel-Nexus 7 x64» и выполните приложение, щёлкнув кнопку «Run».
Это означает, что был использован компилятор Intel C++ Compiler for Android.
Источник