• Android模拟器中替换库和img


    1. 在 ubuntu 安装 vscode

    1.1 官网下载

    https://code.visualstudio.com/

    在这里插入图片描述

    1.2 双击下载好的 deb 文件,点击 install 进行安装

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    1.3 在设置里面搜索 vscode 打开

    在这里插入图片描述

    在这里插入图片描述

    2. 修改验证 Android Camera Java Framework

    2.1 打开文件夹

    在这里插入图片描述

    选择这个路径 /home/hg/android-12.1.0_r4/frameworks/base/core/java/android/hardware

    在这里插入图片描述
    在这里插入图片描述

    2.2 添加代码,并保存

    Log.i(TAG, "hugang openCameraForUid cameraId:" + cameraId);
    
    • 1

    在这里插入图片描述

    2.3 编译 systemimage

    cd ~/android-12.1.0_r4
    su
    source build/envsetup.sh
    lunch sdk_phone_x86_64
    make systemimage
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    2.4 编译报错

    [W][2022-11-03T23:42:23-0700][9508] void cmdline::logParams(nsjconf_t *)():250 Process will be UID/EUID=0 in the global user namespace, and will have user root-level access to files
    [W][2022-11-03T23:42:23-0700][9508] void cmdline::logParams(nsjconf_t *)():260 Process will be GID/EGID=0 in the global user namespace, and will have group root-level access to files
    In file included from build/make/core/config.mk:1164:
    In file included from build/make/core/soong_config.mk:12:
    build/make/core/dex_preopt_config.mk:157: error: fopen failed.
    23:42:23 dumpvars failed with: exit status 1
    
    #### failed to build some targets (1 seconds) ####
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.5 解决办法:

    cd  ~/android-12.1.0_r4
    chmod 777 out/ -R
    
    • 1
    • 2

    在这里插入图片描述

    2.6 再次编译

    make systemimage
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    2.7 拷贝 system-qemu.img 到 windows

    拷贝 /home/hg/android-12.1.0_r4/out/target/product 路径下的 system-qemu.img 到 windows 的 H:\Sdk\system-images\android-32\google_apis\x86_64

    在这里插入图片描述

    在这里插入图片描述

    2.8 将原来的 system.img 删掉

    在这里插入图片描述

    2.9 将 system-qemu.img 的文件名改为 system.img

    在这里插入图片描述

    2.10 启动模拟器

    H:
    cd H:\Sdk\emulator
    .\emulator.exe -writable-system -avd Pixel_XL_API_32_2 -no-snapshot-load -qemu
    
    • 1
    • 2
    • 3

    2.11 重新打开一个 cmd,输入打印 log 的命令

    logcat -c
    logcat |grep -iE "hugang"
    
    • 1
    • 2

    2.12 点击模拟器的 camera app

    在这里插入图片描述

    cmd 中就打印出了我们在 CameraManager.java 中加入的 log

    在这里插入图片描述

    3. 修改验证 Android Camera Native Framework

    3.1 打开文件夹

    在这里插入图片描述

    打开文件夹 /home/hg/android-12.1.0_r4/frameworks/av/services/camera/libcameraservice

    在这里插入图片描述
    在这里插入图片描述

    3.2 修改 CameraService.cpp 的 connectHelper 函数中的打印在这里插入图片描述

    在它的打印里面加上 “hugang”,然后保存

    在这里插入图片描述

    3.3 编译

    cd ~/android-12.1.0_r4
    source build/envsetup.sh
    lunch sdk_phone_x86_64
    m libcameraservice
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    在 /home/hg/android-12.1.0_r4/out/target/product/emulator_x86_64/system 路径下,有 lib 和 lib64 两个文件夹,里面分别有编译生成的 32位 和 64位的 libcameraservice.so

    在这里插入图片描述

    在这里插入图片描述

    3.4 查看Android 模拟器中使用的 libcameraservice.so 是 32位 还是 64位

    打开一个 cmd,输入以下命令**

    adb shell
    cd system
    #通过 ls 命令可以打印 system 目录下的文件夹,包含 lib 和 lib64
    ls
    find . -name libcameraservice.so
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    通过打印我们可以看到只有 lib64 文件夹下面有 libcameraservice.so,说明模拟器的 libcameraservice.so 是64位的。
    把编译好的64位的 libcameraserice.so(就是 lib64目录下的 libcameraserice.so) 拷贝到windows

    在这里插入图片描述

    在这里插入图片描述
    libcameraservice.so 可以拷贝到 windows 的任意路径

    3.5 将 64位的 libcameraservice.so push 到 模拟器

    adb push H:\Sdk\emulator\libcameraservice.so  /system/lib64/
    
    • 1

    3.6 报错

    在这里插入图片描述

    C:\Users\27531>adb push H:\Sdk\emulator\libcameraservice.so  /system/lib64/
    adb: error: failed to copy 'H:\Sdk\emulator\libcameraservice.so' to '/system/lib64/libcameraservice.so': remote couldn't create file: Read-only file system
    H:\Sdk\emulator\libcameraservice.so: 1 file pushed, 0 skipped. 101.4 MB/s (2310400 bytes in 0.022s)
    
    • 1
    • 2
    • 3

    3.7 解决报错

    输入下面的命令

    adb root && adb remount
    
    • 1

    再次 push

    adb push H:\Sdk\emulator\libcameraservice.so  /system/lib64/
    adb shell sync
    
    • 1
    • 2

    在这里插入图片描述

    3.8 重启 cameraserver 进程

    首先,找到 camera 的进程号

    adb shell
    #找到 camera 的进程号
    ps -A |grep -i camera
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    这里,我的模拟器的 camera 的进程号是 469
    然后,杀掉这个 469 进程

    kill -9 469
    
    • 1

    杀掉这个 469 进程后,Android 会自动再次为我们分配一个 cameraserver 的进程,然后加载到我们 Push 进去的 libcameraservice.so
    再次,查看 cameraserver 的进程号

    ps -A |grep -i camera
    
    • 1

    在这里插入图片描述
    此时发现 cameraerver 的进程号变为了 2237,说明Android已经重新启动了新的 cameraserver 进程。
    现在,cameraserver 进程已经加载到了我们 push 的 libcameraservice.so ,我们可以打开 模拟器的 camera app 查看打印来验证。

    3.9 验证

    输入下面的命令

    logcat -c
    logcat |grep -i hugang
    
    • 1
    • 2

    在这里插入图片描述

    然后打开 模拟器的 camera app

    在这里插入图片描述

    日志打印出了我们在 CameraService.cpp 中加入的 log

    在这里插入图片描述

    在这里插入图片描述

    4. 修改验证 后置摄像头 HAL 代码

    4.1 修改文件的 log

    使用 VSCode 打开相应的文件夹

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在 cameraDeviceOpen 函数的打印里面 加上 hugang,然后保存

    在这里插入图片描述

    4.2 编译

    make camera.ranchu
    
    • 1

    在这里插入图片描述
    注意:这里会同时编译好 32位 和 64位的 camera.ranchu.so
    其中 64位的库位于 /home/hg/android-12.1.0_r4/out/target/product/emulator_x86_64/obj/SHARED_LIBRARIES/camera.ranchu_intermediates
    32 位的库位于 /home/hg/android-12.1.0_r4/out/target/product/emulator_x86_64/obj_x86/SHARED_LIBRARIES/camera.ranchu_intermediates
    因为我的模拟器上的 2.4 的进程是 32位的,所以我要拷贝 32位的 camera.ranchu.so 到 Windows

    4.3 拷贝 32位 的 camera.ranchu.so 到 Windows

    在这里插入图片描述

    在这里插入图片描述

    4.4 push 32位的 camera.ranchu.so 到模拟器

    adb root && adb remount
    adb push H:\Sdk\camera.ranchu.so  /vendor/lib/hw
    adb shell sync
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4.5 重启后置摄像头的进程

    首先,查看模拟器的 camera 进程有哪些

    adb shell
    ps -A|grep -i camera
    
    • 1
    • 2

    在这里插入图片描述
    可以看到,这里 2.4 的 进程号为 380
    现在 kill 掉这个进程, 2.4 的进程会重启,然后加载到刚才 push 的 camera.ranchu.so

    kill -9 380
    ps -A|grep -i camera
    
    • 1
    • 2

    在这里插入图片描述
    可以看到 2.4 进程重启了,进程号和以前不一样了

    4.6 开启log,验证

    开启log,然后打开 camera,这样就能打印出我们在 EmulatedCamera_Factory.cpp 中加入的 log

    logcat -c
    logcat |grep -i hugang
    
    • 1
    • 2

    在这里插入图片描述
    打开 camera

    在这里插入图片描述

    打开 camera 后,log打印如下(因为 camera.ranchu.so 是负责后置摄像头,camera app 打开后默认打开的就是后置摄像头,所以会直接打印出下面的 log)

    在这里插入图片描述
    说明我们 push 的 camera.ranchu.so 生效了。

    5. 修改验证 前置摄像头 HAL 代码

    5.1 查找前置摄像头对应的进程

    首先,查看 camera 的进程有哪些

     ps -A|grep -i camera
    
    • 1

    在这里插入图片描述
    可以看到,2.7的进程号位 381,2.7 的意思就是前置摄像头对应的进程,这个进程加载了 libgooglecamerahal.so
    然后,我们查看 381 这个进程加载了哪些 so

    cat /proc/381/maps |greps -i googlecamera
    
    • 1

    在这里插入图片描述

    可以看到,这个进程加载了 libgooglecamerahal.so,而且所有的 so 都在 /vendor/lib64 目录下,所以这个进程是 64 位的。

    5.2 修改前置镜头的 hal 相关代码

    在这里插入图片描述
    在这里插入图片描述

    修改 /home/hg/android-12.1.0_r4/hardware/google/camera/common/hal/google_camera_hal/camera_device_session.cc 的 log,然后保存。

    在这里插入图片描述

    5.3 编译

    make libgooglecamerahal
    
    • 1

    在这里插入图片描述

    会编译 32位和64位两种 libgooglecamerahal.so
    64位的 libgooglecamerahal.so 的路径 :out/target/product/emulator_x86_64/obj/SHARED_LIBRARIES/libgooglecamerahal_intermediates/
    32位的 libgooglecamerahal.so 的路径 :
    /home/hg/android-12.1.0_r4/out/target/product/emulator_x86_64/obj_x86/SHARED_LIBRARIES/libgooglecamerahalutils_intermediates
    因为我的模拟器上的 libgooglecamerahal.so 是64位的,所以拷贝64位的 so 到 Windows

    在这里插入图片描述
    在这里插入图片描述

    5.4 push 64位的 libgooglecamerahal.so 到模拟器

    adb root &&  adb remount
    adb push H:\Sdk\libgooglecamerahal.so  /vendor/lib64/
    adb shell sync
    
    • 1
    • 2
    • 3

    5.5 重启前置摄像头的进程

    查看 camera 的进程

    adb shell
    ps -A|grep -i camera
    
    • 1
    • 2

    在这里插入图片描述
    可以看到 2.7 的进程号为 381
    重启 2.7 的进程

    kill -9 381
    ps -A|grep -i camera
    
    • 1
    • 2

    在这里插入图片描述

    可以看到 2.1 的进程号变了,现在已经加载到了之前push 的 libgooglecameahal.so

    5.6 开启 log 打印,验证

    logcat -c
    logcat |grep -i hugang
    
    • 1
    • 2

    在这里插入图片描述

    然后,打开 camera

    在这里插入图片描述

    因为我们测试的是前置摄像头,所以要将摄象头切换为前置的

    在这里插入图片描述

    点击上图的按钮,就会切换摄像头为前置的,画面会变成下面这个样子

    在这里插入图片描述

    现在log打印如下

    在这里插入图片描述
    说明成功了

  • 相关阅读:
    c 各种例子
    Ubuntu20 安装 带cuda的opencv遇到的问题
    第三方支付“进件”是什么意思
    【机器学习基础】机器学习的模型评估(评估方法及性能度量原理及主要公式)
    在 M1/M2 Mac 上,让 Windows 11 免费“跑”起来!
    C++编译相关学习笔记
    ServletFileUpload获取上传的多个文件和数据
    (附源码)计算机毕业设计SSM基于框架的旅游管理系统
    Redis 与其他数据库的不同之处 | Navicat
    哈夫曼树与哈夫曼编码
  • 原文地址:https://blog.csdn.net/Redmoon955331/article/details/127687977