AndroidX patch
On Google I / O 2018, a replacement was provided to the existing support-libraries - AndroidX
Initially, support libraries were developed for backward compatibility of new APIs and were closely associated with the operating system. Development of support-libraries was carried out in the internal branches, which periodically merged into the Android Open Source Project (AOSP). This approach limited merge pull requests from the community to small periods of time when the AOSP code and the internal Google code were synchronized. In addition, to work with support libraries, it was necessary to download the entire platform code, which is more than 40GB of source code. For my 250 GB disk, this is quite a lot.
The current functionality of the support libraries is much wider than the original idea. For example, it implemented a component to simplify the development of the AppCompat user interface, a component for working with the Room databases, a component for the background tasks of the WorkManager. Many of these libraries are initially backward compatible and weakly tied to the Android API. The number in the support library number means the minimum API level it supports. For example, support-v7 supports Android API version 7 and higher. However, starting from version 26.0.0, the support libraries support Android API 14 and higher. Separate pain gives the need to simultaneously update all support-libraries. All this indicates that support libraries have become obsolete and need to be rethought.
The development team spent several years allocating support libraries into a separate small project, which you can work with using Android Studio and Gradle. The development was moved to a separate branch, which recently became public. The updated libraries are called AndroidX. Another important difference of new libraries is the ability to independently update. Google promises binary compatibility within a single major version, which will allow using recyclerview version 1.0 and AppCompat version 1.9 in a single project.
In my opinion, this is the right and logical step in the development of support-libraries. I had to strongly customize components from support-libraries several times, which led to the need to create a com.android.support package in my project ... to access package-private classes / methods / fields.
Now I propose to “hack” some library from the AndroidX family with me. As a tutorial, I chose CardView. I'm going to influence the behavior of CardView without making changes to the code that uses it.
We need: A computer running Linux or MacOS (Windows is not supported), Android SDK, optional - Android Studio (I used version 3.1.3)
To download the source, it is recommended to use the repo utility , which is not available for Windows. Sources can be downloaded using git, for example, like this: git clone --single-branch -b androidx-master-dev https://android.googlesource.com/platform/frameworks/support
However, in this case, utilities and compiled dependencies will not be downloaded. I did not check how critical it is for assembly
To begin with, I prepared a small example using AndroidX.
Highlights:
Using AndroidX
def cardViewVer = '1.0.0-beta01'
dependencies {
implementation"androidx.cardview:cardview:$cardViewVer"
}
<?xml version="1.0" encoding="utf-8"?><FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.cardview.widget.CardViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginBottom="32dp"android:layout_marginEnd="32dp"android:layout_marginLeft="32dp"android:layout_marginRight="32dp"android:layout_marginStart="32dp"android:layout_marginTop="32dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /></androidx.cardview.widget.CardView></FrameLayout>
publicclassMainActivityextendsActivity{
@OverrideprotectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
As a result, we obtain the following application:
Let's get down to AndroidX
First, you need to install the repo utility, created to simplify the work with git in the context of android.
Create a working folder for our manipulations, although you can use the home directory.
mkdir androidX
Install the utility
сd androidX
mkdir bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ./bin/repo
chmod a+x ./bin/repo
PATH={some_path}/androidX/bin/:$PATH
Let me explain what we have done now:
In the androidX folder, we created the repo folder, where we downloaded the file via the link https://storage.googleapis.com/git-repo-downloads/repo , made the file executable and added the bin folder to the PATH for the current session the terminal.
In my case, the last command looked like this: PATH = ~ / Work / projects / androidX / bin /: $ PATH
Downloading AndroidX sources:
Create a folder androidX / androidX-source and make it current
mkdir androidX-source
cd androidX-source
Initialize the local repository. Approximately 16 megabytes of data about existing branches in the repository are downloaded.
repo init -u https://android.googlesource.com/platform/manifest -b androidx-master-dev
In the process, the user’s name and e-mail will be pulled from the global config of the gita, in my case, it looked like this:
Your identity is: Andrew <me@example.com>
If you want to change this, please re-run 'repo init' with --config-name
Если в конфиге нет этой информации, то имя и почта будут запрошены.
Далее идет проверка форматированного вывода и запрос на его включение.
Testing colorized output (for'repo diff', 'repo status'):
black red green yellow blue magenta cyan white
bold dim ul reverse
Enable color display in this user account (y/N)?
I answered yes to the last question in the affirmative.
At the end we get the message
repo has been initialized in /Users/{user}/Work/projects/androidX/androidX-source
Next, download the source directly (about 3 gigabytes)
repo sync -j8 -c
We can open downloaded sources in Android Studio or any other editor. The root folder of the gradle project is located at:androidX/androidX-source/frameworks/support/
There are many modules with different features and several test applications. We can assemble and install them to test performance.
Open the androidx.cardview.widget.RoundRectDrawable class in the cardview module.
Add a harmless joke to the onDraw method
canvas.drawText(“Hacked!”, 100, 100, paint);
Full patch
For the project, the createArchive gradle task is described, which will assemble the androidX libraries and place them in the local maven repository. Repository Address:androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo
To use it, you must specify the path in the root build file.
maven { url 'androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo' }
Please note that the assembled version may be newer than in the Google repository. At the time of this writing, I have compiled the androidX library version 1.0.0-rc01. You can see the version of the collected library in the local maven repository:androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo/androidx/cardview/cardview/maven-metadata.xml
Re-create our application and see the following picture:
AndroidX successfully patched!
What does this give us:
- We can fix critical problems without waiting for an update from Google. By the way, the AndroidX team accepts pull requests.
- Strongly customize androidX library.
Related links:
Support-libraries documentation.
Post on developer blog.
Instructions on AndroidX assignment. AndroidX
task tracker. AndroidX
source files.