原生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
------------------------