Bật dịch vụ trình bổ trợ mới cho nhà sản xuất thiết bị gốc (OEM) trong Android 14 một số thành phần của ô tô cần định cấu hình. Riêng đối với âm thanh, 3 giới thiệu các dịch vụ trình bổ trợ, cho phép OEM định cấu hình một cách linh hoạt quản lý âm thanh trên thiết bị AAOS:
- Điều khiển quyền phát âm thanh
- Điều khiển tắt tiếng và âm lượng âm thanh
- Kiểm soát giảm âm thanh
Cấu trúc dịch vụ của trình bổ trợ cho ô tô
Hình dưới đây cung cấp thông tin tổng quan về dịch vụ xe hơi và mối quan hệ của chúng cho dịch vụ nhà sản xuất thiết bị gốc (OEM) về ô tô. Tương tự như các quy trình ứng dụng và quy trình dịch vụ của ô tô, quy trình dịch vụ ô tô của OEM chiếm không gian quy trình riêng.
Dịch vụ ô tô bắt đầu dịch vụ của OEM (Nhà sản xuất thiết bị gốc) cho ô tô bằng cách tìm thành phần được xác định trong
config_oemCarService
. Nếu cấu hình này trống thì dịch vụ OEM sẽ không tồn tại
và không có dịch vụ nào được khởi động. Thành phần phải mở rộng
OemCarService.
Dịch vụ âm thanh ô tô phải ghi đè các API để lấy OEM âm thanh cho ô tô
dịch vụ:
public final class OemCarServiceImp extends OemCarService {
@Override
public OemCarAudioFocusService getOemAudioFocusService();
@Override
public OemCarAudioDuckingService getOemAudioDuckingService();
@Override
public OemCarAudioVolumeService getOemAudioVolumeService();
}
Cho
ví dụ, xem
ứng dụng kiểm thử tham chiếu được xác định trong
packages/services/Car/tests/OemCarServiceTestApp
.
Mặc dù dịch vụ bắt đầu bằng dịch vụ ô tô, nhưng dịch vụ không tự động
kế thừa các quyền có sẵn đối với dịch vụ âm thanh trên ô tô. Như vậy, bất kỳ
mà các dịch vụ OEM yêu cầu phải được cấp phép bằng
cơ chế. Ví dụ: hãy xem
packages/services/Car/data/etc/com.android.car.oemcarservice.testapp.xml
.
Dịch vụ âm thanh ô tô có cấu trúc dịch vụ của nhà sản xuất thiết bị gốc (OEM)
Trong AAOS, dịch vụ âm thanh ô tô quản lý những hành động sau:
- Định tuyến âm thanh
- Quyền phát âm thanh
- Giảm âm thanh
- Âm lượng và tắt tiếng
Trước Android 14, hành vi này chủ yếu là tĩnh và chỉ có thể sửa đổi được thông qua cài đặt, mặc dù đối với một số ít trường hợp. Android 14 ra mắt một cơ chế phát âm thanh ô tô để giao tiếp với một thành phần do OEM xác định. Thành phần này quản lý:
- Quyền phát âm thanh
- Giảm âm thanh
- Âm lượng và tắt tiếng
Hình dưới đây thể hiện kiến trúc được đơn giản hoá cho dịch vụ âm thanh ô tô và dịch vụ OEM trong ô tô. Dịch vụ âm thanh ô tô xác định nhiều nội dung hấp dẫn có thể gọi dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trong ô tô để quản lý hoạt động âm thanh. Trường hợp sau chỉ xảy ra nếu thành phần dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) tương ứng được xác định. Nếu không, giá trị dịch vụ âm thanh ô tô sử dụng hành vi mặc định.
Để đảm bảo dịch vụ âm thanh ô tô và dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) luôn hoạt động đồng bộ hoá, đối với mỗi cuộc gọi, dịch vụ âm thanh trên ô tô sẽ truyền các phần bắt buộc của trạng thái hiện tại của ngăn xếp âm thanh đến dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trong ô tô. Ví dụ: khi thì dịch vụ âm thanh trên ô tô chặn yêu cầu đánh giá quyền phát âm thanh trạng thái hiện tại của ngăn xếp cho dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) trong ô tô. Trạng thái hiện tại bao gồm nắm giữ tiêu điểm hiện tại và những biến mất tiêu điểm hiện tại. Những yếu tố làm mất tiêu điểm là các yêu cầu lấy tiêu điểm vẫn nằm trong ngăn xếp nhưng tạm thời bị mất tập trung.
Dịch vụ âm thanh trên ô tô phải quản lý tất cả hoạt động âm thanh trong ô tô. Nếu ô tô không quản lý một số phần trong hành vi âm thanh, thì thông tin tiếp xúc với dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) về ô tô chưa đầy đủ. Ví dụ: nếu OEM ghi đè tính năng xử lý quyền phát âm thanh trong dịch vụ ô tô bằng cách đăng ký do chính sách về quyền phát âm thanh của riêng họ, thì dịch vụ âm thanh ô tô sẽ không thể cung cấp đầy đủ cho dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) về ô tô. Điều này có thể ảnh hưởng đến khả năng của ô tô Dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) để đưa ra quyết định vì dịch vụ này có thể thiếu thông tin không hiển thị đến dịch vụ âm thanh ô tô.
Để thực hiện thao tác, dịch vụ âm thanh ô tô sẽ gọi cho các dịch vụ của OEM (Nhà sản xuất thiết bị gốc) dành cho ô tô. Các cuộc gọi này được thực hiện trên các quy trình đòi hỏi giao tiếp liên quy trình (IPC). IPC sẽ tăng độ trễ cho mỗi cuộc gọi. Điều quan trọng là phải giảm thiểu độ trễ trong Dịch vụ OEM.
Vì các lệnh gọi dịch vụ âm thanh trên ô tô đến dịch vụ OEM đang chặn, nên dịch vụ OEM không được gọi dịch vụ âm thanh ô tô khi đánh giá API trực tiếp. Thay vào đó, dịch vụ âm thanh ô tô cung cấp thông tin cần thiết để các lệnh gọi giữa hai quá trình chỉ cần đi theo một hướng.
Định nghĩa dịch vụ âm thanh ô tô của OEM (Nhà sản xuất thiết bị gốc)
Dịch vụ tập trung vào âm thanh của nhà sản xuất thiết bị gốc (OEM) trên ô tô
Dịch vụ âm thanh trên ô tô quản lý các yêu cầu tập trung âm thanh từ các ứng dụng bằng cách đăng ký trình nghe lấy tiêu điểm của chính sách âm thanh. Dịch vụ âm thanh ô tô có cơ chế quản lý lấy tiêu điểm dựa trên Ma trận tương tác. Ma trận xác định ba loại tương tác khác nhau:
Tương tác đồng thời. Phần giữ tiêu điểm có thể duy trì tiêu điểm ở cùng một thời điểm bất cứ lúc nào.
Tương tác độc quyền. Yêu cầu lấy tiêu điểm đến sẽ lấy tiêu điểm từ phần tử giữ tiêu điểm hiện tại.
Từ chối lượt tương tác. Yêu cầu lấy tiêu điểm đến đã bị từ chối dựa trên phần tử giữ tiêu điểm hiện tại.
Mặc dù điều này đủ cho một số trường hợp sử dụng ô tô, nhưng nó không đáp ứng tất cả
nhu cầu tương tác có thể khác do các yêu cầu của OEM. Để làm được điều này, chúng tôi
giới thiệu OemCarAudioFocusService
:
public interface OEmCarAudioFocusService {
OemCarAuddioFocusResults evaluateAudioFocusRequest(
OemCarAudioFocusEvaluationRequest request);
void notifyAudioFocusChange(
List<AudioFocusEntry> holder,
List<AudioFocusEntry> losers, int zoneId);
}
API evaluateAudioFocusRequest
sẽ được gọi qua dịch vụ âm thanh ô tô bất cứ lúc nào
có một yêu cầu về quyền phát âm thanh cần được đánh giá, đó là cách
API chặn kết quả trả về. Yêu cầu chứa thông tin
về trạng thái hiện tại của ngăn xếp âm thanh:
Thông tin này có thể được dùng để đánh giá newFocusRequest
so với
chủ sở hữu tiêu điểm hiện tại trong focusHolders
và những ứng dụng giảm tiêu điểm hiện tại ở
focusLosers
. API sẽ trả về kết quả:
class OemCarAudioFocusResult {
int audioZoneId;
int audioFocusEvaluationResults;
AudioFocusEntry focusResult;
List<AudioFocusEntry> newLosers;
List<AudioFocusEntry> newlyBlocked;
}
Thẻ này chứa thông tin về kết quả đánh giá thực tế theo
audioFocusEvaluationResults
cho biết liệu yêu cầu hiện tại đã
đã được cấp, bị hoãn lại hoặc không thành công. Mọi thay đổi đối với ngăn xếp tiêu điểm hiện tại
phải được thiết lập trong các mục nhập newLosers
và newlyBlocked
, tuỳ thuộc vào bản chất
thay đổi của ngăn xếp.
Trong trường hợp newLosers
chứa các mục nhập từng giữ tiêu điểm nhưng
giờ đây sẽ mất tiêu điểm, vĩnh viễn hoặc tạm thời. Chỉ mất tập trung vào vĩnh viễn
sẽ bị xoá thêm khỏi ngăn xếp tiêu điểm âm thanh và những thành phần mất tiêu điểm tạm thời
sẽ được chuyển sang ngăn xếp biến mất tiêu điểm hiện tại cho đến khi chúng lấy lại tiêu điểm hoặc
bị loại bỏ khỏi đối tượng yêu cầu lấy tiêu điểm ban đầu. Bất kể thế nào, trình nghe tiêu điểm cho
các yêu cầu sẽ nhận được tiêu điểm bị mất tương ứng.
Danh sách newlyBlocked
chứa các mục nhập trước đây nằm trong thành phần mất tiêu điểm
nhưng hiện bị chặn bởi mục nhập mới. Việc chặn có thể là vĩnh viễn hoặc
tạm thời, đối với tiêu điểm vĩnh viễn bị chặn, mục nhập sẽ bị xoá khỏi ngăn xếp
và mất tiêu điểm sẽ được gửi đến
trình nghe tập trung. Đối với trường hợp mất tiêu điểm tạm thời,
mục nhập đó vẫn sẽ nằm trong ngăn xếp yếu tố làm mất tiêu điểm nhưng một trình chặn tiêu điểm mới sẽ
được thêm vào danh sách trình chặn, thì sẽ không có sự kiện mất tiêu điểm nào được gửi như trước đây
gửi khi tệp bị chặn lần đầu tiên. Cuối cùng, yêu cầu sẽ được bỏ chặn khi tất cả
các trình chặn hiện tại bị gỡ bỏ hoặc sẽ bị xoá khỏi ngăn xếp nếu tiêu điểm là
bị bỏ qua.
API thứ hai, notifyAudioFocusChange
, là một cách được gọi trên mỗi
bỏ qua hoặc yêu cầu tập trung âm thanh. API này chủ yếu được dùng để thông báo dịch vụ OEM
về những thay đổi về tiêu điểm. Những thay đổi này có thể ảnh hưởng đến hoạt động của dịch vụ âm thanh ô tô của OEM.
Nguyên tắc đánh giá tiêu điểm
Trong AAOS, quyền phát âm thanh được dùng để quản lý việc phát âm thanh và xác định xem ứng dụng phải tuân thủ nhằm mang lại trải nghiệm tối ưu cho người dùng. Do vậy, dịch vụ trình bổ trợ OEM cần xem xét những điều sau đây khi quản lý yêu cầu quyền phát âm thanh:
Khi không có bất kỳ quyền phát âm thanh có mức độ ưu tiên cao nào (chẳng hạn như gọi điện thoại, ứng dụng khẩn cấp hoặc an toàn) đều phải có thể lấy được quyền phát âm thanh tạm thời hoặc vĩnh viễn.
Khi tiêu điểm nghe nhìn đang hoạt động, các ứng dụng sẽ yêu cầu:
Tập trung vào việc sử dụng cuộc gọi, phải có thể nhận tiêu điểm đồng thời hoặc độc quyền.
Tiêu điểm sử dụng thành phần điều hướng phải có thể nhận tiêu điểm đồng thời hoặc độc quyền.
Chế độ tập trung vào việc sử dụng Trợ lý, sẽ có thể nhận tiêu điểm đồng thời hoặc độc quyền.
Trong khi đứng để tập trung vào âm thanh có mức độ ưu tiên cao (chẳng hạn như cuộc gọi điện thoại, trường hợp khẩn cấp cảnh báo hoặc cảnh báo an toàn) đang hoạt động và có bất cứ tập trung vào âm thanh nào bị trễ nên được chấp thuận hoặc trì hoãn nếu cần.
Mặc dù các đề xuất ở trên chưa đầy đủ nhưng chúng có thể giúp đảm bảo rằng các ứng dụng yêu cầu lấy tiêu điểm phải có thể lấy tiêu điểm khi không có tâm điểm nào đang hoạt động âm thanh có mức độ ưu tiên cao. Ngay cả khi các âm thanh có mức độ ưu tiên cao đang hoạt động, thì việc lấy nét bị trễ các yêu cầu vẫn được tôn trọng và có thể được chú ý sau khi âm thanh có mức ưu tiên cao sẽ dừng.
Dịch vụ âm lượng xe của OEM
Dịch vụ âm thanh trên ô tô quản lý các sự kiện nhấn phím âm lượng bằng cách nghe âm lượng các mức điều chỉnh khác trong hệ thống âm thanh hoặc nghe trực tiếp các sự kiện nhấn phím âm lượng từ dịch vụ nhập dữ liệu của ô tô. Trong mỗi trường hợp, hành vi mặc định của ô tô dịch vụ âm thanh là để xác định nhóm âm lượng nào cần thay đổi dựa trên trình phát âm thanh và danh sách ưu tiên ngữ cảnh âm thanh.
Chúng tôi cung cấp hai danh sách ưu tiên số lượng. Danh sách đầu tiên xem xét mọi âm thanh ngữ cảnh theo thứ tự này. Danh sách được trình bày theo thứ tự giảm dần, thứ tự cao nhất mức độ ưu tiên ở trên cùng và mức độ ưu tiên thấp nhất ở dưới cùng. Ví dụ: nếu cả âm thanh điều hướng và âm thanh nhạc đều hoạt động cùng một lúc, sau đó âm lượng điều hướng thay đổi trong một sự kiện nhấn phím âm lượng.
- Di chuyển
- Gọi
- Âm nhạc
- Thông báo
- Lệnh thoại
- Chuông cuộc gọi
- Âm hệ thống
- An toàn
- Chuông báo
- Thông báo
- Trạng thái xe
- Khẩn cấp
Để việc quản lý sự kiện liên quan đến phím âm lượng trở nên đơn giản hơn, dịch vụ âm thanh ô tô có một danh sách ngữ cảnh âm thanh ưu tiên thứ hai:
- Gọi
- Nội dung nghe nhìn
- Thông báo
- Lệnh thoại
Danh sách này cũng được trình bày theo thứ tự giảm dần. Mục đích của danh sách sec này là cho phép thay đổi những âm thanh phổ biến thông qua các sự kiện chính. Không phổ biến, Bạn có thể quản lý những âm thanh có thời lượng ngắn thông qua phần cài đặt âm thanh Chỉ giao diện người dùng.
Bạn có thể đặt phiên bản thực tế của âm lượng bằng
Cấu hình audioVolumeAdjustmentContextsVersion
. Cấu hình có thể là
được đặt thành 1
hoặc 2
(2
là giá trị mặc định).
Để linh hoạt hơn trong việc quản lý số lượng,
OemCarAudioVolumeService
được ra mắt trong Android 14:
public interface OemCarAudioVolumeService {
OemCarvolumeChangeInfo getSuggestedGroupForVolumeChange(
OemCarAudioVolumeRequest request, int volumeAdjustment);
}
Dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM) có một phương thức duy nhất, lấy một
volumeAdjustment
và một OemCarAudioVolumeRequest
:
class OemCarAudioVolumeRequest {
int audioZoneId;
int callState;
List<AudioAttributes> activePlaybackAttributes;
List<AudioAttributes> duckedAttributes;
List<CarVolumeGroupInfo> volumeGroupState;
}
activePlaybackAttributes
của yêu cầu có các thuộc tính âm thanh đang hoạt động. Chiến lược phát hành đĩa đơn
duckedAttributes
hiện là tất cả các thuộc tính âm thanh đã được giảm âm thanh. Chiến lược phát hành đĩa đơn
volumeGroupState
có trạng thái hiện tại của nhóm tập. Yêu cầu
biểu thị trạng thái hiện tại của ngăn xếp âm thanh và có thể dùng để xác định
nhóm âm lượng nào sẽ được thay đổi. Kết quả phải được trả về trong
OemCarVolumeChangeInfo
:
class OemCarVolumeChangeInfo {
boolean change;
CarVolumeGroupInfo volumeGroupChanged;
}
Giá trị boolean change
cho biết liệu có bất kỳ âm lượng nào đã thay đổi hay không, true
cho biết rằng
có thay đổi và nhóm âm lượng sẽ được cập nhật. Chiến lược phát hành đĩa đơn
volumeGroupChanged
là nhóm âm lượng thực tế cần được thay đổi. Chiến dịch này
nhóm phải được thay đổi theo tham số volumeAdjustment
ban đầu
được truyền đến API. Ví dụ: nếu kết quả chỉ ra rằng thao tác điều hướng
nhóm âm lượng sẽ bị tắt tiếng, thì boolean sẽ là true
và giá trị được trả về
nhóm âm lượng nên là nhóm điều hướng.
Dịch vụ giảm chấn ô tô của nhà sản xuất thiết bị gốc (OEM)
Dịch vụ âm thanh trên ô tô quản lý tính năng giảm âm thanh bằng cách theo dõi các thay đổi về quyền phát âm thanh và
đang gửi tín hiệu đến HAL AudioControl
về thiết bị âm thanh cần giảm kích thước.
Khi tiêu điểm thay đổi, tất cả các đối tượng giữ tiêu điểm đang hoạt động sẽ được đánh giá để xác định
cần được giảm bớt dựa trên nhóm giảm hiệu suất tĩnh này
quy tắc:
- Âm thanh khẩn cấp sẽ loại bỏ mọi thứ trừ âm thanh cuộc gọi
- Tính năng an toàn sẽ tắt mọi âm thanh ngoại trừ âm thanh khẩn cấp
- Tính năng chỉ đường sẽ tắt mọi âm thanh ngoại trừ âm thanh an toàn và khẩn cấp
- Tắt tiếng mọi thứ trừ âm thanh an toàn, khẩn cấp và chỉ đường
- Tắt tiếng chuông báo khi cuộc gọi bị tắt
- Bạn nên giảm bớt nội dung âm nhạc và thông báo
Những quy tắc này chưa đầy đủ và OEM vẫn chịu trách nhiệm xác định
cách giảm âm thanh dựa trên những nguyên tắc này. OEM có thể kiểm soát những thông tin này
đưa ra đề xuất một cách chủ động hơn dựa trên các yêu cầu hiện có. Chiến lược phát hành đĩa đơn
OemCarDuckingService
được ra mắt trong Android 14:
class OemCarAudioDuckingService {
List<AudioAttributes> evaluateAttributesToDuck(
OemCarAudioVolumeRequest request);
}
API này được gọi qua dịch vụ âm thanh ô tô khi thay đổi quyền phát âm thanh. Tái sử dụng
OemCarAudioVolumeRequest
được giới thiệu trong
Dịch vụ âm lượng ô tô của OEM và chứa thông tin liên quan
để đưa ra quyết định về thuộc tính nào cần tránh xa. Danh sách
thuộc tính âm thanh cần bỏ qua API được so sánh với trạng thái âm thanh hiện tại:
Thuộc tính âm thanh hiện đang được giảm bớt:
- Trong danh sách, tiếp tục bị ẩn
- Không có trong danh sách, tính năng giảm hiệu suất đã tắt
Thuộc tính âm thanh hiện chưa được điều chỉnh:
- Đã ẩn vào danh sách
- Không có trong danh sách, tính năng giảm hiệu suất đã tắt
Sau đó, dịch vụ âm thanh trên ô tô sẽ xác định những thiết bị đầu ra âm thanh hiển thị âm thanh đều thuộc và thêm chúng vào danh sách thiết bị đầu ra âm thanh đã giảm hoặc danh sách thiết bị âm thanh không được bật tiếng tương ứng. Cuối cùng, điều này sẽ được gửi đến AudioControl HAL để thực hiện cần phải giảm ở cấp độ phần cứng.
Hình dưới đây là một sơ đồ trình tự đơn giản hoá quy trình giảm âm thanh khả năng kiểm soát yêu cầu lấy tiêu điểm khi sử dụng dịch vụ giảm vị trí của OEM:
Trình tự bắt đầu khi một ứng dụng yêu cầu
Quản lý quyền phát âm thanh
thông qua các API trình quản lý âm thanh công khai. Yêu cầu được chuyển tiếp đến hệ thống âm thanh của ô tô
để xác định kết quả. Khi quyền phát âm thanh được quyết định, âm thanh sẽ giảm
sẽ được dịch vụ âm thanh trên ô tô gọi OemCarAudioDuckingService
để đánh giá
đánh giá xem thuộc tính âm thanh nào cần được giảm bớt. Sau khi kết quả được trả về
từ API evaluateAttributesToDuck
, các thiết bị âm thanh đến vị trí sẽ được tính toán,
và cuối cùng thông tin được gửi đến AudioControl
để áp dụng tính năng giảm hiệu suất
vào phần cứng âm thanh.
Triển khai tham chiếu dịch vụ âm thanh của nhà sản xuất thiết bị gốc (OEM)
AAOS cung cấp cách triển khai tham chiếu dịch vụ ô tô của OEM theo
packages/services/Car/tests/OemCarServiceTestApp
, triển khai
OemCarService
cùng với OemCarAudioFocusService
,
OemCarAudioDuckingService
và OemCarAudioVolumeService
. Đối với phương thức thanh toán thứ hai,
mỗi dịch vụ sử dụng và tệp XML để tải một hành vi tĩnh. Ví dụ:
OemCarAudioFocusServiceImp
sẽ tải oem_focus_config.xml
chứa ma trận tương tác. Ma trận dùng để đánh giá yêu cầu lấy tiêu điểm
khi evaluateAudioFocusRequest
được gọi.
Tham chiếu gỡ lỗi ứng dụng kiểm thử
Ứng dụng kiểm tra dịch vụ ô tô của OEM là một phần của mã nguồn AOSP. OEM có thể tạo
thay đổi theo nhu cầu của họ. Để gỡ lỗi, hãy dùng config_oemCarService
để bật ứng dụng thử nghiệm.
<!-- This is the component name for the OEM customization service. OEM can choose to implement
this service to customize car service behavior for different policies. If OEMs choose to
implement it, they have to implement a service extending OemCarService exposed by car-lib,
and implement the required component services.
If the component name is invalid, CarService would not connect to any OEM service.
Component name can not be a third party package. It should be pre-installed -->
<string name="config_oemCarService" translatable="false">
com.android.car.oemcarservice.testapp/.OemCarServiceImpl
</string>
Để xác minh dịch vụ ô tô của OEM, hãy sử dụng lệnh dump
của dịch vụ ô tô cho
Dịch vụ OEM:
adb shell dumpsys car_service --oem-service
Kết quả có thể tương tự như kết quả dưới đây:
***CarOemProxyService dump***
mIsFeatureEnabled: true
mIsOemServiceBound: true
mIsOemServiceReady: true
mIsOemServiceConnected: true
mInitComplete: true
OEM_CAR_SERVICE_CONNECTED_TIMEOUT_MS: 5000
OEM_CAR_SERVICE_READY_TIMEOUT_MS: 5000
mComponentName: com.android.car.oemcarservice.testapp/.OemCarServiceImpl
Mỗi boolean trong mỗi lô thông tin dump
sẽ xác định trạng thái của tính năng
và dịch vụ của bạn. Ví dụ: thông tin tệp kết xuất mIsOemServiceReady
sẽ chỉ định liệu giá trị
dịch vụ đã sẵn sàng để sử dụng, trong đó true
cho biết dịch vụ đã sẵn sàng và false
cho biết dữ liệu chưa sẵn sàng.