Parche AndroidX


Google I / O 2018 introdujo un reemplazo para las bibliotecas de soporte existentes - AndroidX


Inicialmente, las bibliotecas de soporte se diseñaron para la compatibilidad con versiones anteriores de nuevas API y estaban estrechamente relacionadas con el sistema operativo. Las bibliotecas de soporte se desarrollaron en ramas internas, que se fusionaron periódicamente en el Proyecto de Código Abierto de Android (AOSP). Este enfoque limitó la solicitud de extracción de fusión de la comunidad a pequeños períodos de tiempo cuando el código AOSP y el código interno de Google se sincronizaron. Además, para trabajar con bibliotecas de soporte, era necesario extraer todo el código de la plataforma, y ​​esto es más de 40 GB de código fuente. Para mi disco de 250 GB, esto es bastante.


La funcionalidad actual de las bibliotecas de soporte es mucho más amplia que la idea original. Por ejemplo, se implementó un componente para simplificar el desarrollo de la interfaz de usuario de AppCompat, un componente para trabajar con bases de datos de Room, un componente para tareas de WorkManager en segundo plano. Muchas de estas bibliotecas son inicialmente compatibles con versiones anteriores y están vinculadas a la API de Android. El número en el número de la biblioteca de soporte indica el nivel mínimo de API que admite. Por ejemplo, support-v7 es compatible con Android API versión 7 y superior. Sin embargo, a partir de la versión 26.0.0, las bibliotecas de soporte son compatibles con Android API 14 y superior. Otro problema es la necesidad de actualizar simultáneamente todas las bibliotecas de soporte. Todo esto indica que las bibliotecas de soporte se han vuelto obsoletas y necesitan repensarse.


El equipo de desarrollo pasó varios años aislando las bibliotecas de soporte en un pequeño proyecto separado con el que puede trabajar usando Android Studio y Gradle. El desarrollo se trasladó a una rama separada, que recientemente se hizo pública. Las bibliotecas actualizadas se llaman AndroidX. Otra diferencia importante entre las nuevas bibliotecas es la posibilidad de actualizaciones independientes. Google promete compatibilidad binaria en el marco de una versión principal, que permitirá utilizar la versión 1.0 de recyclerview y la versión AppCompat 1.9 en el mismo proyecto.


En mi opinión, este es el paso correcto y lógico en el desarrollo de bibliotecas de soporte. Tuve que personalizar severamente los componentes de las bibliotecas de soporte varias veces, lo que me llevó a la necesidad de crear el paquete com.android.support en mi proyecto ... para acceder a clases / métodos / campos privados de paquetes.


Ahora propongo "hackear" alguna biblioteca de la familia AndroidX conmigo. Como tutorial, elegí CardView. Voy a influir en el comportamiento de CardView sin hacer ningún cambio en el código que lo usa.


Necesitamos: una computadora con Linux o MacOS (Windows no es compatible), Android SDK, opcionalmente Android Studio (utilicé la versión 3.1.3)


¿Qué hay de las ventanas?

Para descargar las fuentes, se recomienda utilizar la utilidad de repositorio , que no está disponible para Windows. Las fuentes también se pueden descargar usando git, por ejemplo, así: git clone --single-branch -b androidx-master-dev https://android.googlesource.com/platform/frameworks/support Sin embargo, en este caso no lo harán Utilidades y dependencias compiladas descargadas. No verifiqué cuán crítico es construir


Para comenzar, preparé un pequeño ejemplo con AndroidX.


Destacados:


Usando AndroidX


 def cardViewVer = '1.0.0-beta01' dependencies { implementation "androidx.cardview:cardview:$cardViewVer" } 

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns: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.CardView android: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"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> </androidx.cardview.widget.CardView> </FrameLayout> 

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 

Como resultado, obtenemos la siguiente aplicación:


dibujo

Vamos a AndroidX


Primero, debe instalar la utilidad repo, creada para simplificar el trabajo con git en el contexto de Android.


Creamos una carpeta de trabajo para nuestras manipulaciones, aunque también puede usar el directorio de inicio.


 mkdir androidX 

Instala la utilidad


 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 

Déjame explicarte lo que acabamos de hacer:
En la carpeta androidX, creamos la carpeta repo, donde descargamos el archivo en https://storage.googleapis.com/git-repo-downloads/repo , hicimos el archivo ejecutable y agregamos la carpeta bin a PATH como parte de la sesión de terminal actual.
En mi caso, el último comando se veía así: PATH = ~ / Work / projects / androidX / bin /: $ PATH


Descargue la fuente AndroidX:


Cree la carpeta androidX / androidX-source y actualícela


 mkdir androidX-source cd androidX-source 

Inicializamos el repositorio local. Descarga aproximadamente 16 megabytes de datos sobre las sucursales existentes en el repositorio.


 repo init -u https://android.googlesource.com/platform/manifest -b androidx-master-dev 

En el proceso, el nombre y el correo del usuario se extraerán de la configuración global del concierto, en mi caso, se veía así:


 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)? 

Respondí afirmativamente a la última pregunta.
Al final recibimos un mensaje


 repo has been initialized in /Users/{user}/Work/projects/androidX/androidX-source 

A continuación, descargue la fuente directamente (aproximadamente 3 gigabytes)


 repo sync -j8 -c 

Podemos abrir las fuentes descargadas en Android Studio o cualquier otro editor. La carpeta raíz del proyecto gradle se encuentra en: androidX/androidX-source/frameworks/support/


Hay muchos módulos con diferentes características y varias aplicaciones de prueba. Podemos ensamblarlos e instalarlos para verificar el rendimiento.


Abra la clase androidx.cardview.widget.RoundRectRrawDrawable en el módulo cardview
Agrega una broma inofensiva al método onDraw


 canvas.drawText(“Hacked!”, 100, 100, paint); 

Parche completo


Para el proyecto, se describe la tarea createArchive gradle, que recopilará las bibliotecas androidX y las colocará en el repositorio local de Maven. Dirección del repositorio: androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo


Para usarlo, debe especificar la ruta en el archivo de compilación raíz.


maven { url 'androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo' }


Tenga en cuenta que la versión ensamblada puede ser más nueva que en el repositorio de Google. Al momento de escribir esto, he compilado una biblioteca de AndroidX versión 1.0.0-rc01. Puede ver la versión de la biblioteca compilada en el repositorio local de androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo/androidx/cardview/cardview/maven-metadata.xml : androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo/androidx/cardview/cardview/maven-metadata.xml


Ejemplo actualizado


Reconstruiremos nuestra aplicación y veremos la siguiente imagen:


dibujo

AndroidX parcheado con éxito!


¿Qué nos da esto?


  • Podemos solucionar problemas críticos sin esperar una actualización de Google. Por cierto, el equipo de AndroidX acepta solicitudes de extracción.
  • Personaliza fuertemente la biblioteca androidX.

Enlaces relacionados:
Documentación de la biblioteca de soporte
Publicación del blog del desarrollador
Guía de contribución de AndroidX
AndroidX Task Tracker
Fuentes de AndroidX

Source: https://habr.com/ru/post/es418723/


All Articles