[go: up one dir, main page]


Diposting oleh Neville Sicard-Gregory – Senior Product Manager, Android Studio

Hari ini kami meluncurkan Android Studio Iguana 🦎 di saluran rilis stabil untuk mempermudah Anda membuat aplikasi berkualitas tinggi. Dengan fitur-fitur seperti dukungan Sistem Kontrol Versi di App Quality Insights, hingga dukungan bawaan baru untuk membuat Profil Dasar bagi aplikasi Jetpack Compose, versi ini akan meningkatkan alur kerja pengembangan Anda saat mengoptimalkan aplikasi. Download versi terbaru sekarang!

Lihat daftar fitur baru pada Android Studio Iguana di bawah ini, yang disusun menurut alur developer utama.

Debugging

Integrasi sistem kontrol versi dalam App Quality Insights

Ketika build rilis beberapa commit di belakang kode sumber lokal Anda, nomor baris dalam laporan kerusakan Firebase Crashlytics dapat dengan mudah menjadi tidak valid, sehingga lebih sulit menavigasi secara akurat dari error ke kode saat menggunakan App Quality Insights. Jika Anda menggunakan git untuk kontrol versi, sekarang ada solusi untuk masalah ini.

Ketika Anda membangun aplikasi menggunakan Plugin Android Gradle 8.3 atau yang lebih baru dan Crashlytics SDK versi terbaru, AGP menyertakan informasi commit git sebagai bagian dari artefak build yang dipublikasikan ke Play Store. Ketika terjadi error, Crashlytics akan melampirkan informasi git ke laporan, dan Android Studio Iguana menggunakan informasi ini untuk membandingkan checkout lokal Anda dengan kode eksak yang menyebabkan error dari histori git Anda.

Setelah Anda membangun aplikasi menggunakan Plugin Android Gradle 8.3 atau yang lebih tinggi dengan Crashlytics SDK terbaru, dan memublikasikannya, laporan kerusakan baru di jendela App Quality Insights memungkinkan Anda membuka baris kode dalam checkout git saat ini atau melihat laporan perbedaan antara checkout saat ini dengan versi codebase aplikasi yang menyebabkan laporan kerusakan. Pelajari lebih lanjut.

app quality insights dengan integrasi sistem kontrol versi di Android Studio
App Quality Insights dengan Integrasi Sistem Kontrol Versi

Menampilkan varian error Crashlytics di App Quality Insights

app quality insights di Android Studio
Varian error di App Quality Insights

Sekarang, saat Anda memilih masalah Crashlytics di App Quality Insights, Anda akan melihat data gabungan dari peristiwa yang memiliki titik kegagalan yang sama dalam kode Anda, tetapi mungkin memiliki akar penyebab yang berbeda. Untuk membantu Anda menganalisis akar penyebab error, Crashlytics sekarang mengelompokkan peristiwa yang memiliki pelacakan tumpukan yang identik sebagai varian masalah. Kini Anda bisa menampilkan peristiwa dalam setiap varian laporan kerusakan di App Quality Insights dengan memilih varian dari menu dropdown. Atau, Anda bisa menampilkan informasi gabungan untuk semua varian dengan memilih All.

Desain

Pemeriksaan UI Jetpack Compose

Untuk membantu developer membangun UI adaptif dan mudah diakses di Jetpack Compose, Iguana memperkenalkan mode Pemeriksaan UI baru di Pratinjau Compose. Cara kerja fitur ini mirip dengan analisis lint visual dan integrasi pemeriksaan aksesibilitas untuk tampilan. Aktifkan mode pemeriksaan UI Compose untuk mengaudit UI Compose Anda secara otomatis dan memeriksa masalah adaptif dan aksesibilitas pada berbagai ukuran layar, seperti teks yang terlalu melar pada layar besar atau kontras warna yang rendah. Mode ini menyoroti masalah yang ditemukan dalam konfigurasi pratinjau yang berbeda, dan mencantumkannya dalam panel masalah.

Cobalah dengan mengklik ikon Pemeriksaan UI di Pratinjau Compose.

Titik masuk Pemeriksaan UI di Pratinjau Compose
Titik masuk Pemeriksaan UI di Pratinjau Compose

Hasil Pemeriksaan UI Reply App di Pratinjau Compose
Hasil Pemeriksaan UI Reply App di Pratinjau Compose

Rendering progresif untuk Pratinjau Compose

Pratinjau Compose di Android Studio Iguana sekarang menerapkan rendering progresif, sehingga Anda dapat melakukan iterasi pada desain Anda dengan waktu pemuatan yang lebih singkat. Fitur ini secara otomatis menurunkan detail pratinjau di luar tampilan untuk meningkatkan performa, yang berarti, Anda bisa menggulir tata letak yang paling kompleks sekalipun tanpa lag.

gambar bergerak yang menunjukkan rendering progresif di Compose
Rendering Progresif di Compose

Develop

Update Platform IntelliJ

Android Studio Iguana menyertakan rilis platform IntelliJ 2023.2, yang memiliki banyak fitur baru seperti dukungan untuk GitLab, penelusuran teks di Search Everywhere, update penyesuaian warna untuk UI baru, dan sejumlah peningkatan baru. Pelajari lebih lanjut.

Pengujian

Wizard modul Profil Dasar

Sering kali ketika Anda menjalankan aplikasi Android untuk pertama kalinya pada perangkat, waktu mulai aplikasi mungkin terlihat lambat karena sistem operasi harus menjalankan kompilasi saat itu juga. Untuk mengatasi situasi ini, Anda bisa membuat Profil Dasar untuk membantu Android meningkatkan aspek-aspek seperti waktu mulai aplikasi, scrolling, dan kecepatan navigasi dalam aplikasi Anda. Kami menyederhanakan proses pengaturan Profil Dasar dengan menawarkan template Generator Profil Dasar baru di wizard modul baru (File > New > New Module). Template ini mengonfigurasi project Anda untuk mendukung Profil Dasar dan menggunakan plugin Gradle Profil Dasar terbaru, yang menyederhanakan proses penyiapan dengan mengotomatiskan tugas-tugas yang diperlukan dengan satu perintah Gradle.

Wizard modul Profil Dasar - Membuat Modul Baru
Generator Profil Dasar

Selain itu, template ini membuat konfigurasi run yang memungkinkan Anda membuat Profil Dasar dengan sekali klik dari daftar dropdown "Select Run/Debug Configuration".

Menu drop-down Generate Baseline Profile
Menu drop-down Generate Baseline Profile

Menguji perubahan konfigurasi dengan Espresso Device API

Pengujian sinkron perubahan ukuran jendela menggunakan Espresso Device API
Pengujian sinkron perubahan ukuran jendela menggunakan Espresso Device API

Tangani masalah tata letak sejak dini dan pastikan aplikasi Anda memberikan pengalaman pengguna yang mulus di berbagai perangkat dan orientasi. Espresso Device API menyimulasikan bagaimana aplikasi Anda bereaksi terhadap perubahan konfigurasi—seperti rotasi layar, melipat/membuka lipatan perangkat, atau perubahan ukuran jendela—secara sinkron pada perangkat virtual. API ini membantu Anda menguji secara menyeluruh dan secara preemptive memperbaiki masalah yang membuat pengguna frustasi sehingga Anda dapat membangun aplikasi Android yang lebih andal dengan percaya diri. API ini dibangun di atas endpoint gRPC baru yang diperkenalkan di Android Emulator 34.2, yang memungkinkan aliran data dua arah dengan aman dan simulasi sensor yang tepat.

Perangkat Pixel 8 dan Pixel 8 Pro di Android Emulator (34.2)

Uji aplikasi Anda pada konfigurasi perangkat Google Pixel terbaru dengan definisi Perangkat Virtual Android yang telah diupdate di Android Studio. Dengan Android Studio Iguana dan Android Emulator terbaru (34.2+), akses Pixel Fold, Pixel Tablet, Pixel 7a, Pixel 8, dan Pixel 8 Pro. Memvalidasi aplikasi Anda di perangkat virtual ini adalah cara termudah untuk memastikan bahwa aplikasi Anda bereaksi dengan benar terhadap berbagai ukuran layar dan jenis perangkat.

Perangkat Virtual Android Pixel Baru di Android Emulator
Perangkat Virtual Android Pixel Baru di Android Emulator.

Build

Dukungan untuk Katalog Versi Gradle

Android Studio Iguana menyederhanakan manajemen dependensi dengan dukungan yang disempurnakan untuk Katalog Versi Gradle berbasis TOML. Anda akan mendapatkan keuntungan dari:

    • Manajemen dependensi terpusat: Menjaga semua dependensi project Anda tetap terorganisir dalam satu file untuk pengeditan dan pembaruan yang lebih mudah.
    • Fitur penghemat waktu: Nikmati pelengkapan kode yang mulus, navigasi cerdas dalam kode Anda, dan kemampuan untuk mengedit dependensi project dengan cepat melalui dialog Project Structure yang nyaman.
    • Peningkatan efisiensi: Ucapkan selamat tinggal pada dependensi yang tersebar dan update versi secara manual. Katalog versi memberi Anda alur kerja pengembangan yang lebih mudah dikelola dan efisien.

Project baru akan secara otomatis menggunakan katalog versi untuk manajemen dependensi. Jika Anda sudah memiliki project, pertimbangkan melakukan peralihan untuk mendapatkan manfaat dari peningkatan alur kerja ini. Untuk mempelajari cara mengupdate ke katalog versi Gradle, lihat Memigrasikan build Anda ke katalog versi.

Insight SDK tambahan: masalah kebijakan

Android Studio Iguana sekarang secara proaktif memberi tahu Anda tentang potensi pelanggaran kebijakan Google Play melalui integrasi dengan Google Play SDK Index. Melihat masalah kebijakan Play dengan mudah di file build dan Dialog Project Structure. Hal ini menyederhanakan kepatuhan, membantu Anda menghindari penundaan atau penolakan publikasi yang tidak terduga di Google Play Store.

Dialog Project Structure Android Studio yang menunjukkan peringatan dari Google Play SDK Index
Peringatan dari Google Play SDK Index pada dialog Project Structure Android Studio

Dukungan versi compileSdk Android Studio

Menggunakan Android Studio untuk mengembangkan project yang memiliki versi compileSdk yang tidak didukung bisa menyebabkan error yang tidak terduga karena versi Android Studio lama mungkin tidak dapat menangani Android SDK terbaru dengan benar. Untuk menghindari masalah ini, Android Studio Iguana sekarang secara eksplisit memperingatkan Anda jika compileSdk yang ditujukan untuk project adalah untuk versi yang lebih baru yang tidak didukung secara resmi. Jika tersedia, ia juga menyarankan untuk berpindah ke versi Android Studio yang mendukung compileSdk yang digunakan project Anda. Perlu diingat bahwa mengupgrade Android Studio mungkin juga mengharuskan Anda mengupgrade AGP.

Ringkasan

Singkatnya, Android Studio Iguana 🦎menyertakan penyempurnaan dan fitur-fitur berikut ini:

Debugging

Desain

Develop

    • Update platform IntelliJ

Pengujian

Build

Download Android Studio Sekarang

Download Android Studio Iguana 🦎 sekarang dan manfaatkan fitur-fitur terbaru untuk menyederhanakan alur kerja dan membantu Anda membuat aplikasi yang lebih baik. Masukan Anda sangatlah penting – periksa masalah yang diketahui, laporkan bug, sarankan peningkatan, dan jadilah bagian dari komunitas kami yang dinamis di LinkedIn Medium, YouTube, atau X (sebelumnya dikenal sebagai Twitter). Mari membangun masa depan aplikasi Android bersama-sama!


Rebecca Franks
Developer Android
Dipublikasikan di
Bacaan 6 menit

--

Kami baru saja merilis dokumentasi baru yang membahas cara menggunakan library graphics-shapes di Jetpack Compose. Meskipun dokumentasi itu membahas dasar-dasarnya, saya pikir akan menyenangkan mencoba sesuatu yang sedikit lebih rumit dan membuat status progres yang terlihat berbeda dari versi standar yang biasa kita gunakan.

Dalam postingan blog ini, kita akan membahas cara membuat status progres yang bertransisi dari poligon bulat berbentuk "bintang" berlekuk-lekuk menjadi lingkaran sembari menampilkan animasi progres reguler.

Status progres tak terbatas gradien garis berlekuk-lekuk

Membuat poligon

Langkah pertama yang ingin kita lakukan adalah membuat transisi dari lingkaran ke lingkaran berlekuk-lekuk, jadi kita membuat dua bentuk yang perlu kita transformasikan.

Dua bentuk yang akan kita transformasikan

Kita menggunakan RoundedPolygon#star(), karena ini memungkinkan kita menetapkan radius bagian dalam untuk bentuk dengan sudut membulat, dan RoundedPolygon#circle() untuk bentuk lingkaran.

val starPolygon = remember {
RoundedPolygon.star(
numVerticesPerRadius = 12,
innerRadius = 1f / 3f,
rounding = CornerRounding(1f / 6f))
}
val circlePolygon = remember {
RoundedPolygon.circle(
numVertices = 12
)
}

Transformasi di antara dua bentuk

Untuk melakukan transformasi di antara dua poligon, kita perlu membuat objek Morph:

val morph = remember {
Morph(starPolygon, circlePolygon)
}

Ini akan digunakan dengan nilai progres animasi untuk menentukan progres transformasi di antara kedua bentuk ini. Untuk menggambar objek Morph, kita perlu mendapatkan objek Path dari geometrinya, yang kita buat dengan menggunakan metode pembantu berikut:

fun Morph.toComposePath(progress: Float, scale: Float = 1f, path: Path = Path()): Path {
var first = true
path.rewind()
forEachCubic(progress) { bezier ->
// move to the initial position if its the first cubic curve
if (first) {
path.moveTo(bezier.anchor0X * scale, bezier.anchor0Y * scale)
first = false
}
// add cubic curve to the current path for each curve in the Morph
path.cubicTo(
bezier.control0X * scale, bezier.control0Y * scale,
bezier.control1X * scale, bezier.control1Y * scale,
bezier.anchor1X * scale, bezier.anchor1Y * scale
)
}
path.close()
return path
}

Dengan Path Morph, kita bisa memanggil DrawScope#drawPath() untuk menggambar bentuk transformasi animasi kita:

val infiniteTransition = rememberInfiniteTransition(label = "infinite")
val progress = infiniteTransition.animateFloat(
initialValue = 0f,
targetValue = 1f,
animationSpec = infiniteRepeatable(
tween(4000, easing = LinearEasing),
repeatMode = RepeatMode.Reverse
),
label = "progress"
)
//.. shapes that are created .. //
var morphPath = remember {
Path()
}


Box(
modifier = Modifier
.padding(16.dp)
.drawWithCache {
morphPath = morph
.toComposePath(progress = progress.value, scale = size.minDimension / 2f, path = morphPath)


onDrawBehind {
translate(size.width / 2f, size.height / 2f) {
drawPath(morphPath, color = Color.Black, style = Stroke(16.dp.toPx()))
}
}
}
)
Transformasi jalur antara lingkaran dan bentuk bintang berlekuk-lekuk

Sekarang kita bisa memutar bentuk seiring waktu dengan membuat variabel animasi lain untuk rotasi dan memanggil DrawScope#rotate().

val infiniteTransition = rememberInfiniteTransition(label = "infinite")
val progress = infiniteTransition.animateFloat(
initialValue = 0f,
targetValue = 1f,
animationSpec = infiniteRepeatable(
tween(4000, easing = LinearEasing),
repeatMode = RepeatMode.Reverse
),
label = "progress"
)
val rotation = infiniteTransition.animateFloat(
initialValue = 0f,
targetValue = 360f,
animationSpec = infiniteRepeatable(
tween(4000, easing = LinearEasing),
repeatMode = RepeatMode.Reverse
),
label = "rotation"
)


Box(
modifier = Modifier
.padding(16.dp)
.drawWithCache {
morphPath = morph
.toComposePath(progress = progress.value, scale = size.minDimension / 2f, path = morphPath)
onDrawBehind {
rotate(rotation.value){
translate(size.width / 2f, size.height / 2f) {
drawPath(morphPath, color = Color.Black, style = Stroke(16.dp.toPx()))
}
}

Langkah itu akan menghasilkan animasi bentuk yang berputar dan bertransformasi seperti berikut ini:

Lingkaran yang bertransformasi dan berputar

Menggambar jalur secara progresif seiring waktu

Kita punya jalurnya, dan kita membuatnya berputar seiring waktu, tetapi hasil akhir di atas menunjukkan bahwa kita hanya menggambar segmen jalur dan bukan jalur penuh. Bagaimana kita bisa mencapainya?

Pertama, kita perlu mengetahui panjang jalur, yang dapat kita peroleh dari PathMeasure. Kemudian kita bisa menggunakan PathMeasure.getSegment() untuk mendapatkan sebagian dari jalur, berdasarkan progres saat ini (totalLength * progress.value), dengan hasil yang digunakan di objek jalur baru yang disebut destinationPath.

Segmen jalur ini kemudian dapat digambar seperti berikut ini:

val pathMeasurer = remember {
PathMeasure()
}
var morphPath = remember {
Path()
}
//..


// in drawWithCache:
morphPath = morph
.toComposePath(
progress = progress.value,
scale = size.minDimension / 2f,
path = morphPath
)
pathMeasurer.setPath(morphPath, false)
val totalLength = pathMeasurer.length
destinationPath.reset()
pathMeasurer.getSegment(0f, totalLength * progress.value, destinationPath)

onDrawBehind {
rotate(rotation.value) {
translate(size.width / 2f, size.height / 2f) {
val brush = Brush.sweepGradient(colors, center = Offset(0.5f, 0.5f))

drawPath(destinationPath, brush, style = Stroke(16.dp.toPx(), cap = StrokeCap.Round))
}
}
}

Tanpa rotasi, ini memberikan hasil seperti berikut:

Dengan penambahan animasi untuk transformasi dan rotasi, kita bisa melihatnya secara perlahan-lahan bertransformasi menjadi lingkaran saat menggambar garis:

Menggambar warna gradien seiring waktu dengan garis

Sekarang karena kita sudah memiliki gambar jalur seiring waktu, kita ingin menerapkan gradien pada jalur tersebut. Pendekatan yang paling mudah adalah dengan menetapkan Brush.linearGradient() menggunakan warna yang kita inginkan untuk setiap operasi menggambar. Namun jika kita menjalankannya, kita bisa melihat bahwa ia tidak memberikan efek persis seperti yang diinginkan, gradien diterapkan pada seluruh jalur dalam satu arah, dan tidak mengikuti arah garis.

Dari gambar di bawah, Anda bisa melihat, bahwa garis ini mengikuti satu arah pada seluruh bentuk, padahal kita sebenarnya menghendaki agar garis ini berubah warna saat garis digambar di tempatnya.

Masih ingat dengan pena gel pelangi yang sangat menarik yang dulu pernah Anda miliki? Kita ingin menerapkan efek tersebut pada bentuk kami — berubah warna mengikuti arah garis yang digambar.

Untuk melakukannya, kita bisa menggunakan Brush.sweepGradient() dengan warna yang disediakan, ini memberikan efek gradien yang digambar seiring waktu.

val brush = Brush.sweepGradient(colors, center = Offset(0.5f, 0.5f))

Yang memberi kita hasil berikut:

Ini terlihat bagus! Namun, jika kita ingin punya sesuatu yang lebih umum yang dapat digunakan untuk menggambar jalur yang berubah-ubah, kita harus mengubah implementasinya menjadi seperti contoh ini.

Ringkasan

Library graphics-shapes yang baru membuka berbagai macam kemungkinan bentuk baru di Android. Contoh dalam artikel ini membuat bentuk dan menggunakannya untuk membuat status progres melingkar kustom, tetapi ada banyak kemungkinan lain yang dapat dieksplorasi dengan API baru ini untuk membuat bentuk bulat dan mentransformasikannya. Cuplikan kode selengkapnya bisa ditemukan di sini.

Berkreasi dan buatlah bentuk-bentuk yang menyenangkan! 🟩🟡💜

Cuplikan kode dalam blog ini memiliki lisensi berikut:

// Copyright 2023 Google LLC. SPDX-License-Identifier: Apache-2.0