安卓HAL C++基础-命名域

🏠 1. namespace = 门牌号

代码里重名太多,namespace 就是给每个名字加个前缀来区分。

比如你的项目里有两个 android

复制代码
// 系统库里的原始 android
::android::ProcessState           // 位置:全局 → android

// AIDL 自动生成的 android
aidl::android::hardware::testtld::IHelloTest   // 位置:全局 → aidl → android → ...

都叫 android,但不在一个"家"里。

📌 2. using XXX = 给一个人发门禁卡

复制代码
using aidl::android::hardware::testtld::IHelloTest;

效果:之后写 IHelloTest 就等于写 aidl::android::hardware::testtld::IHelloTest

只给 这一个人 省掉了全名,其他人不受影响。

🏢 3. using namespace XXX = 给整个楼发门禁卡

复制代码
using namespace aidl::android::hardware::testtld;
//               ↑ 注意是 namespace,不是具体类名

效果:把 aidl::android::hardware::testtld 这个楼里所有人都请进来了。

之后你可以直接写:

复制代码
IHelloTest       // 不用前缀
HelloTest        // 如果楼里还有别的类,也都能直接写

对比:

复制代码
// using 单个名字 --- 只请一个人
using aidl::android::hardware::testtld::IHelloTest;
IHelloTest x;  ✅
IHelloTest::HelloTest y;     // ✅ 通过外层类名访问
HelloTest  y;  ❌ 还得写全名

// using namespace --- 请整个楼
using namespace aidl::android::hardware::testtld;
IHelloTest x;  ✅
HelloTest  y;  ✅ 如果楼里有的话

危险在哪? 请的人多了,名字冲突的概率就高了。所以 using namespace std; 在很多项目里被禁用------它把 std 里几百个名字全倒进来了。


🔀 4. 冲突怎么来的

你写了:

复制代码
using aidl::android::hardware::testtld::IHelloTest;

编译器记住了 aidl::android 这条路径。然后你写:

复制代码
android::ProcessState

编译器优先顺着你 using 记下的路径去找 → aidl::android::ProcessState → 不存在 → 报错。

它不会自动跳回顶层的 ::android::ProcessState

🔑 5. :: = 绝对路径

前面加 :: 就是"从顶层根目录开始,忽略所有 using":

复制代码
::android::ProcessState    // 无视 using,从全局根 → android → 找到了

类比文件路径:

复制代码
android::ProcessState    // 像相对路径:从当前位置找 → 跑偏了
::android::ProcessState  // 像绝对路径:从 / 根目录找 → 稳定

📊 你的代码里实际发生了什么

复制代码
#include <aidl/android/hardware/testtld/IHelloTest.h>
// 这个头文件里定义了:namespace aidl { namespace android { namespace hardware { namespace testtld { ... } } } }

using aidl::android::hardware::testtld::IHelloTest;
// compiler: 好的,我记住了 aidl::android 这条路

int main() {
    ::android::ProcessState::initWithDriver("/dev/vndbinder");
    //  ↑ 双冒号:别管 using,从全局根开始找 android → 找到系统库的 → ✅

    std::shared_ptr<IHelloTest> service = ...
    //                ↑ 没写全名,compiler 查 using 列表 → 找到了 → ✅

    AServiceManager_waitForService("android.hardware.testtld.IHelloTest/default")
    // 这是字符串,不是 C++ 标识符,不受 namespace 影响 → ✅
}

🎯 一句话总结

概念 类比 写法
namespace 门牌号/文件夹路径 aidl::android::hardware
using XXX 给一个人免写全名 using aidl::...::IHelloTest;
using namespace XXX 给一栋楼所有人免写全名 using namespace aidl::...;
::XXX 绝对路径,无视所有 using ::android::ProcessState
相关推荐
JohnnyDeng943 小时前
【Android】Hilt 依赖注入:原理与最佳实践
android·kotlin·mvvm·hilt
星间都市山脉6 小时前
Android STS(Security Test Suite)完整介绍与测试流程
android·java·linux·windows·ubuntu·android studio·androidx
Yeyu7 小时前
你真的了解AIDL吗? 附:AIDL 与 Binder 交互全解析
android
dualven_in_csdn9 小时前
一键起飞调用示例
android·java·javascript
故渊at9 小时前
第十板块:Android 系统稳定性与调试 | 第二十五篇:Watchdog 与 ANR 的系统级监控
android·watchdog·系统稳定性·anr·超时监控
故渊at10 小时前
第十板块:Android 系统稳定性与调试 | 第二十六篇:Systrace 与 Perfetto 的系统级性能分析
android·perfetto·性能分析·systrace·系统稳定性
吕工-老船长199810 小时前
20260610----S905Y5(Android14)-----连接网络自动更新时间,时间设置为24小时
android
杉氧11 小时前
Kotlin 协程深度解析④:架构实战——在 MVVM/MVI 中的进阶应用
android·kotlin
Ab_stupid11 小时前
CTF-Android培训笔记
android·笔记