Страницы

Поиск по вопросам

Показаны сообщения с ярлыком apk. Показать все сообщения
Показаны сообщения с ярлыком apk. Показать все сообщения

пятница, 14 февраля 2020 г.

Не отображается иконка приложения

#java #android #android_studio #icon #apk


указал в манифесте путь к новой иконке приложения:         android:icon="@drawable/icon"
Затем сгенерировал апк и установил на другое устройство, но там иконка не отображается.
Почему?

    


Ответы

Ответ 1



В AndroidManifest.xml уберите атрибут android:roundIcon="...". Она используется для устройств Андроид 8.+ В создании иконки через New=>ImageAsset она называется Adaptive. Обычная (для всех устройств) - Legacy. Можно отключить там.

Ответ 2



1)Убедитесь что ваша иконка формата .png 2)Проверьте что ваша иконка располагается по пути drawable/icon.png 3)Сделайте очистку и пересбро делается это так В Android Studio наверху на панельку жмете Build ->Clean Project после очистки делаете пересбор Build->Rebuild Project

Ответ 3



Для иконок приложения существуют папки mipmap android:icon="@mipmap/ic_launcher" Поместите вашу иконку в эту папку, и проверьте. Или сделайте лучше так: Кликните на папку Res правой кнопкой мыши New/ImageAsset затем в поле IconType выберите LauncherIcons. Ниже, где поле Path укажите путь к вашей картинке, Android Studio сама сгенерирует нужные папки и нужные размеры иконки.

воскресенье, 2 февраля 2020 г.

Как писать простенькие приложения для Android, используя яп Python? [закрыт]

#android #python #apk


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Тратить огромное кол-во времени на изучение java, для написания простеньких бот-программ
считаю не лучшим решением
    


Ответы

Ответ 1



Python-for-android Прежде всего давайте посмотрим на то, с помощью чего Python получает возможность работать под Android — инструмент, названный, как ни странно, python-for-android. Его основная функция состоит в том, чтобы создать дистрибутив — папку проекта, содержащую все необходимое для запуска вашего приложения. А точнее, сам интерпретатор, Kivy и библиотеки, от которых он зависит: Pygame, SDL и несколько других. Также дистрибутив включает в себя загрузчик Java, отображающий OpenGL и выступающий в качестве посредника между Kivy и операционной системой. Затем вы добавляете ко всему этому свои скрипты, настройки вроде иконки и имени, компилируете с помощью Android NDK и вуаля — APK с вашим приложением готов! И это всего лишь базовая процедура, на самом деле сгенерированный пакетный файл может включать (и включает) в себя гораздо больше. Вместе со всем прочим в APK вшивается большая часть стандартной библиотеки, а любой сторонний модуль, написанный на Python, может быть легко добавлен — все так же, как и при разработке десктоп-приложений. Добавка модулей с компилируемыми компонентами тоже не вызывает трудностей, необходимо лишь указать, как их нужно собирать. Как правило, это не представляет собой ничего сложного, достаточно лишь поставить пару галочек перед запуском процедуры сборки, хотя в редких отдельных случаях могут понадобиться дополнительные действия. Python-for-android уже включает в себя указания для компиляции таких популярных модулей, как: numpy, sqlite3, twisted и даже django! Вышеописанные принципы лишь в общих словах объясняют, как работает python-for-android. В любой момент вы можете получить больше информации на данную тему, заглянув в документацию Kivy. Я рекомендую вам Buildozer — надстройку для python-for-android, предоставляющую собой удобный интерфейс и автоматическое разрешение некоторых зависимостей. Мы стараемся сделать так, чтобы написанная выше цепочка действий использовалась не только в Kivy, но и в других проектах. Основной процесс сборки останется таким же, но нужда в загрузчике Java отпадет, так как он необходим только для поддержки некоторых специфичных нужд фреймворка. Обращение к Android API с помощью PyJNIus Взаимодействие с Android API: получение информации с сенсоров, создание уведомлений, вибрация, пауза и перезапуск, да что угодно — важная часть вашего приложения. Kivy за вас позаботится об основном, но многими вещами вы захотите управлять сами. Для этого создан PyJNIus — инструмент, автоматически оборачивающий код на Java в интерфейс Python. В качестве простого примера приведем программу, которая заставит телефон вибрировать на протяжении 10 секунд: from jnius import autoclass # Для начала нам нужна ссылка на Java Activity, в которой # запущено приложение, она хранится в загрузчике Kivy PythonActivity PythonActivity = autoclass('org.renpy.android.PythonActivity') activity = PythonActivity.mActivity Context = autoclass('android.content.Context') vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE) vibrator.vibrate(10000) # аргумент указывается в миллисекундах Если вы знакомы с Android API, то без труда заметите, что код выше очень похож на аналогичный на Java — PyJNIus просто позволяет нам обращаться к тому же API, но прямо из Python. Большая часть Android API может быть вызвана подобным образом, что позволяет достичь того же функционала, что и при разработке на Java. Главный минус PyJNIus в том, что он требует неплохого понимания структуры Android API, а код выходит громоздким, хотя его эквивалент на Java выглядит точно так же. Для решения этой проблемы Kivy включает в себя Plyer. Plyer: кроссплатформенное API для платформоспецифичных задач Проект Plyer ставит себе цель создать простой «питоничный» интерфейс для функций, которые присутствуют на большинстве платформ. Например, код выше легким движением руки превращается в… from plyer.vibrator import vibrate vibrate(10) # В Plyer аргументы указываются в секундах Более того, написанный код попытается выполнить свою задачу на всех поддерживаемых Plyer платформах — на данный момент это: Android, iOS, Linux, Windows и OS X (для iOS также существует аналог PyJNIus, называемая PyOBJus). На самом деле, вибрация — не самый лучший пример, потому что сейчас она реализована только для Android, но такие функции как проверка уровня заряда батареи: from plyer import battery; print(battery.status) или text-to-speech: from plyer import tts; tts.speak('hello world') — работают как в десктопных, так и в мобильных приложениях, а получение данных с компаса/гироскопа и отправка SMS без проблем реализуются на Android и iOS. Plyer находится на начальной стадии развития, так что любая помощь в разработке приветствуется. Также, мы участвуем с ним в Google Summer of Code в этом году. Не только ради Kivy Все вышеперечисленные инструменты были разработаны для нашего фреймворка, но на самом деле они больше предназначены для разработки под Python в целом. В Plyer мы специально избегаем какой-либо зависимости от Kivy, а PyJNIus нужен лишь для доступа к Android JNI. Искренне надеемся, что эти инструменты станут полезны для любого, кто пишет на Python под Android. Вы уже можете попробовать PyJNIus, используя QPython. Python-for-android больше завязан на взаимодействии с Kivy, но мы будем рады обсудить этот вопрос. Многое можно реализовать при разработке на Android с помощью Python, несмотря на все различия с Java, которая предназначена для этого, но эти возможности могут быть расширены еще больше в ближайшем будущем. И если вы заинтересовались описанными выше проектами, то самое время присоединиться к нашей команде! Оригинальная статья "Kivy Planet" Русский источник "Как разрабатывать на Python под Android"

пятница, 24 января 2020 г.

Ошибка при создании signed apk: please specify destination folder for the signed apk

#android #android_studio #apk


Всё прекрасно работало, пока студия не скачала себе обновления. Теперь выходит вот
такая фигня:



Что ему надо?
    


Ответы

Ответ 1



Ответ нашел здесь [Cannot compile a signed APK in Android Studio 3.3][1] Независимо от того, хотите ли вы APK или пакет, выберите Bundle Даже если не требуется, установите флажок «Экспортировать зашифрованный ключ для регистрации опубликованных приложений». Выберите любой файл Нажмите Далее (это будет работать) Дважды нажмите назад, выберите, если APK / Bundle, затем на следующей странице нет необходимости устанавливать флажок «Экспорт (…)», если не требуется.    [1]: https://stackoverflow.com/questions/54196270/cannot-compile-a-signed-apk-in-android-studio-3-3

среда, 25 декабря 2019 г.

сборка предустановленного приложения

#android #сборка #build #apk


Существует ли разница между сборкой предустановленного приложения и сборкой стороннего
приложения? Отличается .apk-файлы первой от второй? Если есть разница, то в чем она?
Какие требования предъявляются? 
    


Ответы

Ответ 1



Не совсем уверен, что понимаю о чем идет речь, попробую ответить в меру своего понимания. У каждого вендора (то бишь производителя) телефонов (по крайней мере у серьезных вендоров) имеется свои системные сертификаты, которым их версия оси/оболочки безусловно доверяет, соответственно приложения подписанные такими сертификатами имеют доступ к пермишенам/API недоступным простым смертным. Здесь обсуждается способы хакинга подписи системными ключами. Ни разу не уверен, что все это работает, ибо чукча не хакер, а простой девелопер. Возвращаясь к вашему вопросу: Хочу узнать, могу отправить эту же сборку, или надо для производителя делать какую-то другую, отличную от моей? Сборка наверное должна быть другая, поскольку в любом случае отличается манифест, наличием атрибута: android:sharedUserId="android.uid.system" Но этот атрибут не будет активирован пока не появится подпись вендора под ним. Технически APK можно подписать несколькими ключами, но проблема в том, что маркет не понимает приложения с несколькими подписями. Так что вам как то надо будет договориться с вендором, чтобы они подписали ваш калькулятор своей подписью - иначе не взлетит. Как вариант им можно послать неподписанный APK, они сами и подпишут его.

вторник, 10 декабря 2019 г.

Есть ли защита от декомпиляции андроид-приложения?

#android #apk #декомпиляция


Существует множество прогамм-декомпиляторов, которые моментально из апк создают папки
с исходным джава-кодом. Но есть приложения, которые не декомпилируются,
значит защита есть.
Как можно реализовать защиту от декомпиляции андроид-приложения?
Нигде не дано нормального ответа!Только ссылки на общую документацию.
    


Ответы

Ответ 1



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

четверг, 5 декабря 2019 г.

Из чего складывается общий размер установленного Android приложения?

#java #android #memory #apk


У меня есть .apk установочник который занимает 3,8 Мб памяти. При установке в телефон
приложение занимает 32,4 Мб (если использовать ProGuard то размер уменьшается до 20,4
Мб, но это все равно много). Картинки из интернета или других мест не загружаю. Программа
выполняет различные математические преобразования над величинами. Папка с ресурсами
(src) проекта весит всего 524 Кб, папка с java кодом занимает 200 Кб. Почему после
установки приложение занимает так много места на телефоне? Как определить что именно
в проекте может занимать столько места? Спасибо за ответ.
    


Ответы

Ответ 1



APK по сути является ZIP-архивом, то есть, файлы в нем уже подвержены некоторому сжатию. Когда APK устанавливается на телефон, он сохраняется в каталог /data/app/, что занимает как раз те пресловутые 3.8 мб. Из APK извлекается файл classes.dex (с байткодом). Он преобразуется в платформенную библиотеку для выполнения кода на процессоре телефона. Откомпилированная после первого запуска приложения библиотека находится в /data/dalvik-cache. Именно она и занимает большую часть объема (как правило, она минимум в два раза больше APK). Зачем все это делается? Для скорости работы приложения. Таким образом не приходится компилировать все байткоды, а также запускать исполнительную среду Java при каждом запуске приложения. P.S: в качестве развлечения можете взять практически любую APK и сравнить ее объем с размером итогового приложения, они гарантированно будут сильно отличаться.

вторник, 11 июня 2019 г.

Android Studio App

Всем привет. Написал я в общем программу(простенький мессенджер). Запустил на эмуляторе все норм, работает(версия на эмуляторе 7.1.1). Решил я про тестить на своем андроиде(версия андроида 6.0.1) ничего не работает, вылетает программа и пишет Unfortunately app has stopped. Заходил я такое на андроид монитор смотрел ошибки, все чисто никаких ошибок. Пытался я менять sdk версию в build.gradle но это не помогает все тоже самое. Устанавливал я apk-debug на свой андроид для тестирования. Как мне это исправить? За ранее спасибо.
Вот мой build.gradle:
apply plugin: 'com.android.application'
android { compileSdkVersion 26 buildToolsVersion '26.0.2' defaultConfig { applicationId "com.example.lado.chatapp" minSdkVersion 21 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets{ main{ jniLibs.srcDirs = ['libs'] } } packagingOptions { exclude 'META-INF/DEPENDENCIES.txt' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/notice.txt' exclude 'META-INF/license.txt' exclude 'META-INF/dependencies.txt' exclude 'META-INF/LGPL2.1' } }
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.+' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.google.firebase:firebase-messaging:10.0.1' compile 'com.android.volley:volley:1.0.0' compile 'com.google.firebase:firebase-database:10.0.1' compile 'com.google.firebase:firebase-auth:10.0.1' compile 'com.firebase:firebase-client-android:2.5.2' compile 'com.google.firebase:firebase-storage:10.0.1'
compile 'com.github.liuguangqiang.swipeback:library:1.0.2@aar' testCompile 'junit:junit:4.12' }
apply plugin: 'com.google.gms.google-services'


Ответ

Все заработало. Что бы такой проблемы не было нужно зайти File -> Settings -> Build,Execution,Deployment ->Instant Run -> uncheck "Enable instant run". Просто отключить Instant Run.

суббота, 8 июня 2019 г.

Не отображается иконка приложения

указал в манифесте путь к новой иконке приложения: android:icon="@drawable/icon" Затем сгенерировал апк и установил на другое устройство, но там иконка не отображается. Почему?


Ответ

В AndroidManifest.xml уберите атрибут android:roundIcon="...". Она используется для устройств Андроид 8.+
В создании иконки через New=>ImageAsset она называется Adaptive. Обычная (для всех устройств) - Legacy. Можно отключить там.

пятница, 5 апреля 2019 г.

Как писать простенькие приложения для Android, используя яп Python? [закрыт]

Тратить огромное кол-во времени на изучение java, для написания простеньких бот-программ считаю не лучшим решением


Ответ

Python-for-android Прежде всего давайте посмотрим на то, с помощью чего Python получает возможность работать под Android — инструмент, названный, как ни странно, python-for-android. Его основная функция состоит в том, чтобы создать дистрибутив — папку проекта, содержащую все необходимое для запуска вашего приложения. А точнее, сам интерпретатор, Kivy и библиотеки, от которых он зависит: Pygame, SDL и несколько других. Также дистрибутив включает в себя загрузчик Java, отображающий OpenGL и выступающий в качестве посредника между Kivy и операционной системой. Затем вы добавляете ко всему этому свои скрипты, настройки вроде иконки и имени, компилируете с помощью Android NDK и вуаля — APK с вашим приложением готов!
И это всего лишь базовая процедура, на самом деле сгенерированный пакетный файл может включать (и включает) в себя гораздо больше. Вместе со всем прочим в APK вшивается большая часть стандартной библиотеки, а любой сторонний модуль, написанный на Python, может быть легко добавлен — все так же, как и при разработке десктоп-приложений. Добавка модулей с компилируемыми компонентами тоже не вызывает трудностей, необходимо лишь указать, как их нужно собирать. Как правило, это не представляет собой ничего сложного, достаточно лишь поставить пару галочек перед запуском процедуры сборки, хотя в редких отдельных случаях могут понадобиться дополнительные действия. Python-for-android уже включает в себя указания для компиляции таких популярных модулей, как: numpy, sqlite3, twisted и даже django!
Вышеописанные принципы лишь в общих словах объясняют, как работает python-for-android. В любой момент вы можете получить больше информации на данную тему, заглянув в документацию Kivy. Я рекомендую вам Buildozer — надстройку для python-for-android, предоставляющую собой удобный интерфейс и автоматическое разрешение некоторых зависимостей. Мы стараемся сделать так, чтобы написанная выше цепочка действий использовалась не только в Kivy, но и в других проектах. Основной процесс сборки останется таким же, но нужда в загрузчике Java отпадет, так как он необходим только для поддержки некоторых специфичных нужд фреймворка.
Обращение к Android API с помощью PyJNIus Взаимодействие с Android API: получение информации с сенсоров, создание уведомлений, вибрация, пауза и перезапуск, да что угодно — важная часть вашего приложения. Kivy за вас позаботится об основном, но многими вещами вы захотите управлять сами. Для этого создан PyJNIus — инструмент, автоматически оборачивающий код на Java в интерфейс Python.
В качестве простого примера приведем программу, которая заставит телефон вибрировать на протяжении 10 секунд:
from jnius import autoclass # Для начала нам нужна ссылка на Java Activity, в которой # запущено приложение, она хранится в загрузчике Kivy PythonActivity PythonActivity = autoclass('org.renpy.android.PythonActivity') activity = PythonActivity.mActivity Context = autoclass('android.content.Context') vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE) vibrator.vibrate(10000) # аргумент указывается в миллисекундах
Если вы знакомы с Android API, то без труда заметите, что код выше очень похож на аналогичный на Java — PyJNIus просто позволяет нам обращаться к тому же API, но прямо из Python. Большая часть Android API может быть вызвана подобным образом, что позволяет достичь того же функционала, что и при разработке на Java.
Главный минус PyJNIus в том, что он требует неплохого понимания структуры Android API, а код выходит громоздким, хотя его эквивалент на Java выглядит точно так же. Для решения этой проблемы Kivy включает в себя Plyer.
Plyer: кроссплатформенное API для платформоспецифичных задач Проект Plyer ставит себе цель создать простой «питоничный» интерфейс для функций, которые присутствуют на большинстве платформ. Например, код выше легким движением руки превращается в…
from plyer.vibrator import vibrate vibrate(10) # В Plyer аргументы указываются в секундах
Более того, написанный код попытается выполнить свою задачу на всех поддерживаемых Plyer платформах — на данный момент это: Android, iOS, Linux, Windows и OS X (для iOS также существует аналог PyJNIus, называемая PyOBJus). На самом деле, вибрация — не самый лучший пример, потому что сейчас она реализована только для Android, но такие функции как проверка уровня заряда батареи:
from plyer import battery; print(battery.status)
или text-to-speech:
from plyer import tts; tts.speak('hello world')
— работают как в десктопных, так и в мобильных приложениях, а получение данных с компаса/гироскопа и отправка SMS без проблем реализуются на Android и iOS.
Plyer находится на начальной стадии развития, так что любая помощь в разработке приветствуется. Также, мы участвуем с ним в Google Summer of Code в этом году.
Не только ради Kivy Все вышеперечисленные инструменты были разработаны для нашего фреймворка, но на самом деле они больше предназначены для разработки под Python в целом. В Plyer мы специально избегаем какой-либо зависимости от Kivy, а PyJNIus нужен лишь для доступа к Android JNI. Искренне надеемся, что эти инструменты станут полезны для любого, кто пишет на Python под Android. Вы уже можете попробовать PyJNIus, используя QPython. Python-for-android больше завязан на взаимодействии с Kivy, но мы будем рады обсудить этот вопрос.
Многое можно реализовать при разработке на Android с помощью Python, несмотря на все различия с Java, которая предназначена для этого, но эти возможности могут быть расширены еще больше в ближайшем будущем. И если вы заинтересовались описанными выше проектами, то самое время присоединиться к нашей команде!
Оригинальная статья "Kivy Planet" Русский источник "Как разрабатывать на Python под Android"

среда, 28 ноября 2018 г.

сборка предустановленного приложения

Существует ли разница между сборкой предустановленного приложения и сборкой стороннего приложения? Отличается .apk-файлы первой от второй? Если есть разница, то в чем она? Какие требования предъявляются?


Ответ

Не совсем уверен, что понимаю о чем идет речь, попробую ответить в меру своего понимания.
У каждого вендора (то бишь производителя) телефонов (по крайней мере у серьезных вендоров) имеется свои системные сертификаты, которым их версия оси/оболочки безусловно доверяет, соответственно приложения подписанные такими сертификатами имеют доступ к пермишенам/API недоступным простым смертным.
Здесь обсуждается способы хакинга подписи системными ключами. Ни разу не уверен, что все это работает, ибо чукча не хакер, а простой девелопер.
Возвращаясь к вашему вопросу:
Хочу узнать, могу отправить эту же сборку, или надо для производителя делать какую-то другую, отличную от моей?
Сборка наверное должна быть другая, поскольку в любом случае отличается манифест, наличием атрибута:
android:sharedUserId="android.uid.system"
Но этот атрибут не будет активирован пока не появится подпись вендора под ним. Технически APK можно подписать несколькими ключами, но проблема в том, что маркет не понимает приложения с несколькими подписями. Так что вам как то надо будет договориться с вендором, чтобы они подписали ваш калькулятор своей подписью - иначе не взлетит. Как вариант им можно послать неподписанный APK, они сами и подпишут его.

понедельник, 15 октября 2018 г.

Есть ли защита от декомпиляции андроид-приложения?

Существует множество прогамм-декомпиляторов, которые моментально из апк создают папки с исходным джава-кодом. Но есть приложения, которые не декомпилируются, значит защита есть. Как можно реализовать защиту от декомпиляции андроид-приложения? Нигде не дано нормального ответа!Только ссылки на общую документацию.


Ответ

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

четверг, 11 октября 2018 г.

Из чего складывается общий размер установленного Android приложения?

У меня есть .apk установочник который занимает 3,8 Мб памяти. При установке в телефон приложение занимает 32,4 Мб (если использовать ProGuard то размер уменьшается до 20,4 Мб, но это все равно много). Картинки из интернета или других мест не загружаю. Программа выполняет различные математические преобразования над величинами. Папка с ресурсами (src) проекта весит всего 524 Кб, папка с java кодом занимает 200 Кб. Почему после установки приложение занимает так много места на телефоне? Как определить что именно в проекте может занимать столько места? Спасибо за ответ.


Ответ

APK по сути является ZIP-архивом, то есть, файлы в нем уже подвержены некоторому сжатию. Когда APK устанавливается на телефон, он сохраняется в каталог /data/app/, что занимает как раз те пресловутые 3.8 мб. Из APK извлекается файл classes.dex (с байткодом). Он преобразуется в платформенную библиотеку для выполнения кода на процессоре телефона. Откомпилированная после первого запуска приложения библиотека находится в /data/dalvik-cache. Именно она и занимает большую часть объема (как правило, она минимум в два раза больше APK).
Зачем все это делается? Для скорости работы приложения. Таким образом не приходится компилировать все байткоды, а также запускать исполнительную среду Java при каждом запуске приложения.
P.S: в качестве развлечения можете взять практически любую APK и сравнить ее объем с размером итогового приложения, они гарантированно будут сильно отличаться.

четверг, 4 октября 2018 г.

Непонятный smali

Я начинающий декомпилятор андроид приложений. Появилась нужда кое-что поменять в алгоритмах работы официального приложения ВКонтакте: чтобы перед входом выполнялось сохранение введенного логина и пароля в локальную базу данных, а также замена EditText на AutoCompleteTextView, для автозаполнения данных. Дело в том, что страничек у меня несколько и не очень-то удобно каждый раз вводить разные данные для входа. Затем, чтобы данные не сохранялись по умолчанию, нужно будет добавить CheckBox "сохранить пароль". В результате это будет очень удобно, а главное - отличное начало в практике декомпиляции и модификации. У меня есть ноутбук на Windows и рутованный android с деодексированной прошивкой. Скачал apktool и ввожу команду
apktool d apks\vk.apk
Где vk.apk - нетронутый APK, в папке apks. После завершения процесса я получаю папку vk с декомпилированным содержимым. С радостью и азартом открываю ее, ищу файлы .class - их нет. Зато есть некая папка с файлами .smali. Погуглив, понимаю что до чистого java кода добраться сложно и даже, если все получится, то высока вероятность получить ошибку при обратной компиляции. Поэтому, я отказался от dex2jar и решил учить smali следующим образом:
1) В студии делаю простенькие приложения с наипростейшим java кодом активности
2) Декомпилирую его
3) Сравниваю java код со smali
Так и учусь потихоньку. Единственное, что мне непонятно, это move-object и всякие другие коды этого типа, а также эти v1, v2, v3, v4, v5 и т.д. Особого внимания им не предал, поэтому решил просто, для начала создать класс враппер для работы с базой данных на java, декомпилировать его в smali и просто скопировать его в smali/com/vkontakte/android поменяв ссылки типа Lcom... на свои. Компилирую обратно:
apktool b vk -o vk-mod.apk
Где vk - папка для компиляции, vk-mod.apk - новый apk. Переношу на телефон, подписываю Zip Signer-ом, удаляю старую версию, устанавливаются мод, запускаю, вхожу в аккаунт. Так как я не добавил никакого кода для добавления записей в БД (метод insert), то база данных должна быть, но просто пустая. Запускаю Root Explorer, перехожу в /data/data/com.vkontakte.andtoid/databases и моей save.bd нету. Вообще. Проверяю, а вдруг база данных создаётся после вставки первой записи? Нет, она создаётся сразу при первом запуске, проверяю код smali, все верно, в чем проблема-то? Ладно, думаю дальше - может я не туда кинул smali? Нет, все верно. Подумал, наверно сделаю всё-таки вставку данных при нажатии на кнопку. В smali я полный ноль, поэтому пришлось немного подумать, чтобы найти куда рыть:
1) Ищу xml с этими двумя EditText-ами и кнопкой входа - auth.xml
2) Записываю имя xml и id полей логина и пароля, а также кнопки
3) Ищу идентификаторы в 16-ричном формате в R$id.smali и R$layout.smali
4) Делаю поиск с помощью Total Commander по всей папке smali, задав в ключевых словах сначала идентификатор xml, затем id тех самых view-элементов.
5) Смотрю на код AuthActivity.smali и туплю
Вроде, бы знакомые методы - getText(), toString(), find iewById(), затем передаются в лямбду логин и пароль, запускается ProgressDialog. Понимаю, что мне нужно "перехватить" логин и пароль при нажатии на кнопку сразу, до кода отправки их в процесс самого входа. Опять туплю. v16, p34 и всякие invoke-direct мозолят глаза, написал на java код для getWritableDatabase, ContentValues, методы put и конечный insert. Тестирую - работает. Декомпилирую его, узнаю как это будет в smali и вставляю в AuthActivity, примерно на место. Не знаю никакого нормального менеджера для редактирования, поиска и ковыряния в smali, поэтому все выполняю в блокноте, прошу не критиковать, я не знаю как это можно делать по-другому. В итоге, на этапе компиляции classes.dex вылазиют ошибки :( Сдался... Но ненадолго: на 4pda нашёл отличную тему, называется Инструкции по редактированию системных ресурсов, где профессионалы выкладывают инструкции типа "добавление кнопки сделать скриншот в шторке". Сравнивая коды, я начал получать хоть какие-то основы в smali кодинге, но вот никак и не пойму ничего. Народ, прошу вас, объясните мне конкретно максимально все базовые понятия о smali, так как в интернете я нашёл только информацию на английском, трудно и непонятно. И ещё - есть ли среда для редактирования smali, чтобы не ломать мозг в блокноте, без подсветки синтаксиса и всяких предупреждений об ошибках? И последнее - я правильно делаю все с R.smali, поиском идентификаторов? Оцените мой алгоритм, и помогите освоить smali. Очень надо. В будущем может создам сайт, группу в социальных сетях или даже приложение. Жду вразумительных ответов :)


Ответ

Smali схож с Java-байт-кодом, его знание может помочь. Но, так как в процессорах ARM-архитектуры много регистров, Google решили сэкономить и заменить долгие прогулки в память (в стек, как в JVM) на быстрые походы в регистры. Поэтому основное отличие байт-кода Dalvik от байт-кода JVM — ориентированность на регистры.
Например, System.out.println("Hello") в JVM-байт-коде выглядит приблизительно так:
getstatic System.out // PrintWriter на стеке ldc "Hello" // PrintWriter, "Hello" — два объекта на стеке invokevirtual PrintWriter.println(String):void // оба объекта забираются со стека // на PrintWriter выполняется виртуальный метод с параметром "Hello"
В Dalvik-байт-коде:
sget-object v0, System.out // PrintWriter в нулевом регистре const-string v1, "Hello" // "Hello" в первом регистре invoke-virtual PrintWriter.println(String):void, v0, v1 // вызвать виртуальный метод println на объекте v0 с параметром v1
Собственно, move-object перекладывает объект из регистра в регистр, а все эти v0, v1 и так далее — и есть регистры (value registers).
Кроме них есть ещё parameter registers — p0, p1 и т. д.. В этих регистрах оказываются значения, переданные в метод как параметры. Если метод не статический, то в p0 будет находиться this
invoke-direct напоминает invokespecial в JVM — он вызывает не виртуальный не статический метод. Примером могут служить финальные (и/или приватные) instance-методы.
Кроме того, в smali (в отличие от .class) нет пула констант, они задаются прямо в коде (см. fill-array-data-payload, const-string). Это связано с тем, что на все классы, находящиеся в одном dex, есть только один общий пул констант — это уменьшает объём по сравнению с .class и экономит время, потраченное на интернирование строк при загрузке классов.
Официальная документация с кратким, но понятным описанием опкодов: https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
Практический пример взлома приложения: https://habrahabr.ru/post/141522/
Плагин к IDEA / Android Studio для smali: https://github.com/JesusFreke/smali/wiki/smalidea
P. S. в таких низкоуровневых вещах очень помогает знание того, как работает каждая малейшая деталь кода. Такое понимание характерно для опытного программиста. И к таким вещам можно вернуться через некоторый промежуток времени, посмотреть свежим взглядом и понять больше, чем раньше.
P. P. S. Непосредственно на тему ВКонтакте. Есть пара мыслей, готов поделиться в личку, если оставишь свои контакты (электропочту, например).