android源码:aidl调试

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/
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值