安卓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
相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui