android源码:aidl调试
1,aidl命令路径
android源码/system/tools/aidl
android源码/system/tools/hidl
android源码/system/tools$ ls
aidl hidl mkbootimg release_tools sysprop xsdc
android源码全编译后aidl命令路径:
out/host/linux-x86/bin/aidl
aidl文件编译成java或cpp后所在的路径:
out/soong/.intermediates
2,例子:
举例:ICameraServiceListener.aidl编译成cpp后的路径:
frameworks/av/camera/aidl/android/hardware/ICameraServiceListener.aidl
编译成cpp后的文件有:IXXX.aidl ==> IXXX.cpp IXXX.h BnXXX.h, BpXXX.h
out/soong/.intermediates/frameworks/av/camera$ find ./ -name *CameraServiceListener*
./libcamera_client/android_arm_armv8-a_shared/gen/aidl/android/hardware/BnCameraServiceListener.h
./libcamera_client/android_arm_armv8-a_shared/gen/aidl/android/hardware/ICameraServiceListener.cpp
./libcamera_client/android_arm_armv8-a_shared/gen/aidl/android/hardware/ICameraServiceListener.h
./libcamera_client/android_arm_armv8-a_shared/gen/aidl/android/hardware/BpCameraServiceListener.h
Android源码编译时,out/soong/.intermediates没有ICameraServiceListener.aidl编译成java的临时文件,想看的话,可以手动编译。
android_soucres$ ./out/host/linux-x86/bin/aidl --lang=java -t -I ./frameworks/base/core/java/ -p ./prebuilts/sdk/current/public/framework.aidl ./frameworks/av/camera/aidl/android/hardware/ICameraServiceListener.aidl -o ~/1_work_home/test_app/aidl/
ICameraService.aidl编译成java的文件
android_soucres$ ./out/host/linux-x86/bin/aidl --lang=java -t -I ./frameworks/base/core/java/ -I ./frameworks/av/camera/aidl/ -p ./prebuilts/sdk/current/public/framework.aidl ./frameworks/av/camera/aidl/android/hardware/ICameraService.aidl -o ~/1_work_home/test_app/aidl/
3,为什么有的ICameraServiceListener.aidl没有编译生成java的临时文件?
原因是:在Android.bp里aidl没有配置export_aidl_headers: true
为什么ICameraServiceListener.aidl没有编译生成java的临时文件?
libcamera_client_aidl分别被frameworks/base/Android.bp和frameworks/av/camera/Android.bp使用。
一个用于把aidl编译为java文件,一个用于把aidl文件编译成cpp文件。
frameworks/av/camera/Android.bp
// AIDL interface between camera clients and the camera service.
filegroup {
name: "libcamera_client_aidl", // 分别被frameworks/base/Android.bp和frameworks/av/camera/Android.bp使用。
srcs: [
"aidl/android/hardware/ICameraService.aidl",
"aidl/android/hardware/ICameraServiceListener.aidl",
"aidl/android/hardware/ICameraServiceProxy.aidl",
"aidl/android/hardware/camera2/ICameraDeviceCallbacks.aidl",
"aidl/android/hardware/camera2/ICameraDeviceUser.aidl",
"aidl/android/hardware/camera2/ICameraOfflineSession.aidl",
"aidl/android/hardware/camera2/ICameraInjectionCallback.aidl",
"aidl/android/hardware/camera2/ICameraInjectionSession.aidl",
],
path: "aidl",
}
frameworks/base/Android.bp
java_defaults {
name: "framework-minus-apex-defaults",
defaults: ["framework-aidl-export-defaults"],
srcs: [
":framework-non-updatable-sources",
"core/java/**/*.logtags",
],
aidl: {
generate_get_transaction_name: true,
+ export_aidl_headers: true, // 这样添加后,ICameraServiceListener.aidl就会编译生成java的临时文件
local_include_dirs: [
"media/aidl",
],
include_dirs: [
"frameworks/av/aidl",
"frameworks/native/libs/permission/aidl",
"packages/modules/Connectivity/framework/aidl-export",
],
},
filegroup {
name: "framework-non-updatable-sources",
srcs: [
// AIDL sources from external directories
":libcamera_client_aidl",
4,为什么ICameraServiceListener.aidl可以编译生成cpp的临时文件?
原因是:在Android.bp里aidl配置了export_aidl_headers: true
为什么ICameraServiceListener.aidl可以编译生成cpp的临时文件?
原因是:通过分析相关Android.bp文件,发现是配置export_aidl_headers: true
frameworks/av/camera/Android.bp
cc_library_shared {
name: "libcamera_client",
aidl: {
export_aidl_headers: true,
local_include_dirs: ["aidl"],
include_dirs: [
"frameworks/native/aidl/gui",
],
},
srcs: [
// AIDL files for camera interfaces
// The headers for these interfaces will be available to any modules that
// include libcamera_client, at the path "aidl/package/path/BnFoo.h"
":libcamera_client_aidl",
5,aidl 的 generate_traces配置
aidl还有个generate_traces,这样aidl转为java或cpp时添加trace,
这样通过perfetto工具抓trace时,就能很方便看到aidl的Bp端到Bn端的跳转trace了。
generate_traces: true
system/tools/aidl/Android.bp
326 cc_library_static {
327 name: "libaidl-integration-test",
328 defaults: ["aidl_test_defaults"],
329 aidl: {
330 generate_traces: true,
331 export_aidl_headers: true,
6,aidl IPC进程间通信模板
Bn: Binder Native 服务端
Bp: Binder Proxy 代理端
cpp语言:
客户端进程 (BpXXX)--binder远程调用-->(继承BnXXX) 服务端进程
class CameraService : // 服务端进程继承BnCameraService
public BinderService<CameraService>,
public virtual ::android::hardware::BnCameraService,
public virtual IBinder::DeathRecipient,
public virtual CameraProviderManager::StatusListener
{
java语言:
客户端进程 (BpXXX)--binder远程调用-->(继承Ixxx.Stub) 服务端进程
例了:
private static final class CameraManagerGlobal extends ICameraServiceListener.Stub
implements IBinder.DeathRecipient { // 服务端进程继承ICameraServiceListener.Stub
7,aidl --help
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
out/host/linux-x86/bin$ ls
BugReport badblocks build_super_image depmod fec32 ld.mc mke2fs resize2fs tinyplay validatekeymaps
aapt bcc check_partition_sizes dexdiag flags_health_check lpdump mke2fs.conf secilc toybox veridex
aapt2 bcc_strip_attr checkfc dexdump fsck.f2fs lpmake mkerofsimage.sh sefcontext_compile treble_sepolicy_tests version_policy
adb bit checkpolicy dexlist host_init_verifier lz4 mkf2fsuserimg.sh sepolicy-analyze tune2fs viewcompiler
ahat blk_alloc_to_base_fs checkseapp dump.f2fs hprof-conv make_f2fs mkfs.erofs sepolicy_tests tzdatacheck vintffm
aidl boot_signer checkvintf e2fsck idmap2 make_f2fs_casefold mkuserimg_mke2fs sgdisk unpack_bootimg
appcompat.sh brotli conv_linker_config e2fsdroid img2simg mdnsd oatdump signapk unwind_info
assemble_vintf bsdiff deapexer fastboot imgdiff minigzip post_process_props simg2img unwind_reg_info
atest-dev build_image debugfs_static fc_sort incident_report mkbootfs property_info_checker sload_f2fs unwind_symbols
avbtool build_sepolicy defrag.f2fs fec insertkeys.py mkbootimg resize.f2fs sqlite3 update-vndk-list.sh
$ ./out/host/linux-x86/bin/aidl
ERROR: No input file
: AIDL Compiler: built for platform SDK version 32
usage:
./out/host/linux-x86/bin/aidl --lang={java|cpp|ndk|rust} [OPTION]... INPUT...
Generate Java, C++ or Rust files for AIDL file(s).
./out/host/linux-x86/bin/aidl --preprocess OUTPUT INPUT...
Create an AIDL file having declarations of AIDL file(s).
./out/host/linux-x86/bin/aidl --dumpapi --out=DIR INPUT...
Dump API signature of AIDL file(s) to DIR.
./out/host/linux-x86/bin/aidl --checkapi[={compatible|equal}] OLD_DIR NEW_DIR
Check whether NEW_DIR API dump is {compatible|equal} extension
of the API dump OLD_DIR. Default: compatible
./out/host/linux-x86/bin/aidl [OPTION]... INPUT [OUTPUT]
Generate a Java file for an AIDL file.
OPTION:
-I DIR, --include=DIR
Use DIR as a search path for import statements.
-m FILE, --import=FILE
Import FILE directly without searching in the search paths.
-p FILE, --preprocessed=FILE
Include FILE which is created by --preprocess.
-d FILE, --dep=FILE
Generate dependency file as FILE. Don't use this when
there are multiple input files. Use -a then.
-o DIR, --out=DIR
Use DIR as the base output directory for generated files.
-h DIR, --header_out=DIR
Generate C++ headers under DIR.
-a
Generate dependency file next to the output file with the
name based on the input file.
-b
Trigger fail when trying to compile a parcelable.
--ninja
Generate dependency file in a format ninja understands.
--structured
Whether this interface is defined exclusively in AIDL.
It is therefore a candidate for stabilization.
--stability=<level>
The stability requirement of this interface.
-t, --trace
Include tracing code for systrace. Note that if either
the client or service code is not auto-generated by this
tool, that part will not be traced.
--transaction_names
Generate transaction names.
--apimapping
Generates a mapping of declared aidl method signatures to
the original line number. e.g.:
If line 39 of foo/bar/IFoo.aidl contains: void doFoo(int bar, String baz);
Then the result would be:
foo.bar.Baz|doFoo|int,String,|void
foo/bar/IFoo.aidl:39
-v VER, --version=VER
Set the version of the interface and parcelable to VER.
VER must be an interger greater than 0.
--hash=HASH
Set the interface hash to HASH.
--log
Information about the transaction, e.g., method name, argument
values, execution time, etc., is provided via callback.
-Werror
Turn warnings into errors.
-Wno-error=<warning>
Turn the specified warning into a warning even if -Werror is specified.
-W<warning>
Enable the specified warning.
-Wno-<warning>
Disable the specified warning.
-w
Disable all diagnostics. -w wins -Weverything
-Weverything
Enable all diagnostics.
--help
Show this help.
INPUT:
An AIDL file.
OUTPUT:
Path to the generated Java or C++ source file. This is ignored when
-o or --out is specified or the number of the input files are
more than one.
For Java, if omitted, Java source file is generated at the same
place as the input AIDL file,
HEADER_DIR:
Path to where C++ headers are generated.
demo:
android_soucres/prebuilts/sdk/current/public/framework.aidl
android_soucres/out/soong/framework.aidl
sdk/platforms/android-33/framework.aidl
android_soucres$ ./out/host/linux-x86/bin/aidl --lang=java -t -I ./frameworks/base/core/java/ -p ./prebuilts/sdk/current/public/framework.aidl ./frameworks/base/core/java/android/app/IActivityTaskManager.aidl -o ~/1_work_home/test_app/
ERROR: ./frameworks/base/core/java/android/app/IActivityTaskManager.aidl: Couldn't find import for class android.graphics.GraphicBuffer
android_soucres$ ./out/host/linux-x86/bin/aidl --lang=java -t -I ./frameworks/base/core/java/ -I ./frameworks/base/graphics/java/ -p ./prebuilts/sdk/current/public/framework.aidl ./frameworks/base/core/java/android/app/IActivityTaskManager.aidl -o ~/1_work_home/test_app/
android_soucres$ ./out/host/linux-x86/bin/aidl --lang=java -t -I ./frameworks/base/core/java/ -I ./frameworks/av/camera/aidl/ -p ./prebuilts/sdk/current/public/framework.aidl ./frameworks/av/camera/aidl/android/hardware/ICameraService.aidl -o ~/1_work_home/test_app/aidl/