Gradle
Gradle — система автоматической сборки, построенная на принципах Apache Ant и Apache Maven. В Eclipse использовалась система Ant, но большинство разработчиков даже не замечало её работы. В основном возможности системы использовались в конторах для автоматизации различных задач. В Android Studio такой номер не пройдёт. Gradle сопровождает вас во время разработки постоянно. Поначалу, если вы перешли с Eclipse, Gradle сильно раздражает своими действиями. Но позже вы оцените её удобство и может даже полюбите её.
Gradle не является изобретением для Android Studio, система была разработана раньше и использовалась в приложениях для Java, Scala и других языках.
Система сборки Gradle очень мощная и сложная, чтобы о ней рассказать в двух словах. Есть целые книги о ней. Сами команды в Gradle представляют собой обычный текст с использованием синтаксиса Groove для конфигурации. Но нам не нужно знать всё. Познакомимся поближе с системой и научимся пользоваться ей.
Создайте новый проект или откройте любой существующий проект из Android Studio и посмотрите на структуру проекта.
В последних версиях студии файлы Gradle выделили в отдельную папку Gradle Script. Раскройте её. В основном вас должен интересовать файл build.gradle, который относится к модулю. Рядом с этим файлом в скобках будет написано Module: app. Двойным щелчком откройте его, вы увидите, что файл является текстовым.
Также есть файл build.gradle, который относится к проекту. Но с ним работают реже. Так находятся настройки для репозиториев и самого Gradle.
Вернёмся к файлу модуля, вы увидите много интересной информации. Например, вы там можете увидеть настройки, которые раньше вы могли видеть в манифесте — номера версий, номера SDK и так далее. Забегая вперёд, скажу, что здесь можно добавить всего одну волшебную строчку и нужная библиотека сама скачается из интернета и установится в проекте. Красота!
Однако вернёмся в корневую папку. Кроме файлов build.gradle мы можем заметить файлы gradle.properties, settings.gradle и другие. Трогать их не нужно.
В корневой папке также есть файлы gradlew и gradlew.bat для работы с Gradle Wrapper. В принципе вам не нужно знать о них ничего. Но для параноиков есть информация — если вы часто импортируете проекты из неизвестных источников, то они содержат файл gradle/wrapper/gradle-wrapper.properties. Откройте его текстовым редактором и посмотрите на адрес у distributionUrl. Путь должен вести на официальный сай //services.gradle.org или на внутренний корпоративный сервер. Другие адреса должны вызвать тревогу.
Вы могли заметить, что по сравнению с Eclipse изменилась структура файлов. В папке app находится папка src, а ней папка main, в которых папки java, res и файл манифеста. Новая структура лучше отвечает требованиям Gradle для управления файлами.
Вы, например, можете создавать альтернативные папки с ресурсами и с помощью build.gradle подключить их к проекту.
android < compileSdkVersion 20 buildToolsVersion "20.0.0" defaultConfig < applicationId "ru.alexanderklimov.hellokitty" minSdkVersion 16 targetSdkVersion 20 versionCode 1 versionName "1.0" >sourceSets < main < res < srcDirs = [ 'src/main/res', 'src/main/presentations/animations', 'src/main/presentations/layouts'] >> > >
В этом примере мы указали, что существуют новая папка presentations в папке /src/main/ наряду с существующими папками java и res. Внутри созданной папки есть ещё две папки layout и animations, которые содержат файлы ресурсов.
Только помните, что вам нужно избегать конфликта имён при слиянии всех файлов при сборке.
Значение sourceSets указывает Gradle, какие папки следует использовать. Этим приёмом пользуются продвинутые программисты. Мы пока не будем использовать такую технику.
Другая полезная возможность — создавать разные версии приложений, например, демо-версию и платную версию. Немного об этом рассказано здесь.
Номер версии приложения и требования к версии Android прописаны в секции defaultConfig. Если у вас сохранились старые версии приложений, то в манифесте можете удалить данные записи. По-моему, там даже выводится соответствующая подсказка. Даже если вы эти данные в манифесте не удалите, то значения из gradle.build имеют больший приоритет и перепишут значения в манифесте при не совпадении.
defaultConfig
Подключение библиотеки происходит одной строчкой. Например, нужно добавить библиотеку Picasso:
dependencies
В Android Studio 3.0 используется новая версия Gradle, в которой compile считается устаревшей. Вместо него следует использовать новое слово implementation.
implementation 'com.android.support:recyclerview-v7:27.0.0'
Есть похожая команда, которая подключает библиотеку, которая будет использоваться только для отладки приложения и в релизной версии она не нужна.
debugCompile 'junit:junit:4.12' // старый вариант testImplementation 'junit:junit:4.12' // новый вариант для Android Studio 3.0
Далее включаете синхронизацию и через несколько секунд в папке появляется нужная библиотека, готовая к использованию. Сама библиотека скачивается с специального хранилища-репозитория JCenter. Данный репозиторий используется по умолчанию и прописан в buil.gradle проекта.
repositories
Можно указать другой репозиторий, например, Maven Central.
repositories
Для поиска через Maven-репозиторий используйте The Central Repository Search Engine.
Библиотеку можно подключать и старым способом, используя jar-файл, но такой способ уходит в прошлое.
dependencies < compile files("libs/library1.jar", "libs/library2.jar") >
Сам файл нужно скопировать в папку /libs.
При любом изменении файла недостаточно его сохранить. Нужно также произвести синхронизацию. Наверху обычно появляется жёлтая полоска с ссылкой Sync Now.
Задаём имя APK при компиляции
Можно задать собственное имя при компиляции проекта. Например, так.
defaultConfig
Получим имя MyName-1.0.12-release.apk
Оптимизатор кода R8
Оптимизатор кода R8 имеет следующие возможности: урезание байт-кода, сжатие, обфускация, оптимизация, удаление «синтаксического сахара», преобразование в DEX. Оптимизатор может производить все операции за один шаг, что даёт сильное улучшение производительности. R8 был введён в Android Gradle plugin 3.3.0. Вам нужно только включить его.
android < buildTypes < release < minifyEnabled true > > >
R8 разработан для работы с существующими ProGuard-правилами, хотя возможны ситуации, когда нужно переработать правила.
#отключение R8 только для Android Library модулей android.enableR8.libraries = false #отключение R8 для всех модулей android.enableR8 = false
Сжимаем итоговый APK
В Gradle 1.4 появилась возможность сжать итоговый файл, убрав неиспользуемые ресурсы, в том числе из библиотек, например, Google Play Services.
buildTypes
Во время сборки приложения вы можете увидеть строку:
:android:shrinkDebugResources Removed unused resources: Binary resource data reduced from 2570KB to 1711KB: Removed 33% .
Другой способ убрать неиспользуемые ресурсы конфигурации. Например, вам не нужные локализованные ресурсы для всех языков, которые входят в библиотеку Google Play Services или Android Support Library и др. Оставим только нужные языки. Возможно, вы также не хотите поддерживать mdpi или tvdpi-разрешения в своём приложении. Мы можем установить языки и разрешения, которые используются в приложении, остальные будут исключены, что позволит уменьшить вес приложения.
// build.gradle android < defaultConfig < resConfigs "en", "ru" resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi" >>
Можно перенести ключи из манифеста.
Чтобы их не светить, например, если выкладывать код на Гитхабе, то сделаем так.
defaultConfig
И в манифесте переделаем код.
В большинстве случаев это сработает, но иногда ключ требуется при компиляции и указанный пример может не сработать. В таком случае применяют другой вариант через manifestPlaceholders.
defaultConfig
В манифесте пишем.
Класс BuildConfig
В статье LogCat упоминался способ быстрого отключения журналирования.
Суть в следующем. Когда вы создаёте новые переменные в блоках defaultConfig или buildTypes (ветки debug и release), то Gradle создаёт специальный класс BuildConfig, и вы можете получить доступ к этим переменным.
Например, добавим переменную в defaultConfig
defaultConfig
На языке Java это равносильно String YOUR_TOKEN = «ABRAKADABRA»;
Теперь мы можем обратиться к созданной строке.
String token = BuildConfig.YOUR_TOKEN; // Что-то делаем со своей строкой
С секцией buildType ситуация интереснее. У секции есть два блока debug и release. Можно создать переменные с разными значениями, которые будут использоваться в зависимости от ситуации. Например, у вас есть собственное API для сервера. Для тестирования вы используете один адрес, а для финальной версии — другой адрес. Тогда вы просто указываете разные адреса в разных ветках. Переменные могут быть не только строковыми.
buildTypes < debug < buildConfigField "String", "API_URL", '"http://developer.alexanderklimov.ru/api/debug/"' buildConfigField "boolean", "REPORT_CRASHES", "true" >release < . тут какие-то другие записи buildConfigField "String", "API_URL", '"http://developer.alexanderklimov.ru/api/release/"' buildConfigField "boolean", "REPORT_CRASHES", "false" >>
Создаём код для перехода на веб-страницу.
Uri addressUri = Uri.parse(BuildConfig.API_URL); Intent openLinkIntent = new Intent(Intent.ACTION_VIEW, addressUri); startActivity(openLinkIntent);
Теперь вам не нужно переписывать каждый раз код. Загружаться будет страница по нужному адресу автоматически.
Разделяем отладочную и финальную версию
По такому же принципу можно организовать запуск новой версии программы, не затрагивая программу, которую вы установили с Google Play. Допустим вы на своём телефоне установили своё собственное приложение через Google Play. Теперь вам нужно написать новую версию и проверить на своём телефоне. Из-за конфликта имён новое тестируемое приложение перепишет финальную версию или вообще не установится. Поможет следующий трюк.
buildTypes < debug < applicationIdSuffix ".debug" versionNameSuffix "-debug" resValue "string", "app_name", "AboutCat (debug)" >release < minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' resValue "string", "app_name", "AboutCat" >>
В специальных переменных applicationIdSuffix и versionNameSuffix мы задаём суффиксы, чтобы избежать конфликта. А в переменной resValue указываем название программы для отладочной и финальных версий, чтобы на устройстве можно было их найти. Не забудьте при этом удалить строковый ресурс app_name в res/values/strings.xml, иначе получите ошибку при компиляции. Теперь можете спокойно запускать приложение с новым кодом, не боясь повредить своё любимое приложение.
Прячем секретную информацию
Следующий совет больше подходит для компаний. Когда подписывается приложение, то нужно указывать пароль, хранилище и т.д. Чтобы их не светить в студии, можно прописать их в переменных и поместить в секцию signingConfigs. Сервер сам найдёт нужные ключи и воспользуется ими в своих сценариях.
signingConfigs < release < storeFile "$" keyAlias "$" storePassword "$" keyPassword "$" > >
Автогенерация версии кода
Нашёл совет, сам не применял. Не обязательно вручную менять версию приложения в атрибутах versionCode и versionName, можно сделать через переменные, а они сами подставятся в нужное место. На любителя.
def versionMajor = 1 def versionMinor = 0 def versionPatch = 0 android < defaultConfig < versionCode versionMajor * 10000 + versionMinor * 100 + versionPatch versionName "$.$.$" > >
settings.gradle
Файл settings.gradle обычно состоит из одной строчки.
include ':app'
Это означает, что у вас используется один проект для работы. Если вы будете подключать другие проекты, то здесь появятся новые строки.
gradle.properties (Project Properties)
Несколько советов по настройке файла gradle.properties.
Режим параллельного выполнения
В этом файле можно найти закомментированную строку # org.gradle.parallel=true. Если модули вашего проекта не используют друг друга как зависимости, создавая перекрёстные ссылки, можно включать режим параллельного выполнения, что ускорит скорость сборки до ~30%.
org.gradle.parallel=true # включаем режим параллельного выполнения
Gradle-демон
Включение на компьютере демона Gradle даст значительный прирост в скорости сборки.
org.gradle.daemon=true # включаем демон
Режим конфигурации при необходимости
Если в проекте используется много модулей, то можно включить режим конфигурации при необходимости. Ускорение будет заметно при большом количестве используемых модулей:
org.gradle.configureondemand=true
Меняем номер версии библиотек в одном месте
Очень часто в проекте используются взаимосвязанные библиотеки с одинаковыми номерами.
dependencies < compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:design:23.4.0' compile 'com.android.support:percent:23.4.0' compile 'com.android.support:cardview-v7:23.4.0' compile 'com.android.support:gridlayout-v7:23.4.0' //play services compile 'com.google.android.gms:play-services-location:9.2.1' compile 'com.google.android.gms:play-services-gcm:9.2.1' >
Можно быстро поменять у всех номера через переменную. Для этого используется секция ext, в которой указывается переменная и номер версии. Затем в секции dependencies номер версии заменяется на имя переменной
ext < supportLibraryVersion = '24.0.0'; playServicesVersion = '9.2.1' >dependencies < compile "com.android.support:appcompat-v7:$supportLibraryVersion" compile "com.android.support:design:$supportLibraryVersion" compile "com.android.support:percent:$supportLibraryVersion" compile "com.android.support:cardview-v7:$supportLibraryVersion" compile "com.android.support:gridlayout-v7:$supportLibraryVersion" //play services compile "com.google.android.gms:play-services-location:$playServicesVersion" compile "com.google.android.gms:play-services-gcm:$playServicesVersion" >
Обратите внимание, что одинарные кавычки заменяются на двойные, а символ $ указывает на строковый тип.
Расширенная версия с разными переменными в другом виде.
ext.compileSdkProjectVersion= 24 ext.buildToolsProjectVersion= '24.0.0' ext.supportLibraryVersion = '24.0.0' ext.googlePlayVersion = '8.4.0’ android < compileSdkVersion compileSdkProjectVersion buildToolsVersion buildToolsProjectVersion //… >dependencies
Если в проекте используются несколько модулей с одинаковыми зависимостями, то эти записи можно перенести в корневой build.gradle, чтобы не менять номера версий в каждом модуле.
Настройки в Android Studio
Рассмотрим настройки, доступные в Android Studio. Закройте текущий проект, чтобы увидеть стартовое окно студии. В правой части нажмите на пункт Configure. В следующем окне выберите пункт Settings, чтобы оказаться в окне настроек студии. В левой части найдите пункт Build, Execution, Deployment, затем подпункт Build Tools, далее подпункт Gradle. По умолчанию, там всё чисто, только указан путь у Service directory path. Это были общие настройки.
Теперь рассмотрим настройки, относящиеся к проекту. Запустите любой проект в Android Studio. Выберите меню File | Settings. . Снова пройдитесь по пунктам Build, Execution, Deployment | Build Tools | Gradle. Вы увидите практически такое же окно с небольшими изменениями. Теперь поле Linked Gradle Projects не будет пустым, а также появятся дополнительные настройки. По умолчанию рекомендуют использовать Use default gradle wrapper.
Gradle Task
На правой стороне Android Studio имеется вертикальная вкладка Gradle, которую можно развернуть. Она содержит список задач (task), которая выполняет Gradle при работе с текущим проектом. Вы можете выделить любую из этих задач и запустить её двойным щелчком. Можно выделить несколько задач.
Узнать debug.keystore: MD5 и SHA1
Иногда требуется узнать значения debug.keystore: MD5 и SHA1. Обычно их получают через командную строку. Но это долго и неудобно, так как нужно помнить все аргументы. Есть способ проще. Открываем вкладку Gradle, нажимаем на кнопку со стрелками Refresh all Gradle Projects. Затем последовательно открываем элементы Tasks | android и запускаем команду signingReport. В нижнем окне Run увидите нужную информацию.
Variant: debug Config: debug Store: C:\Users\klimo_000\.android\debug.keystore Alias: AndroidDebugKey MD5: BA:6F:23:49:2D:9A:9C:0C:44:75:E0:94:59:07:E0:22 SHA1: 9D:51:F4:B8:4B:15:57:4B:EC:79:67:DC:F4:7C:5B:FB:02:C6:A2:F7 Valid until: Thursday, 1 December 2044
Gradle Console
Когда выполняется какая-то задача Gradle, то ход её выполнения можно увидеть в окне Gradle Console. Открыть её можно через вкладку Gradle Console в нижней правой части студии.
Terminal
Запускать задачи Gradle можно и в окне Terminal.
На панели инструментов имеется значок Sync Project with Gradle Files, которую следует использовать при редактировании файлов Gradle. Как правило, студия также выводит предупреждающее сообщение с ссылкой при изменении файла, которая делает ту же работу.
Добавление зависимостей через интерфейс студии
В статье описывался способ включения библиотеки в проект через редактирование файла build.gradle. Существует альтернативный вариант через настройки студии. Щёлкните правой кнопкой мыши на имени модуля (app) и выберите пункт Open Module Settings (быстрая клавиша F4). В правой части окна находятся вкладки, которые оказывают влияние на файл build.gradle. Например, вкладка Dependencies содержит подключаемые библиотеки.
Чтобы добавить новую зависимость, нажмите на значок с плюсом и выберите нужный вариант, например, Library dependency. Откроется список доступных библиотек из репозитория Maven.
Конфигурация в Android Studio Flamingo
Иногда студия начинает дурить, ругается на несовместимость каких версий библиотек, компиляторов и прочее. Вот и в версии Flamingo проект перестал собираться после какого-то обновления.
Мои настройки, после которого студия собрала проект.
// Project plugins < id 'com.android.application' version '8.0.1' apply false id 'com.android.library' version '8.0.1' apply false id 'org.jetbrains.kotlin.android' version '1.8.0' apply false >// Module compileOptions < sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 >kotlinOptions
Дополнительное чтение
В примере работы с PDF-файлами в папке assets использована операция запрета на сжатие файлов, которое происходит по умолчанию.
Задачи Gradle — теория для общего развития.
How to add google-play-services.jar project dependency so my project will run and present map
I have following problem: I try to use SupportMapFragment from com.google.android.gms.maps.SupportMapFragment which is part of Google Maps Android API v2. My first approach was to add project to Eclipse from android-sdk\extras\google\google_play_services\libproject\google-play-services_lib location and set it as referenced project in Properties -> Project References menu of MyApp. I also added project to Java Build Path / Projects. Error indicators disappeared from Eclipse but when I tried to run my app I got NoClassDefFoundError exception. So my second approach was to copy jar file from google-play-services_lib/libs to my project’s libs directory. MyApp succesfully started but in LogCat I can see dead code . something message so I guess that jar file has to be referenced in another way. And now I am confused and tired..
Maybe someone more experienced in Android can tell me what should I do ?
asked Dec 5, 2012 at 3:14
3,232 3 3 gold badges 29 29 silver badges 33 33 bronze badges
4 Answers 4
The quick start guide that keyboardsurfer references will work if you need to get your project to build properly, but it leaves you with a dummy google-play-services project in your Eclipse workspace, and it doesn’t properly link Eclipse to the Google Play Services Javadocs.
Here’s what I did instead:
- Install the Google Play Services SDK using the instructions in the Android Maps V2 Quick Start referenced above, or the instructions to Setup Google Play Services SDK, but do not follow the instructions to add Google Play Services into your project.
- Right click on the project in the Package Explorer, select Properties to open the properties for your project.
- (Only if you already followed the instructions in the quick start guide!) Remove the dependency on the google-play-services project:
- Click on the Android category and remove the reference to the google-play-services project.
- Click on the Java Build Path category, then the Projects tab and remove the reference to the google-play-services project.
- Click on the Java Build Path category, then the Libraries tab.
- Click Add External JARs. and select the google-play-services.jar file. This should be in [Your ADT directory]\sdk\extras\google\google_play_services\libproject\google-play-services_lib\libs.
- Click on the arrow next to the new google-play-services.jar entry, and select the Javadoc Location item.
- Click Edit. and select the folder containing the Google Play Services Javadocs. This should be in [Your ADT directory]\sdk\extras\google\google_play_services\docs\reference.
- Still in the Java Build Path category, click on the Order and Export tab. Check the box next to the google-play-services.jar entry.
- Click OK to save your project properties.
Your project should now have access to the Google Play Services library, and the Javadocs should display properly in Eclipse.
answered Jul 11, 2013 at 19:26
379 4 4 silver badges 3 3 bronze badges
when I do this, just adding the jar and excluding any references to the imported project, as other posts suggest, my project can’t reference anything within the library; won’t compile due to errors. How are you getting around that?
Sep 18, 2013 at 20:40
This does not allow you to reference the @integer/google_play_services_version value needed for the meta-data tag in the manifest.
Mar 10, 2014 at 2:36
This won’t let the maps to execute !
Dec 13, 2014 at 13:09
What i have done is that import a new project into eclipse workspace, and that path of that was be
android-sdk-macosx/extras/google/google_play_services/libproject/google-play-services_lib
and add as library in your project.. that it .. simple!! you might require to add support library in your project.
answered Dec 5, 2012 at 16:30
Sandeep Dhull Sandeep Dhull
1,638 2 2 gold badges 18 18 silver badges 30 30 bronze badges
was searching the location of this lib for 20 minutes now
Feb 20, 2015 at 9:29
the above location is posted two years ago, now you can find it at sdk/extras/google/google_play_services/libproject
Feb 20, 2015 at 9:33
Be Careful, Follow these steps and save your time
- Right Click on your Project Explorer.
- Select New-> Project -> Android Application Project from Existing Code
- Browse upto this path only — «C:\Users**your path**\Local\Android\android-sdk\extras\google\google_play_services»
- Be careful brose only upto — google_play_services and not upto google_play_services_lib
- And this way you are able to import the google play service lib.
Let me know if you have any queries regarding the same.
answered Apr 3, 2013 at 12:32
Gaurav Arora Gaurav Arora
8,302 21 21 gold badges 89 89 silver badges 143 143 bronze badges
LongMiles I am trying to import google play services and facing difficulty in importing it. It says that » No projects are found to import. Could you please help me regarding this?
Jun 4, 2013 at 2:26
Just follow my above specified steps, AS IT IS and your problem will definitely be solved.
Jun 4, 2013 at 4:14
I’m using Titanium Studio, and I can’t see any Android menu after click Import or in project’s properties.
Nov 12, 2013 at 7:51
Some of the solutions described here did not work for me. Others did, however they produced warnings on runtime and javadoc was still not linked. After some experimenting, I managed to solve this. The steps are:
- Install the Google Play Services as recommended onAndroid Developers.
- Set up your project as recommended onAndroid Developers.
- If you followed 1. and 2., you should see two projects in your workspace: your project and google-play-services_lib project. Copy the docs folder which contains the javadoc from /extras/google/google_play_services/ to libs folder of your project.
- Copy google-play-services.jar from /extras/google/google_play_services/libproject/google-play-services_lib/libs to ‘libs’ folder of your project.
- In google-play-services_lib project, edit libs/google-play-services.jar.properties . The in doc= should point to the subfolder reference of the folder docs , which you created in step 3.
- In Eclipse, do Project >Clean. Done, javadoc is now linked.
Ganeshcoep / AndroidServices
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| adb remount |
| Navigate to the location of services.jar |
| adb -d push services.jar /system/framework/services.jar |
| adb reboot |
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Footer
© 2024 GitHub, Inc.
You can’t perform that action at this time.
[Q] Edit system/framework/services.jar ?
I got tired of waiting for a nice custom ROM or Xposed to drop, so I decided to look into doing my own mods. I’ve been wanting to learn for the longest time.
My Googling suggests things I mostly want (such as the five-way-reboot and disabling of screen-on when plugged/unplugged) are options that can be change in services.jar.
But I’m not finding the classes.dex in my services.jar file.
Can anyone point me in the right direction to get started?
Maybe toss a link my way to read?
I got brain tired after 20 minutes of Googling only led me to how-to guides that aren’t working out because I don’t have this classes.dex thing?
mostyle
Senior Member
Nov 13, 2006 491 236 Langley, SC
I got tired of waiting for a nice custom ROM or Xposed to drop, so I decided to look into doing my own mods. I’ve been wanting to learn for the longest time.
My Googling suggests things I mostly want (such as the five-way-reboot and disabling of screen-on when plugged/unplugged) are options that can be change in services.jar.
But I’m not finding the classes.dex in my services.jar file.
Can anyone point me in the right direction to get started?
Maybe toss a link my way to read?
Pull the .jar file to your local machine and open it in an archiver that supports .zip compression. Many files including ‘classes.dex’ are inside the .jar file. Simplest way is to extract the classes.dex then decompile it using backsmali.
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
Pull the .jar file to your local machine and open it in an archiver that supports .zip compression.
Right, but there is only one file inside the services.jar and it’s not classes.dex. It’s just the META-INF folder wiht MANIFEST.MF inside.
As well, the services.jar is only 318 Bytes.
I use 7zip on my computer or Root Explorer on the phone.
Attachments
95.3 KB · Views: 1,200
DIXZ06
Senior Member
May 9, 2011 112 61 So. Cal.
While you are learning can you incorporate a dark background in the app drawer.
Keep up the good work.
mostyle
Senior Member
Nov 13, 2006 491 236 Langley, SC
Right, but there is only one file inside the services.jar and it’s not classes.dex. It’s just the META-INF folder wiht MANIFEST.MF inside.
As well, the services.jar is only 318 Bytes.
I use 7zip on my computer or Root Explorer on the phone.
Same here. I suspect the dex code you are looking for has moved either to an APK or a different JAR.
Have you looked at the classes.dex in framework-res.apk?
There are a LOT of 318 byte files in /system/framework. This tells me most definitely that the code has been offloaded elsewhere and that these files were likely left as legacy reference. Apologies for not looking at the files before replying.
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
Now that you mention it, I did try all the other jar’s in /system/framework.
The only one that had a classes.dex was embmslibrary.jar.
But I got errors when trying to unpack it.
Wish I’d saved the errors to post here.
Figured I’d give some of the ROM building utilities a go but have not had success yet. I’m only still just starting out though.
I’m thinking we’ll probably need an all new ROM Kitchen for 7.1 due to many significant changes.
Which are probably what’s holding up ROM development so far.
I got the Nexu. uh, Pixel because I figured we’d have a bunch of cool AOSP ROM’s within a week or two. doh.
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
While you are learning can you incorporate a dark background in the app drawer.
Keep up the good work.
There are already mods out there for the Pixel Launcher.
I use Nova Launcher though, which has color and transparency options built right into it.
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
XDA’s Chef Central subforum:
http://xdaforums.com/chef-central/android
death2all110
Senior Member
Sep 21, 2010 515 295 Illinois
The reason you’re not seeing the classes.dex file in any of the jar files is because the system is odexed. The classes.dex file is actually services.odex in /system/framework/oat/arm64.
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
Good to know, thank you!
It’s a bummer about all these Android Kitchen variations out there.
None work with the Pixel yet.
I’m not having warm & fuzzy feelings about development for this phone.
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
Has anyone found a way to deodex the Pixel 7.1 yet?
I’m not finding any «utilities» that support Pixel yet.
flex360
Senior Member
Sep 22, 2010 4,520 6,815
disable screen on when plugged in can be disabled by editing «bools.xml» in the framework-res.apk
i can do it for you if you want
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
disable screen on when plugged in can be disabled by editing «bools.xml» in the framework-res.apk
i can do it for you if you want
Holy moly, I’ve already found 18 bools.xml’s in framework-res.apk and there are still about two hundred folders to manually open to see what’s in there.
Do you know which one to edit? I’d like to learn all this myself.
I’m using APK Studio and really wish it had a better search function.
flex360
Senior Member
Sep 22, 2010 4,520 6,815
Holy moly, I’ve already found 18 bools.xml’s in framework-res.apk and there are still about two hundred folders to manually open to see what’s in there.
Do you know which one to edit? I’d like to learn all this myself.
I’m using APK Studio and really wish it had a better search function.
the one in the «values» folder
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
Ahh. There are like five million Values folders.
But only one value folder.
I missed that. lol
Thanks
Scott
Retired Recognized Developer
Feb 20, 2007 29,245 66,273 Fargo www.scottcrosler.com OnePlus 8T Samsung Galaxy S21 Ultra
Holy moly, I’ve already found 18 bools.xml’s in framework-res.apk and there are still about two hundred folders to manually open to see what’s in there.
Do you know which one to edit? I’d like to learn all this myself.
I’m using APK Studio and really wish it had a better search function.
And you thought this was going to be easy why. LOL
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
You’re not kidding.
Just one roadblock after another.
And all my Googling leads to old research/faq’s that just don’t seem to work on the Pixel.
I need to go buy an old Nexus running Gingerbread just to get some of this stuff to work.
My current roadblock is trying to write to /system via ADB.
It pretends to let me write.
But after a reboot, all my changes are gone and it’s gone back to the original files again.
adb root
adb remount
adb push filename /system/folder/filename.
It’s like yeahhhh, 100% write complete.
PSYCH! Then you reboot and it’s like you never wrote anything.
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
I even tried replacing the framework file using Root Explorer but it just immediately reboots and bootloops.
I did sign the apk succesfully before trying that.
CZ Eddie
Senior Member
Sep 27, 2011 6,391 2,438 Austin, TX
FINALLY I have success.
I’m now able to unplug my phone without the screen turning on.
This was a huge frustration when car-docked.
Now I can work on a few other things and come back and play with some more mods later. :good:
So my stumbling blocks were permissions (duh) and being unable to decompile, recompile and then sign the apk and get it onto the phone without bootlooping.
I still don’t have a good way of dcompiling/recompiling without doing some 7zip magic afterwards. But at least I have some success and a footprint to move forward with learning some further mods. :good:
And I had to get this done using Root Explorer, so I still need to figure out a proper way to mount the system and push system files with ADB and get them to stick.