Содержание
Использование нативного кода, написанного на C или С++ — это тема, которую многие разработчики не затрагивают вовсе. Но порой использование C++ в приложениях намного упрощает/ускоряет разработку. В этой статье будут рассмотрены основные принципы работы с native кодом.
Предварительная настройка
Если у вас ещё не настроен Eclipse, то читаем как настроить Eclipse для работы с Android. Только помимо того, что в статье сказано, при установке ещё необходимо выбрать и установить NDK плагин.
Так же вам необходимо установить CDT для Eclipse. Под Виндой вам вроде как ещё понадобиться установить Cygwin.
Теперь необходимо создать проект и прописать пути.
- Создать Android Application.
- Eclipse -> Window -> Preferences -> Android -> set path to SDK
- Eclipse -> Window -> Preferences -> Android -> NDK -> set path to the NDK
- Нажмите правой кнопкой мыши на проект и выберите Android Tools -> Add native support
В проекте будет создана папка jni, где вы должны размещать файлы с C++ кодом. В ранних версиях был баг, когда Eclipse не мог верно настроить пути до некоторых хэдеров из NDK. В последней версии всё нормально. Просто очистите проект (Clean project), а затем перестройте его (Build project).
Зачем нужен NDK?
Думаю, необходимо предварительно объяснить, когда вообще стоит (и стоит ли?) использовать ndk. Многие советуют использовать C++, когда требуются какие-то большие/сложные вычисления. Что значит сложно? =/ В общем, лучше назову конкретные случаи, когда использование NDK оправдано:
- Работа с OpenGL ES. Думаю, большинство тех, кто использует NDK, юзают его как раз для написания игр.
- Использование кросс-платформенных движков, вроде кокоса.
- Самый очевидный случай — это когда вам надо использовать уже написанный на C++ код. За десятилетия на C++ уже куча всего написано. Зачем переписывать такие вещи на Java, если можно просто использовать эти Open Source наработки. Да и не всё можно переписать, думаю тот же openCV бессмысленно бы было переписывать, в том время когда можно просто подключить готовые исходники.
Возможности NDK огромны. Вы можете из Java вызывать C++ методы. В то же время, вам ничто не машет вызывать Java методы из C++. Даже есть возможность создавать приложение практически без использования Java, используя NativeActivity (API 9 и выше).
Java. Путешествие в Native (или туда и обратно).
Да простит меня профессор за упоминание его работы (: И так, рассмотреть всё в рамках одной статьи невозможно. Поэтому, для начала реализуем лишь вызов native методов из Java.
Перечислю кратко основные моменты при работе с native:
- Создание файлов с C++ кодом.
- Определение C++ методов для экспорта.
- Создание .mk файлов.
- Генерация библиотеки.
- Подключение библиотеки в Java и вызов C++ методов.
Создание файлов с C++ кодом
В native определим всего 3 метода: передача строки, изменение строки, получение строки.
Создадим для начала файл def.h, подключим пару нужных файлов и определим методы для вывода в консоль.
#include #include #include #include #ifdef __ANDROID__ #define LOG_TAG "MyNative" #define STRINGIFY(x) #x #define LOG_TAG __FILE__ ":" STRINGIFY(__MyNative__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #endif
Создадим файл MyNative.h и определим в нём спецификации методов для экспорта, чтоб вызывать их из Java кода потом.
#include #include char MyStr[80]; extern "C" { JNIEXPORT void Java_ru_suvitruf_androidndk_AndroidNDK_SetString(JNIEnv * env, jobject obj, jstring str); JNIEXPORT void Java_ru_suvitruf_androidndk_AndroidNDK_ChangeString(JNIEnv * env, jobject obj); JNIEXPORT jstring Java_ru_suvitruf_androidndk_AndroidNDK_GetString(JNIEnv * env, jobject obj); }
Теперь все три метода можно вызвать из Java кода. Я этот код ручками писал. Но можно заюзать javah, которая будет сама генерить эти заголовки. extern "C"
нужен, чтобы компилятор C++ не менял имена объявленных функций.
Стоит немного сказать про наименование методов. Java_ — обязательный префикс. ru_suvitruf_androidndk, так как у нас пакет ru.suvitruf.androidndk, ну а дальше наименование класса и метода на стороне Java. В каждой функции в качестве аргумента имеется JNIEnv*
— интерфейс для работы с Java, при помощи него можно вызывать Java-методы, создавать Java-объекты. Второй обязательный параметр — jobject
или jclass
— в зависимости от того, является ли метод статическим. Если метод статический, то аргумент будет типа jclass
(ссылка на класс объекта, в котором объявлен метод), если не статический — jobject
— ссылка на объект, у которого был вызван метод.
Ну и создадим MyNative.cpp с реализацией методов.
#include JNIEXPORT void Java_ru_suvitruf_androidndk_AndroidNDK_SetString(JNIEnv * env, jobject obj, jstring str){ jboolean isCopy; const char * Str; Str = env->GetStringUTFChars(str, &isCopy); strcpy(MyStr,Str); LOGI("string = "%s"",MyStr); } void ChangeStr(){ strcat(MyStr," and bb."); } JNIEXPORT void Java_ru_suvitruf_androidndk_AndroidNDK_ChangeString(JNIEnv * env, jobject obj){ ChangeStr(); LOGI("string after change = "%s"",MyStr); } JNIEXPORT jstring Java_ru_suvitruf_androidndk_AndroidNDK_GetString(JNIEnv * env, jobject obj){ LOGI("returned string = "%s"",MyStr); return env->NewStringUTF(MyStr); }
Работа с Application.mk
В этом файле описаны глобальные настройки для сборки либы.
# Без этой строчки ничего не будет работать (: APP_STL:=stlport_static # Список модулей/либ, которые нужна забилдить. Они будут такие же как в LOCAL_MODULE в Android.mk файле APP_MODULES := AndroidNDK # Указываем под какой arm собирать. Не обязательный параметр. APP_ABI := armeabi armeabi-v7a # Платформа, под которую билдим. Не обязательный параметр. APP_PLATFORM := android-10
Работа с Android.mk
Здесь указываем параметры/настройки по линковке и прочее, чтобы собрать либу.
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # имя нашего модуля, который будет вызываться в Java при помощи System.loadLibrary() LOCAL_MODULE := AndroidNDK LOCAL_DEFAULT_CPP_EXTENSION := cpp #список файлов, который нужно собрать LOCAL_SRC_FILES := MyNative.cpp #список библиотек из ndk, которые надо включить в сборку LOCAL_LDLIBS := -llog -landroid include $(BUILD_SHARED_LIBRARY)
В Android.mk вообще есть не мало всяких флагов и прочего. Можно добавлять в сборку уже готовые библиотеки и т.д. В следующих статьях напишу, как это делается.
После того, как вы создали C++ файлы и .mk сделали, можно забилдить проект, тогда в папке obj появится библиотека libAndroidNDK.so.
Подключение библиотеки в Java и вызов C++ методов.
Теперь остаётся только написать Java код. Сделаем простенькое приложение. Разместим поле для ввода текста, три кнопки (передача текста в native, изменение текста в native и возврат изменённой строки из native) и поле для нового текста, который получили из native кода.
Для того, чтобы использовать native методы создадим класс AndroidNDK.
public class AndroidNDK { // Загрузка модуля «AndroidNDK» — нативной библиотеки, в которой реализованы методы. // Название этого модуля задается в файле Android.mk. static { System.loadLibrary("AndroidNDK"); } public static native void SetString(String str); public static native void ChangeString(); public static native String GetString(); }
Ключевое тут:
static { System.loadLibrary("AndroidNDK"); }
Этот код выполнит загрузку нашей библиотеки, в которой реализованы методы. Обратите ещё раз внимание на этот класс и методы и вспомните наименование методов при экспорте в native коде: Java_ru_suvitruf_androidndk_AndroidNDK_ChangeString.
Java код по обработке нажатий на кнопки писать не буду, ибо это тривиальная задача. В любом случае, если понадобиться, можете посмотреть в исходниках к статье. В логе будет вот что:
Для знакомства с native достаточно написал. Можете скачать исходники AndroidNDK.rar.
Полная декомпиляция Android приложений, декомпиляция приложений в исходный Java код
Инструкцию буду проводить для ОС Windows.
- Качаем dex2jar-0.0.9.8.zip (номер версии может изменяться) и извлекаем все файлы в желаемую папку, например D:Decompile .
- Качаем Java Decompiler, я использовал JD-GUI и извлекаем файлы для удобства в ту же папку, куда и dex2jar.
- Качаем apktool и apktool-install-windows-r04-brut1.tar.bz2 и извлекаем файлы уже в системную папку. По умолчанию C:Windows. (Не забываем скачать второй архив)
- Берем нужный apk файл и кладем в папку с dex2jar и Java Decompiler. В примере приведу декомпиляцию приложения Calculator.zip ( 66,18 КБ ). (надо извлечь из архива).
- Открываем Командную строку (Обработчик команд Windows) в вышеупомянутой папке (В папке по пустому месте при зажатой кнопке Shift нажимаем правую кнопку мыши и выбираем Обработчик команд Windows).
- Вводим команду dex2jar Calculator.apk и если все прошло хорошо, в той же папке появится файл Calculator.apk.dex2jar.jar
- Запускаем jd-gui и открываем полученный на предыдущем шаге файл. (На Windows 7 открывать с правами администратора и с совместимостью Windows XP SP3)
- Выбираем пункт меню File-Save All Sources и сохраняем.
- Извлекаем полученный zip архив.
- Помещаем полученную папку в папку src (надо предварительно создать).(Что бы получилась примерно такая структура D:DecompileCalculatorsrccomandroid)
- Опять же в командной строке вводим команду apktool d Calculator.apk Calculator, где Calculator.apk-имя пакета, Calculator-папка для декомпиляции
- Если все хорошо, тогда в указанной папке будут исходники в двух форматах (java и smali), ресурсы и файлы AndroidManifest.xml, apktool.yml
- Все готово, исходники получены. Правда после декомпиляции в коде есть, можно сказать, ошибки, я заметил пока только что вместо true и false стоят 1 и 0 соответственно.
P.S. Если хочется импортировать полученный код в IDE Eclipse (File-Import), тогда положите содержимое этого архива(Eclipse.zip ( 1,44 КБ )) в папку с проектом, предварительно изменив на третьей строке PROJECT NAME PROJECT NAME на желаемое название, в моем примере «Calculator» в файле .projectP.P.S. Если apk файл был пропущен при компиляции через обфускатор (proguard), тогда полученный код будет плохо читаем.Источник: http://boomik.ru/polnaya-dekompilyaciya-android-prilozhenij
Сообщение отредактировал KEEPERekb — 09.06.15, 14:51
Дисклеймер: Я не 23 летний сеньор (мне 19 и до сеньора мне еще ой как далеко, года 4, поэтому супер статьи от меня не ждите.
Основа пути моего, разработчика как — обучение/изучение нового постоянное. Надеюсь, у вас тоже.
Я бы хотел подробно рассмотреть процесс компиляции и сборки Android приложения в конечный .apk. Да, при разработке очередного приложения какашкибезholoстилей эта информация вам нафиг не сдалась, но для общего развития будет полезна всем Android разработчикам.
Конечно, можно было бы ограничиться инструкцией вроде:
- Напишите код
- Нажмите кнопочку Build & Run в вашей IDE
- Продолжайте быть Android разработчиком
Но мы не ищем легких путей.
В общих чертах процесс сборки приложения выглядит так:
Нас особенно интересует второй этап (компиляция и сборка ресурсов), так что, рассмотрим его более подробно (21 этап как никак):
Пожалуйста, не прокручивайте диаграмму из-за того, что вам лень вникать, она не сложная, к тому же переведенная. Это основа статьи.(Оригинал здесь: developer.android.com/tools/building/index.html)
Читайте также: System32 как открыть доступ windows 10
Что есть что на диаграмме:
1. Ресурсы приложения — это все xml ресурсы из папки res вашего проекта + некомпилируемые бинарные ресурсы, например, картинки из res/drawable или файлы из /res/raw, а так же файлы из /assets/
2. aapt — утилита, которая ищет в вашем проекте компилируемые ресурсы, такие как AndroidManifest.xml и xml файлы из res/ и компилирует их в бинарное представление, а изначально бинарные ресурсы, такие как картинки, и файлы из /res/raw и /assets не компилируются. Далее, эта утилита генерирует важнейший класс R.java для вашего приложения, благодаря которому вы можете обращаться к ресурсам из вашего кода без всяких заморочек с чтением файлов, как скажем с /assets.
Кстати, кроме компиляции xml ресурсов, aapt создает файл resources.arsc, который представляет собой таблицу для маппинга ресурсов во время выполнения приложение, туда входят все ресурсы из /res/, в том числе и /res/raw/, содержимое /assets не включается в таблицу.
Полезно знать: Утилита aapt находится в папке platform-tools вашего Android SDK. Если вам захотелось сделать реверс-инжиниринг скомпилированных ресурсов приложения, вы можете воспользоваться apk-tool (https://code.google.com/p/android-apktool/)
3. R.java — класс, генерируемый утилитой aapt для того, чтобы вы могли обращаться к ресурсам из папки res без явной работы с файловой системой через библиотеки ввода/вывода.
Если кто-то еще не знал — всякие R.string, R.menu и прочее — это статические вложенные классы, а в R.string.app_name, app_name — public static final int поле класса. Получается, что правило-принцип CamelCase, применяемый в Java, для них нарушен, должно то быть: R.String, R.Menu, а с константами — R.String.APP_NAME, айайай Google.
4. Исходный код приложения — это ваши (или украденные форкнутые с других проектов) .java файлы с кодом проекта из папки src, все просто.
5. Java интерфейсы — это не те, обычные интерфейсы (обычные входят в состав исходного кода приложения, предыдущий пункт), которые вы используете в вашем коде, это интерфейсы, сгенерированные утилитой aidl (следующий пункт содержит пояснение).
6. .aidl файлы — это интерфейсы, которые вы можете написать на Java с немного необычным синтаксисом (на самом деле, язык называется AIDL — Android Interface Defenition Language). Такие интерфейсы нужны для описания взаимодействия между различными процессами, например когда вам нужно, чтобы сервис (Service) вашего приложения работал не просто в отдельном потоке, а именно в отдельном процессе (у такого подхода есть как преимущества, например, раздельные квоты на память для процессов, так и недостатки — необходимость использования aidl), на Хабре есть статья, в которой раскрыта тема использования aidl http://habrahabr.ru/post/139432/).
7. aidl — утилита, которая транслирует ваши .aidl файлы в Java код, она находится в папке platform-tools вашего Android SDK.
8. Java компилятор — (наконец-то мы до него добрались!) это обычный javac из вашего JDK, которому дают на обработку исходный код приложения (4), R.java (3) и интерфейсы aidl, которые переведены в java код с помощью утилиты aidl
9. .class файлы — это «выхлоп» javac — байткод для JVM. Так как Dalvik VM не может интерпретировать java bytecode, а использует свой велосипед под название dex bytecode, то на этом компиляция проекта не заканчивается.
Читайте также: Активатор windows 10 torrentino
10. dex компилятор (а точнее транслятор) — он транслирует .class файлы в classes.dex (Java bytecode в Dalvik bytecode). Описание .dex вы можете прочитать здесь source.android.com/tech/dalvik/dex-format.html.
Сам компилятор находится в папке platform-tools вашего Android SDK, запускать его можно через dx.bat (для Windows), при этом будет задействован dx.jar из папки platform-tools/lib
11. Сторонние библиотеки и .class файлы — это все то, что вы подключаете в проект как библиотеку или включаете в Build Path. Так как в качестве основного ЯП для Android выбрана Java, вы можете без проблем использовать практически любые java библиотеки, они просто будут обработаны dex компилятором.
12. classes.dex — в данный файл dex компилятор записывает весь исполняемый код вашего проекта.
Да-да, все будет в одном файле, хотя в документации написано, что файлов .dex может быть несколько, но на практике, я не встречал, чтобы .apk содержал .dex файлы кроме classes.dex, может в комментариях меня поправят.
13. Скомпилированные ресурсы — xml ресурсы приложения, скомпилированные в бинарное представление.
14. Другие ресурсы — это реально другие ресурсы, которые не обрабатываются aapt — например файлы, которые вы зачем то хотите засунуть в .apk, так же туда попадают файлы из .jar`ов, которые добавлены в Build Path, но не являются компилируемыми.
15. apkbuilder — утилита, которой на вход подают скомпилированные ресурсы (2, 13), classes.dex (12) и другие ресурсы (14), а она собирает из этого наш вожделенный .apk файл. Утилита лежит в папке tools вашего Android SDK
16. Собранное приложение в файл .apk — это архив, содержащий скомпилированные и нескомпилированные ресурсы, classes.dex, resources.arsc, META-INF, AndroidManifest.xml и т.д. Формат .apk это надстройка над .jar, а .jar — надстройка над zip, так что, .apk вы можете открыть zip архиватором, такая вот матрешка.
17. jarsigner — это Oracle`вская утилита для подписания .jar архивов. Он подписывает ваш .apk выбранным вами ключом.
Но не надо думать, что ваш .apk теперь защищен от декомпиляции, ничего подобного. В .apk только добавляется папка META-INF, в которой вы можете обнаружить публичную часть release (или debug) сертификата — файл CERT.RSA, а так же файл CERT.SF — который содержит контрольные суммы для всех файлов внутри .apk, кроме тех, что в папке META-INF
Еще немного важной информации о подписи приложения:В Android уникальным идентификатором приложения является имя пакета приложения, например ru.habrahabr.android. Но чтобы злоумышленник не смог подменить ваше установленное приложение на свое с таким же пакетом, Android выполняет проверку, на то чтобы новый .apk был подписан тем же сертификатом, что и уже установленный.
Кроме того, если у вас есть выложенное приложение в Google Play, вы не сможете обновить его, если новая версия подписана другим сертификатом! Так что советую забекапить сертификат, а так же не забыть пароль к нему. Иначе вы не сможете обновлять свои приложения.
Читайте также: Стандартным приложением windows предназначенным для воспроизведения цифрового мультимедиа является
18. Debug или Release хранилище ключей — хранилище из которого jarsigner возьмет ключи для подписи приложения. Если вы собираете Debug версию (для запуска на эмуляторе или подключенном устройстве), то .apk подписывается debug ключем, в Windows он находится в папке пользователя/.android/.
Кстати, приложение подписанное debug ключом нельзя установить без подключенного отладчика. Так что, если хотите отправить .apk друзьям на тестирование — подпишите его Release ключем
19. Подписанный .apk — .apk файл вашего приложения, в который добавлена информация о подписи (см. пункт 17).
20. zipalign — утилита, которая оптимизирует ваш .apk для более быстрого запуска и меньшего потребления ОЗУ при работе приложения. Она выравнивает содержимое .apk для более эффективной разархивации (подробнее здесь: http://developer.android.com/tools/help/zipalign.html).
Важное замечание: приложение надо сначала подписать, а затем применить zipalign, т.к. подпись — это добавление папки META-INF в архив, а это изменение архива, следовательно нарушение его оптимизации. То есть, если вы сначала примените zipalign, а потом измените архив — смысла в zipalign не будет. Насчет нарушения контрольных сумм, которые рассчитала утилита jarsign, бояться не стоит, т.к. zipalign делает оптимизации по выравниванию данных в архиве, все это происходит на уровне zip, сами данные не изменяются.
Хозяйке на заметку: во время сборки debug версии проекта zipalign не вызывается, скорее всего, чтобы вы не ждали выполнения еще и этой операции (спасибо и на этом).
21. Подписанный (и, возможно, выравненный) .apk — вожделенный .apk вашего приложения. Конец.
Я думаю, что теперь понятно, почему сборка и запуск Android приложения происходит так долго 🙂 Так что, советую поставить SSD, ну и процессор побыстрее и сэкономить себе нервы и время.
Немного полезного оффтопа:
1. Всегда используйте обфускацию вашего кода. Декомпилировать java приложение очень легко. Даже несмотря на то, что в .apk используется dex bytecode — его сначала транслируют обратно в java bytecode, а затем к нему применят обычные java декомпиляторы. Потратьте пару часов на выбор и настройку обфускатора, иначе можете просто выложить исходники проекта на гитхаб, секономите людям время, а может еще и пулл реквесты получите 🙂
2. Вы знали, что Android инстанциирует для каждого запущенного приложения отдельный экземпляр Dalvik VM? Это сделано для того, чтобы исключить ситуации, когда одно приложение валит Dalvik VM, а за ним тянет все другие запущенные приложения. Яркий пример подобного вмешательства — Facebook, они через reflection изменяют параметры Dalvik VM (не стоит так делать). Если бы Android использовал один инстанс Dalvik — это изменение затронуло бы все запущенные приложения.
3. Dalvik VM не является JVM, т.к. во-первых он не понимает java bytecode, а во-вторых не реализует спецификации для JVM, т.к. использует свой байт код. Так что, советую называть Dalvik VM именно Dalvik VM.
Надеюсь, вы не зря потратили свое время и узнали что-то новое.
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.
Вы когда нибудь хотели программировать на си/c++ на смартфоне или планшете? Я как только заполучил Android устройство сразу захотел иметь компилятор под рукой, чтобы можно было быстро что нибудь скомпилить или протестировать. Несмотря на отсутствие физической клавиатуры это удобно иметь возможность в нужный момент набросать программу вытянув телефон из кармана. В GooglePlay есть несколько компиляторов с графическим интерфейсом например C4Droid и даже полноценная среда разработки TerminalIDE, но хочется чего нибудь простого, такого как gcc в Linux. И это возможно. Установка gcc в Android вполне возможна если в вас есть рут права.
Можно конечно самому компилить gcc из исходников или скачать готовые файлы и закинуть их в /system/xbin но мы поступим по другому, воспользуемся пакетным менеджером BootBrew.
Установка BootBrew
Bootbrew можно скачать в GooglePlay или с форума 4pda. После установки запустите программу и Нажмите кнопку procced для загрузки данных и инициализации приложения:
После окончания инициализации можно приступать к установке GCC.
Установка gcc в Android
Сначала обновим список пакетов:
Затем останется найти gcc в списке пакетов и нажать кнопку install.
Если все прошло так то вы счастливчик. Но у многих и в том числе и у меня во время обновления списка пакетов возникает ошибка update failed. Как я понял это из-за того что программа работает не от суперпользователя и следовательно не имеет прав на запись необходимой информации. Поэтому тем кому не повезло для управления пакетами придется использовать консоль. И так откройте Terminal Emulator, только не говорите что у вас его еще нет 🙂 и набирайте следующие команды:
получаем права суперпользователя:
обновляем список пакетов:
Устанавливаем программу:
Вот и все, если надумаете удалить gcc наберите:
Посмотреть список всех доступных для установки пакетов можно командой:
Тестирование gcc
Наберите небольшую программу, например:
[sourcecode]
#include
int main (void) { printf («Hello, World!n»);getchar (); return 0; }
[/sourcecode]
Сохраните в файле с именем main.c и наберите для компиляции:
В Android можно выполнять только в определенных папках поэтому перемонтируйте /system/bin в режим чтения и скопируйте туда программу:
$ cp ./program /system/bin/
Дайте права на выполнение:
Выполните:
Работает!
Источник: losst.ru
Декомпиляция и Компиляция APK приложения Андроид. Для того чтобы редактировать APK приложения. Прежде всего их нужно декомпилировать, а после скомпилировать! Как это сделать и чем можно узнать в этом уроке.
В прошлом уроке вы узнали из чего состоят основные внутренности приложения, а также что данные что APK приложения (в дальнейшем просто APK) можно открыть архиватором, но что либо изменить у вас не получиться! Нужна Декомпиляция APK приложения Android!
Приступим!
Декомпиляция и Компиляция APK приложения Android — Необходимые компоненты
1. Java JDK — среда разработки;
2. ApkTool — программа декомпилятор;
3. — bat файл;
4. Sign Android — подпись приложения APK
Установка необходимых компонентов. Настройка Java
После установки Java JDK , необходимо,. Если кто не понял официальное куроводство то,
Скопируйте путь Java JDK:
Перейдите в меню Дополнительные настройки
(Мой) Компьютер ->Свойства системы->Дополнительные параметры системы->Дополнительно->Системные переменные->Правка
Java JDK настроена.
Настройка ApkTool
- Создать папку на диске C: и в нее переместить файлы apktool_x_x.jar и apktool.bat
- Файл apktool_x_x.jar переименовать в apktool.jar
Если появилось наподобие такой вывод информации, то все сделано правильно.
Декомпиляция APK
Чтобы декомпилировать приложение, скопируйте файл APK приложения в папку где находится apktool, далее необходимо выполнить вот что, в командной строке ввести команду:
apktool d название.apk
Например:
apktool d browser.apk
Декомпиляция APK завершена.
После того как вы отредактируете или русифицируете APK, его надо Компилировать
Компиляция APK
Вводим в командной строке:
apktool b имя_проекта
После чего перейдите в папку проекта ( в данном случае папка browser) и вы увидете две новые папки:
- build
- dist
В папке dist будет находится готовое приложение:
Если папки dist не обнаружили, значит apktool не смог собрать редактируемый проект, причиной тому может быть то, что измения которые вы вносили(«поломали») не позволяют собрать приложение apk.
После компиляции приложения apk его необходимо подписать.
{rutube}99d2d223b27515cdf3de2adfc3c47909{/rutube}
Подпись APK
1. Для этого Вам надо разархивировать архив Sign Android
2. Скопировать готовое приложение в папку с распакованным Sign Android
3. Потянуть приложение на файл Sign_APK.bat после чего приложение будет подписано
Готовое подписанное приложение будет носить название apk_signed.apk
Приложение подписано!
Работа с системными APK
Для того чтобы модифицировать системные приложения необходимо прежде всего необходимо скормить программе APKTOOL системный файл framework -res.apk который находиться в системном разделе Android:
/system/framework/framework -res.apk
Для того чтобы скормить Apktool данный файл необходимо, ввести команду:
apktool if framework -res.apk
Учитывайте что, команду нужно вводить относительно пути расположения, то есть если файл framework -res.apk находиться в папке C:primer, то команда будет выглядеть следующим обзором:
apktool if С:primerframework -res.apk
Также для того чтобы можно было модифицировать системные файлы прошивка должна быть вначале Deodex-ирована.
Теперь как это можно все упросить! (не использовать командную строку)
Скачайте приложение SmartApkTool, данное программа имеет графический интерфейс и очень легкая в использование.
Как пользоваться SmartApkTool
Прежде всего вам надо установить и настроить Java JDK и Apktool как указано выше.
Откройте программу SmartApkTool
Если Вам необходимо Декомпилировать приложение в SmartApkTool, то выберите данный пункт и необходимое приложение
Если компилировать, то
и выбрать файл в проекте apktool.yml
Для подписи приложения APK, нажать обзор, выбрать приложение и подписать
Все так легко и просто!
Альтернативный вариант
Для тех кому не понравился SmartApkTool, есть альтернатива Android MultiTool
26 Октября 2017
3 820
В первой части – введении, обсудим роль NDK и причины его использования для разработки под Android.
Android NDK.
Для разработки под Android, помимо SDK (Standart Development Kit) разработчику доступен инструмент под названием NDK (Native Development Kit), который позволяет использовать язык С++ для написания отдельных модулей приложения.
Архитектура ОС Android и роль NDK.
Операционную систему Android можно разделить на логические части – компоненты. На данный момент эти компоненты:
- Linux Kernel – ядро операционной системы Android
- Hardware Abstraction Level (HAL) – уровень, на котором реализуется интерфейс между hardware устройства и более высокими уровнями системы, такими как
- Native C/C++ Libraries – уровень библиотек Android, на котором, в частности, основывается компонент ART. Здесь расположены, например, библиотеки для работы с графикой и звуком.
- Android Runtime (ART) – среда исполнения байт-кода в операционной системе Android.
- Java API Framework – набор модулей и компонентов для реализации приложений в Android.
- System apps – приложения, написанные прикладными разработчиками.
Большинство приложений пишутся с использованием SDK. В этом случае код компилируется в специальный байт-код, который исполняется в ART. Такой подход позволяет не зависеть от архитектуры процессоров, на которых будет выполняться ваше приложение, однако это накладывает отпечаток на производительность и скорость выполнения кода. (Причины этого общедоступны, но это не тема данной статьи).
При использовании NDK, разработчику предоставляется возможность создавать и интегрировать в проект модули, написанные на С/С++, в том числе и ранее написанные библиотеки. При этом, код, написанный на С++, будет компилироваться в машинный код и исполняться нативно, т.е. в обход ART. Это позволяет увеличить производительность системы в тех ситуациях, где это является критичным, например при необходимости производить сложные расчеты, такие как в работе с графикой.
Необходимость использования NDK.
На данный момент, инструмент SDK предоставляет все необходимые средства для написания приложения под Android. В силу этого, нет никакой необходимости использовать С/С++ в повседневной работе. В большинстве случаев это не требуется, потому что при правильном подходе, производительности, которую обеспечивает ART будет достаточно. Однако его NDK незаменим в таких ситуациях как:
- Работа с графикой и звуком
- Использование сторонних библиотек
- Низкоуровневая разработка – все, что выходит за рамки ART
Заключение
В этой части статьи мы рассмотрели краткое описание сути NDK, его роли при разработке в Android и причин его использования. В следующей части, рассмотрим практический пример подключения и использования C/C++ в Android. До новых встреч!
—
Александр Чех
CTO MobileDev