原生android开发相关笔记

常用命令:
查看系统版本号
getprop ro.build.version.release


常见编译错误:
一.ELF检查报错
error: found ELF prebuilt in PRODUCT_COPY_FILES, use cc_prebuilt_binary / cc_prebuilt_library_shared instead
问题代码:
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/../../../bin/system/lib64/libxxxsdk.so:system/lib64/libxxxsdk.so

解决办法:

据说在mk文件里添加以下代码即可避免检查报错,但是我尝试了无效。

BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES := true

现在使用cc_prebuilt_binary方式进行测试,需要写在被拷贝文件的父级目录的Android.bp中,是有效的

cc_prebuilt_library {
    name: "libxxxsdk",
    srcs: ["bin/system/lib64/libxxxsdk.so"],
    check_elf_files: false,
}

 二.SELinux权限问题导致软件无法操作对应的dev节点

临时对策可以使用命令解决

setenforce 0

但是项目安全考虑需要配置相应的策略来解决此问题,首先需要找到错误日志如下,logcat搜索关键字avc: denied

2024-10-22 23:49:16.859 813-813/? I/HwBinder:813_2: type=1400 audit(0.0:967): avc: denied { open } for path="/dev/ttyAT5" dev="tmpfs" ino=528 scontext=u:r:hal_bluetooth_default:s0 tcontext=u:object_r:ttyAT5_device:s0 tclass=chr_file permissive=1

根据日志信息,可以看出 SELinux 拒绝了访问 /dev/ttyAT5 设备的请求。日志的关键部分如下:

scontext:u:r:hal_bluetooth_default:s0,表示请求的进程的上下文是 hal_bluetooth_default。
tcontext:u:object_r:ttyAT5_device:s0,表示目标设备的上下文是 ttyAT5_device。
tclass:chr_file,表示目标是字符设备文件。
修改 SELinux 策略
根据这些信息,你可以创建或修改 SELinux 策略,以允许 hal_bluetooth_default 上下文的进程访问 /dev/ttyAT5 设备。具体步骤如下:

创建或修改策略文件:

打开或创建一个新的 .te 文件,例如 hal_bluetooth.te,并添加以下内容:

# 允许 hal_bluetooth_default 上下文访问 /dev/ttyAT5
allow hal_bluetooth_default ttyAT5_device:chr_file open;

重新编译整个 Android 系统,并将新的固件刷入设备。

验证效果:

设置 setenforce 1 并测试你的应用是否能够成功打开 /dev/ttyAT5。

源码修改路径,根据蓝牙举例:source\android\system\sepolicy\vendor\hal_bluetooth_default.te

 三.自定义app使用系统隐藏api出现以下报错

ava.lang.NoSuchMethodError: No virtual method getCurrentCalls(Landroid/bluetooth/BluetoothDevice;)Ljava/util/List; in class Landroid/bluetooth/BluetoothHeadsetClient; or its super classes (declaration of 'android.bluetooth.BluetoothHeadsetClient' appears in /system/framework/framework.jar)

说明:这种错误的根本原因是android系统的隐藏api是不允许第三方应用进行调用的,但是我们如果是系统级应用开发,则可以给应用签名和系统应用相同的签名即可实现调用

如果有系统源码环境,可以找到源码内以下两个文件来进行签名操作

source/android/build/target/product/security/platform.pk8
source/android/build/target/product/security/platform.x509.pem

使用openssl将platform.pk8转换为platform.pem文件

openssl pkcs8 -inform DER -in platform.pk8 -out platform.pem -nocrypt

再使用openssl将platform.pem和platform.x509.pem他们合并生成签名文件keystore.p12

openssl pkcs12 -export -out keystore.p12 -inkey platform.pem -in platform.x509.pem -name "your_alias" -passout pass:android

然后使用apksigner命令和keystore.p12签名文件对apk进行系统签名

apksigner sign --ks keystore.p12 --ks-type PKCS12 --ks-pass pass:android --key-pass pass:android --out signed_app.apk myapp.apk

也可以直接配置到AS中,在AS项目的build.gradle中添加以下代码

plugins {
    id 'com.android.application'
}

android {
    signingConfigs {
        debug {
            storeFile file('D:\\workFiles\\androidProject\\xxx\\keystore.p12')
            storePassword 'android'
            keyAlias 'your_alias'
            keyPassword 'android'
        }
        release {
            storeFile file('D:\\workFiles\\androidProject\\xxx\\keystore.p12')
            storePassword 'android'
            keyAlias 'your_alias'
            keyPassword 'android'
        }
    }
    ......  
}

这样就可以使用AS直接编译安装调试系统级应用了

四.自定义系统应用通话界面的默认显示,通过修改以下系统源码中的值,将com.android.car.dialer默认的包名替换为自己的包名

 

 

 

-----------------------------

修改android12源码使用百瑞蓝牙协议栈替换掉ATC协议栈的笔记

修改以下
source\android\device\autochips\vendor\ac8x\common\device.mk 517行 ATC_BT_SUPPORT no
source\android\device\autochips\vendor\ac8x_demo\ProjectConfig.mk 243行ATC_BT_SUPPORT no
source\android\device\autochips\vendor\ac8025_demo\ProjectConfig.mk 181行ATC_BT_SUPPORT no
source\android\device\autochips\system\assi_64\device.mk 225行ATC_BT_SUPPORT no
source\android\device\autochips\system\assi_64\SystemConfig.mk 170行ATC_BT_SUPPORT no
source\android\device\autochips\vendor\ac8025_hsae\ProjectConfig.mk 181行ATC_BT_SUPPORT no
source\android\device\autochips\vendor\ac8025_hsae\hsaeAppsConfig.mk 8-17行
source\android\device\autochips\system\assi_64\hsaeAppsConfig.mk 8-10行
source\android\hardware\interfaces\bluetooth\1.0\default\vendor_interface.cc 213行需要注释
source\android\system\sepolicy\vendor\hal_bluetooth_default.te 7-8行
source\android\vendor\autochips\proprietary\hardware\connectivity\wlan\cypress_wlan\config\wpa_supplicant.conf 14行
source\android\hardware\interfaces\bluetooth\1.0\default\android.hardware.bluetooth@1.0-service.rc
增加

on property:vendor.all.modules.ready=1
    insmod /vendor/lib/modules/external_bluetooth.ko

或者可以自己修改以下内核代码

修改内核创建指定节点支持666权限
source\kernel\common\fs\sysfs\group.c 59行和88行修改为666权限
source\kernel\atc_modules\connectivity\atc_combo\main.c 110-111行
source\kernel\common\include\linux\device.h 153-154行
source\kernel\common\include\linux\sysfs.h 140-145行

替换以下
D:\workFiles\androidProject\scrcpy-win64-v1.24\Bluetooth\src\packages\apps\Bluetooth\*
D:\workFiles\androidProject\scrcpy-win64-v1.24\Bluetooth\src\system\bt\binder\android\bluetooth\IBluetooth.aidl

------------------------

posted on 2024-10-18 10:49  Ants_hu  阅读(14)  评论(0编辑  收藏  举报

导航