Việc đầu tiên khi học Android bạn phải nắm được tổng quan về cấu trúc của một project android, nó gồm những thành phần nào, liên kết với nhau ra sao. Hãy thử tạo một Android Project bằng Android Studio và cùng tìm hiểu thông qua phần giải thích dưới đây. Let's go!
Sau khi tạo một project bằng android studio bạn sẽ thấy được cấu trúc giống như hình bên trên. Với các bạn mới làm quen nên chọn mode “Android”, Android studio sẽ chỉ hiển thị những file cần thiết với project. Nếu bạn muốn xem toàn bộ các file, cách project được lưu dưới ổ cứng của máy tính thì có thể chọn “Project”
I. Gradle
Để Android Studio build ra được file APK (hoặc AAB - Android App Bundle) và cài được trên thiết bị nó dùng đến hệ thống build đc gọi là Gradle.
1. Build.Gradle
1. Build.Gradle
file build.gradle (Project: tên project của bạn) được gọi là root gradle, file này định nghĩa gradle version project của bạn dùng để build, các config chung cho toàn bộ app, toàn bộ các module. Nơi download các thư viện được khai báo trong “repositories”. Ví dụ ứng dụng có thể chứa các thư viện từ google (androidx, jetpack … ), facebook (accountkit, stetho ... ) thì sẽ phải định nghĩa nơi mà các thư viện đó được download tại đây.
file build.grale (Module: tên module) là file gradle tương ứng của các module, mỗi module có thể dependencies vào các thư viện, các config khác nhau, vì vậy tương ứng với mỗi module trong app sẽ có 1 file build.gradle. Trong file này có thể định nghĩa version tối thiểu ứng dụng hỗ trợ, target version, version code, version name, các thư viện được dùng trong module
Chú ý: 1 ứng dụng có thể có nhiều module, ngay khi khởi tạo project thì project của bạn chỉ có 1 module là “app”, sau này khi mở rộng ứng dụng có thể có thêm nhiều library module giúp việc tổ chức code, làm việc trong team, architecture đc tốt hơn (Nếu quan tâm các bạn có thể search keyword “Android Modulazation”, sample có thể follow “Plaid” trên github)
2. Setting.Gradle
File liệt kê các module được build trong ứng dụng
3. Gradle.properties
Liệt kê các config khi build Gradle ví dụ Max Ram sẽ dùng khi build, có build parallel hay không ...
4. Gradle-wrapper.properties
File mô tả gradle version sẽ build ứng dụng
5. Proguard-rules.pro
Khi bạn build release lên Play Store, ứng dụng của bạn rất có thể bị dịch ngược và kẻ xấu sẽ đọc được những đoạn code mà bạn viết từ đó có thể “clone” ra ứng dụng giả mạo. Việc thiết lập các config trong file này sẽ giúp cho quá trình đọc code sau khi dịch ngược APK trở nên khó khăn hơn (ở đây mình nói khó khăn hơn thôi nhé, các cao thủ vẫn đọc được bình thường).
Chú ý: 1 ứng dụng có thể có nhiều module, ngay khi khởi tạo project thì project của bạn chỉ có 1 module là “app”, sau này khi mở rộng ứng dụng có thể có thêm nhiều library module giúp việc tổ chức code, làm việc trong team, architecture đc tốt hơn (Nếu quan tâm các bạn có thể search keyword “Android Modulazation”, sample có thể follow “Plaid” trên github)
2. Setting.Gradle
File liệt kê các module được build trong ứng dụng
3. Gradle.properties
Liệt kê các config khi build Gradle ví dụ Max Ram sẽ dùng khi build, có build parallel hay không ...
4. Gradle-wrapper.properties
File mô tả gradle version sẽ build ứng dụng
5. Proguard-rules.pro
Khi bạn build release lên Play Store, ứng dụng của bạn rất có thể bị dịch ngược và kẻ xấu sẽ đọc được những đoạn code mà bạn viết từ đó có thể “clone” ra ứng dụng giả mạo. Việc thiết lập các config trong file này sẽ giúp cho quá trình đọc code sau khi dịch ngược APK trở nên khó khăn hơn (ở đây mình nói khó khăn hơn thôi nhé, các cao thủ vẫn đọc được bình thường).
II. Source Code
1. Manifest:
File quan trọng trong ứng dụng của bạn, nó như 1 tập tin “meta data” của app chứa các thông tin sau
App của bạn cần những quyền gì để hoạt động (location, contact, storage …)
Các Component cũng được định nghĩa ở đây, các Activity, Service, BroadCast, Activity nào sẽ được chạy khi người dùng nhấn vào launcher
Các event mà ứng dụng của bạn có thể xử lý được (Deeplink)
Config theme, app name, app icon …
2. Java Package
Chứa các file source code (Java, Kotlin)
Test source code (Unit Test, UI Test)
3. Java (generated)
Trong quá trình build time ứng dụng có thể xử lý các Anotation để generate ra các file source. Bạn có thể hiểu rằng thay vì viết full source thì bạn dùng Anotation để viết tóm tắt các file đó, sau đó nó sẽ được generate ra full source lúc build time (ví dụ Dagger2)
File quan trọng trong ứng dụng của bạn, nó như 1 tập tin “meta data” của app chứa các thông tin sau
App của bạn cần những quyền gì để hoạt động (location, contact, storage …)
Các Component cũng được định nghĩa ở đây, các Activity, Service, BroadCast, Activity nào sẽ được chạy khi người dùng nhấn vào launcher
Các event mà ứng dụng của bạn có thể xử lý được (Deeplink)
Config theme, app name, app icon …
2. Java Package
Chứa các file source code (Java, Kotlin)
Test source code (Unit Test, UI Test)
3. Java (generated)
Trong quá trình build time ứng dụng có thể xử lý các Anotation để generate ra các file source. Bạn có thể hiểu rằng thay vì viết full source thì bạn dùng Anotation để viết tóm tắt các file đó, sau đó nó sẽ được generate ra full source lúc build time (ví dụ Dagger2)
III. Resource
1. Drawable
Chứa icon, image, các file định nghĩa background, selector bằng xml
2. Layout
Chứa các file layout trong ứng dụng bằng xml
3. Values
Chứa các file định nghĩa string, color, dimen, styles
Ví dụ: Ứng dụng của bạn hỗ trợ nhiều ngôn ngữ thì các câu, các từ sẽ được định nghĩa tại các thư mục values khác nhau values-en (English) values-vi (Việt nam) values-th (Thailand) …
dimens chứa các định nghĩa về padding, margin, text size của ứng dụng
styles là 1 phần quan trọng trong project thực tế, các bạn có thể tìm hiểu sâu sau khi học xong các phần cơ bản. Nó giúp cho việc consistency design trong toàn bộ app, dễ dàng maintain khi design thay đổi.
Chứa icon, image, các file định nghĩa background, selector bằng xml
2. Layout
Chứa các file layout trong ứng dụng bằng xml
3. Values
Chứa các file định nghĩa string, color, dimen, styles
Ví dụ: Ứng dụng của bạn hỗ trợ nhiều ngôn ngữ thì các câu, các từ sẽ được định nghĩa tại các thư mục values khác nhau values-en (English) values-vi (Việt nam) values-th (Thailand) …
dimens chứa các định nghĩa về padding, margin, text size của ứng dụng
styles là 1 phần quan trọng trong project thực tế, các bạn có thể tìm hiểu sâu sau khi học xong các phần cơ bản. Nó giúp cho việc consistency design trong toàn bộ app, dễ dàng maintain khi design thay đổi.
IV. Dependencies
Nhìn chung, 1 ứng dụng luôn phụ thuộc (Dependency) vào các Android class hoặc các thư viện ngoài (3rd party library) có thể là HTTP library, Image loader library, database …
Trong project có 2 cách để sử dụng dependency thông qua manual hoặc automation.
1. Manual
Bạn tự import các thư viện bằng tay (copy vào thư mục libs), các thư viện này có thể là các file .aar (thư viện chứa layout) hoặc file .jar (thư viện chỉ chưa source). Nó được dùng khi share internal giữa các project trong công ty ít có sự thay đổi, nếu thay đổi thì sẽ phải copy lại file đó.
2. Automation
Bên trên bạn đã hiểu qua về các thành phần khai báo trong “repositories”, các thư viện của bạn có thể được download về từ đó, để sử dụng thư viện bạn sẽ khai báo implementation, api trong dependencies của các file build.gradle (mình sẽ giải thích sự khác nhau implementation và api) trong phần sau.
Hi vọng phần chia sẻ trên đây đã giúp các bạn có cái nhìn rõ hơn về cấu trúc của một android project đơn giản, nếu thấy hữu ích vui lòng nhấn like ủng hộ mình :D
Trong project có 2 cách để sử dụng dependency thông qua manual hoặc automation.
1. Manual
Bạn tự import các thư viện bằng tay (copy vào thư mục libs), các thư viện này có thể là các file .aar (thư viện chứa layout) hoặc file .jar (thư viện chỉ chưa source). Nó được dùng khi share internal giữa các project trong công ty ít có sự thay đổi, nếu thay đổi thì sẽ phải copy lại file đó.
2. Automation
Bên trên bạn đã hiểu qua về các thành phần khai báo trong “repositories”, các thư viện của bạn có thể được download về từ đó, để sử dụng thư viện bạn sẽ khai báo implementation, api trong dependencies của các file build.gradle (mình sẽ giải thích sự khác nhau implementation và api) trong phần sau.
Hi vọng phần chia sẻ trên đây đã giúp các bạn có cái nhìn rõ hơn về cấu trúc của một android project đơn giản, nếu thấy hữu ích vui lòng nhấn like ủng hộ mình :D