可乐是好心情 發表於 2024-10-18 10:49:00

原生android开发相关笔记

<pre class="language-plaintext light-scrollbar-FDfgd0"><code>常用命令:<br>查看系统版本号<br>getprop ro.build.version.release<br><br><br>常见编译错误:<br>一.ELF检查报错<br>error: found ELF prebuilt in PRODUCT_COPY_FILES, use cc_prebuilt_binary / cc_prebuilt_library_shared instead<br>问题代码:<br></code></pre>
<div class="cnblogs_code">
<pre>PRODUCT_COPY_FILES +=<span style="color: rgba(0, 0, 0, 1)"> \
$(LOCAL_PATH)</span>/../../../bin/system/lib64/libxxxsdk.so:system/lib64/libxxxsdk.so</pre>
</div>
<p>解决办法:</p>
<p>据说在mk文件里添加以下代码即可避免检查报错,但是我尝试了无效。</p>
<div class="cnblogs_code">
<pre>BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES := <span style="color: rgba(0, 0, 255, 1)">true</span></pre>
</div>
<p>现在使用<code>cc_prebuilt_binary方式进行测试,需要写在被拷贝文件的父级目录的Android.bp中,是有效的</code></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">cc_prebuilt_library {
    name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">libxxxsdk</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    srcs: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bin/system/lib64/libxxxsdk.so</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">],
    check_elf_files: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
}</span></pre>
</div>
<p>&nbsp;二.SELinux权限问题导致软件无法操作对应的dev节点</p>
<p>临时对策可以使用命令解决</p>
<div class="cnblogs_code">
<pre>setenforce <span style="color: rgba(128, 0, 128, 1)">0</span></pre>
</div>
<p>但是项目安全考虑需要配置相应的策略来解决此问题,首先需要找到错误日志如下,logcat搜索关键字avc: denied</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">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</pre>
</div>
<p>根据日志信息,可以看出 SELinux 拒绝了访问 /dev/ttyAT5 设备的请求。日志的关键部分如下:</p>
<p>scontext:u:r:hal_bluetooth_default:s0,表示请求的进程的上下文是 hal_bluetooth_default。<br>tcontext:u:object_r:ttyAT5_device:s0,表示目标设备的上下文是 ttyAT5_device。<br>tclass:chr_file,表示目标是字符设备文件。<br>修改 SELinux 策略<br>根据这些信息,你可以创建或修改 SELinux 策略,以允许 hal_bluetooth_default 上下文的进程访问 /dev/ttyAT5 设备。具体步骤如下:</p>
<p>创建或修改策略文件:</p>
<p>打开或创建一个新的 .te 文件,例如 hal_bluetooth.te,并添加以下内容:</p>
<div class="cnblogs_code">
<pre># 允许 hal_bluetooth_default 上下文访问 /dev/<span style="color: rgba(0, 0, 0, 1)">ttyAT5
allow hal_bluetooth_default ttyAT5_device:chr_file open;</span></pre>
</div>
<p>重新编译整个 Android 系统,并将新的固件刷入设备。</p>
<p>验证效果:</p>
<p>设置 setenforce 1 并测试你的应用是否能够成功打开 /dev/ttyAT5。</p>
<p>源码修改路径,根据蓝牙举例:source\android\system\sepolicy\vendor\hal_bluetooth_default.te</p>
<p>&nbsp;三.自定义app使用系统隐藏api出现以下报错</p>
<div class="cnblogs_code">
<pre>ava.lang.NoSuchMethodError: No <span style="color: rgba(0, 0, 255, 1)">virtual</span> method getCurrentCalls(Landroid/bluetooth/BluetoothDevice;)Ljava/util/List; <span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Landroid/bluetooth/BluetoothHeadsetClient; or its super classes (declaration of <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">android.bluetooth.BluetoothHeadsetClient</span><span style="color: rgba(128, 0, 0, 1)">'</span> appears <span style="color: rgba(0, 0, 255, 1)">in</span> /system/framework/framework.jar)</pre>
</div>
<p>说明:这种错误的根本原因是android系统的隐藏api是不允许第三方应用进行调用的,但是我们如果是系统级应用开发,则可以给应用签名和系统应用相同的签名即可实现调用</p>
<p>如果有系统源码环境,可以找到源码内以下两个文件来进行签名操作</p>
<div class="cnblogs_code">
<pre>source/android/build/target/product/security/<span style="color: rgba(0, 0, 0, 1)">platform.pk8
source</span>/android/build/target/product/security/platform.x509.pem</pre>
</div>
<p>使用openssl将platform.pk8转换为platform.pem文件</p>
<div class="cnblogs_code">
<pre>openssl pkcs8 -inform DER -<span style="color: rgba(0, 0, 255, 1)">in</span> platform.pk8 -<span style="color: rgba(0, 0, 255, 1)">out</span> platform.pem -nocrypt</pre>
</div>
<p>再使用openssl将platform.pem和platform.x509.pem他们合并生成签名文件keystore.p12</p>
<div class="cnblogs_code">
<pre>openssl pkcs12 -export -out keystore.p12 -inkey platform.pem -in platform.x509.pem -name "your_alias" -passout pass:android</pre>
</div>
<p>然后使用apksigner命令和keystore.p12签名文件对apk进行系统签名</p>
<div class="cnblogs_code">
<pre>apksigner sign --ks keystore.p12 --ks-type PKCS12 --ks-pass pass:android --key-pass pass:android --<span style="color: rgba(0, 0, 255, 1)">out</span> signed_app.apk myapp.apk</pre>
</div>
<p>也可以直接配置到AS中,在AS项目的build.gradle中添加以下代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">plugins {
    id </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.android.application</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
}

android {
    signingConfigs {
      debug {
            storeFile file(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\workFiles\\androidProject\\xxx\\keystore.p12</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
            storePassword </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
            keyAlias </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">your_alias</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
            keyPassword </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
      }
      release {
            storeFile file(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\workFiles\\androidProject\\xxx\\keystore.p12</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
            storePassword </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
            keyAlias </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">your_alias</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
            keyPassword </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
      }
    }
    ......
}</span></pre>
</div>
<p>这样就可以使用AS直接编译安装调试系统级应用了</p>
<p>四.自定义系统应用通话界面的默认显示,通过修改以下系统源码中的值,将com.android.car.dialer默认的包名替换为自己的包名</p>
<p><img src="https://img2024.cnblogs.com/blog/1221054/202411/1221054-20241104155459476-1325803879.png" alt="" loading="lazy"></p>
<p><img src="https://img2024.cnblogs.com/blog/1221054/202411/1221054-20241104155649644-719724062.png" alt="" loading="lazy"></p>
<p><img src="https://img2024.cnblogs.com/blog/1221054/202411/1221054-20241104155723636-1469459311.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>-----------------------------</p>
<p>修改android12源码使用百瑞蓝牙协议栈替换掉ATC协议栈的笔记</p>
<p>修改以下<br>source\android\device\autochips\vendor\ac8x\common\device.mk        517行 ATC_BT_SUPPORT no<br>source\android\device\autochips\vendor\ac8x_demo\ProjectConfig.mk        243行ATC_BT_SUPPORT no<br>source\android\device\autochips\vendor\ac8025_demo\ProjectConfig.mk        181行ATC_BT_SUPPORT no<br>source\android\device\autochips\system\assi_64\device.mk        225行ATC_BT_SUPPORT no<br>source\android\device\autochips\system\assi_64\SystemConfig.mk        170行ATC_BT_SUPPORT no<br>source\android\device\autochips\vendor\ac8025_hsae\ProjectConfig.mk        181行ATC_BT_SUPPORT no<br>source\android\device\autochips\vendor\ac8025_hsae\hsaeAppsConfig.mk        8-17行<br>source\android\device\autochips\system\assi_64\hsaeAppsConfig.mk        8-10行<br>source\android\hardware\interfaces\bluetooth\1.0\default\vendor_interface.cc 213行需要注释<br>source\android\system\sepolicy\vendor\hal_bluetooth_default.te 7-8行<br>source\android\vendor\autochips\proprietary\hardware\connectivity\wlan\cypress_wlan\config\wpa_supplicant.conf 14行<br>source\android\hardware\interfaces\bluetooth\1.0\default\android.hardware.bluetooth@1.0-service.rc<br>增加</p>
<div class="cnblogs_code">
<pre>on property:vendor.all.modules.ready=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
    insmod </span>/vendor/lib/modules/external_bluetooth.ko</pre>
</div>
<p>或者可以自己修改以下内核代码</p>
<p>修改内核创建指定节点支持666权限<br>source\kernel\common\fs\sysfs\group.c 59行和88行修改为666权限<br>source\kernel\atc_modules\connectivity\atc_combo\main.c 110-111行<br>source\kernel\common\include\linux\device.h 153-154行<br>source\kernel\common\include\linux\sysfs.h 140-145行</p>
<p>替换以下<br>D:\workFiles\androidProject\scrcpy-win64-v1.24\Bluetooth\src\packages\apps\Bluetooth\*<br>D:\workFiles\androidProject\scrcpy-win64-v1.24\Bluetooth\src\system\bt\binder\android\bluetooth\IBluetooth.aidl</p>
<p>------------------------</p>
<p>蓝牙的自动连接修改路径<br>packages\services\Car\service\src\com\android\car\BluetoothDeviceConnectionPolicy.java</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/huhe/p/18473804
頁: [1]
查看完整版本: 原生android开发相关笔记