96SEO 2026-02-20 04:23 17
开发车载应用#xff0c;其实主要都是在Android系统中编写各种系统应用#xff0c;所以上期视频先介绍了Android系统源码的下载和编译流程https://www.bilibili.com/video/BV1NY411z7TK/

开发车载应用其实主要都是在Android系统中编写各种系统应用所以上期视频先介绍了Android系统源码的下载和编译流程本期视频我们开始介绍Android系统应用是如何开发的。
我们第一次启动Android系统的手机时会发现手机中已经预先安装了很多应用例如系统设置、桌面等等。
这些应用并不是通过普通的方法安装到系统上的而是直接嵌入在Android
ROM中直接刷写到硬件里的。
通过这种方式安装的应用无法使用通常的方法卸载。
只有在获取root权限后删除对应目录下的的apk文件或者刷机否则无法移除这些系统应用。
除此以外我们还会发现系统应用拥有远超普通的应用的权限以系统设置为例它可以切换当前系统的用户类型设置其它应用的通知权限甚至于可以卸载Android系统上的普通应用这些功能都是普通应用无法实现的原因就在于Android
SDK未公开的私有API。
拥有更高的系统权限。
直接嵌入到Android
系统应用的特点决定了它的开发方式与普通的Android应用并不完全一样。
首先系统应用可以调用Android
SDK隐藏的API这需要我们引入包含被隐藏API的jar包。
当然如果不需要调用隐藏API这一步可以跳过。
在实际项目中这一步会由负责framework开发的同事协助完成因为farmework层一般都有新增的接口需要一起打包。
frameworks/base以及在/framework/base目录下执行mm都可以。
编译成功后进入/out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates/下的classes-header.jar就是我们需要的jar包。
SDK中没有公开的API例如用于启用RRO机制的OverlayManager。
如果没有下载AOSP源码上述编译好的framework.jar可以去本视频的github仓库中下载github地址[https://github.com/linxu-link/CarAndroidCourse]可以在本视频的简介中查看。
allprojects{gradle.projectsEvaluated
options.bootstrapClasspath.getFiles()ListFile
ArrayList();newFileList.add(new
File(./app/libs/framework_header.jar))newFileList.addAll(fileSet)options.bootstrapClasspath
}在App目录的build.gradle中以compileOnly的形式引入jar包。
files(libs/framework_header.jar)第
Android系统会识别应用的签名类型并根据签名类型赋予应用相应的权限等级将普通应用提升为系统应用的重要条件就是应用需要使用系统签名。
所以在这一步我们要先制作一份系统签名方便我们在开发时调试应用。
build/target/product/security2制作系统签名
[android]制作完成后会在当前目录下载生成一个platform.jks的签名文件将它导入到android
将platform.jks放置在App目录下并build.gradle中加入以下代码。
file(platform.jks)storePassword
studio后app工程就可以直接在Android模拟器中调用系统API同时也可以获取更高等级的权限了。
key文件一般无法使用在真实环境中例如手机车载项目则较为复杂有的项目在开发阶段就会使用较为严格的签名校验那么AOSP的签名文件也是无法使用的。
不过也有项目会在最后的量产阶段更换签名那么在此之前AOSP中test
在Android源码的build/target/product/security/目录下有如下5对常见的KEY
networkstack.pk8与networkstack.x509.pem
其中“.pk8”文件为私钥“.x509.pem”文件为公钥。
注意此目录中的测试密钥仅用于开发不得用于在公开发布的映像中签署包。
有关密钥的更多内容可以阅读官方的文档https://source.android.com/docs/core/ota/sign_builds?hlzh-cn
而这些密钥如何与被签名的APK对应上呢在APK源码目录下的Android.bp文件中有certificate字段用于指定签名时使用的KEY如果不指定默认使用testkey。
系统应用对应的certificate可设定为如下的值。
media而在Android.bp中的这些配置需要在APK源码的AndroidManifest.xml文件中的manifest节点添加如下内容
android:sharedUserIdandroid.uid.system
android:sharedUserIdandroid.uid.shared
android:sharedUserIdandroid.media实践系统应用
为了让各位能直观的感受到『系统应用』与『普通应用』的区别我们要求『系统应用』完成以下的功能
在屏幕上且不需要授权『显示在其它应用的上层』应用被杀死后自动拉起即进程保活
这些功能都是在『普通应用』上难以实现的需求我们演示一下在『系统应用』上是如何实现的。
开机自启与进程保活两项功能Android系统本身已经提供了相应的机制来实现我们只需要在manifest.xml中进行配置即可。
设定应用是否保持常驻状态。
默认值为false设定为true为开启常驻模式常驻模式仅适用于系统应用。
开启常驻模式后应用会在Android系统开机动画播放完毕之前就会完成启动同时应用会常驻后台即使被杀死后也会立即拉起。
applicationandroid:persistenttrue除此以外系统应用中还有一些可能较为常用的属性可以配置我们逐一介绍。
ID。
如果两个或多个应用将此属性设置为相同的值则这些应用都将共享相同的
android:sharedUserMaxSdkVersion“32”
xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:sharedUserIdandroid.uid.systemandroid:sharedUserMaxSdkVersion32directBootAware
直接启动模式。
直接启动模式是在Android7.0之后出现的当设备已正常开机但尚未解锁时称设备处于DirectBoot模式。
默认情况下应用不会在DirectBoot模式下启动即使是系统应用。
如果应用需要在DirectBoot模式下启动可以在manifext.xml将directBootAware属性设定为true。
已安排通知的应用如闹钟应用提供重要用户通知的应用如短信应用提供无障碍服务的应用如
storage凭据加密存储区。
默认存储数据的地方仅在用户解锁手机后可用。
Device
storage设备加密存储区。
主要对应的就是DirectBoot时使用的存储空间。
该存储空间在DirectBoot模式下和用户解锁手机后都可以使用。
0-当Android系统开机后首先进入一个DirectBoot模式如果应用在DirectBoot模式下运行时需要访问本地数据可以通过调用Context.createDeviceProtectedStorageContext()创建一个特殊的Context实例。
通过此实例发出的所有存储类
appContext.createDeviceProtectedStorageContext();//
directBootContext.openFileInput(appDataFilename);//
content...如果需要监听屏幕解锁的时机可以注册下面的广播
receiverandroid:directBootAwaretrue
android:nameandroid.intent.action.LOCKED_BOOT_COMPLETED
一些关键的系统应用或服务需要在Android屏幕解锁前完成启动并开始运行这种情况就可以配置为直接启动模式。
此时必仔细阅读官方文档防止出现意外的bug官方文档https://developer.android.google.cn/training/articles/direct-boot?hlzh-cn
车载应用项目中可能会它用来加载一些framework自定义的共享库。
uses-libraryandroid:namestringandroid:required[true
/android:name库的名称。
此名称由您使用的软件包的文档提供。
例如“android.test.runner”是一个包含
true如果没有此库则应用将无法正常运行。
系统不允许在没有此库的设备上安装应用。
false应用可以使用此库如果存在但专门在没有此库的情况下运行如果有必要。
系统允许安装应用即使不存在此库也是如此。
如果您使用
xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:sharedUserIdandroid.uid.systemandroid:sharedUserMaxSdkVersion32xmlns:toolshttp://schemas.android.com/toolsuses-permission
android:nameandroid.permission.SYSTEM_ALERT_WINDOW
/applicationandroid:name.SystemApplicationandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:persistenttrueandroid:supportsRtltrueandroid:***mestyle/Theme.SystemAppactivityandroid:name.MainActivityandroid:exportedtrueintent-filteraction
android:nameandroid.intent.action.MAIN
android:nameandroid.intent.category.LAUNCHER
//intent-filter/activityserviceandroid:name.SystemServiceandroid:enabledtrueandroid:exportedtrueintent-filteraction
android:namecom.android.systemapp.action
//intent-filter/service/application/manifest第
本应用中只有一个Service在Application中启动该Service。
Intent()intent.setPackage(com.android.systemapp)intent.setAction(com.android.systemapp.action)startService(intent)}
}在Service中我们通过WindowManager绘制一个View系统动画没有播放完毕之前该View是无法进行绘制和显示的。
换句话说当这个View可以绘制时系统动画已经播放完毕且SystemUI已经显示出来了。
getSystemService(DisplayManager::class.java)
dm.getDisplay(Display.DEFAULT_DISPLAY)
createDisplayContext(defaultDisplay)
defaultDisplayContext.createWindowContext(TYPE_APPLICATION_OVERLAY,
ctx.getSystemService(WindowManager::class.java)
mWindowManager.getCurrentWindowMetrics().getBounds();val
SystemService::class.java.simpleName;override
getSystemService(DisplayManager::class.java)val
dm.getDisplay(Display.DEFAULT_DISPLAY)val
createDisplayContext(defaultDisplay)val
defaultDisplayContext.createWindowContext(TYPE_APPLICATION_OVERLAY,
在屏幕上绘制一个像素的view用于监控开机动画是否播放完毕val
ctx.getSystemService(WindowManager::class.java)val
mWindowManager.getCurrentWindowMetrics().getBounds();val
暂停5秒后移除该ViewThread{sleep(5_000)mWindowManager.removeView(this)}.start()}}val
WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLEand
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ONand
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)testParams.width
bounds.height()/2testParams.gravity
TAGmWindowManager.addView(windowSizeTest,
Studio中的模拟器来验证系统应用的运行方式是否符合我们的预期。
模拟器重启后SystemApp进程会自动启动并在屏幕上覆盖一个黑色View整个过程中
进程拉起。
普通应用上难以实现的进程保活在『系统应用』上轻而易举的就可以达成了而且进入系统设置中查看
应用开发说到底都是在做系统应用开发了解系统应用的开发方式是我们入门车载
好以上就是本视频的全部内容了。
本视频的文字内容发布在我的个人微信公众号-『车载
文件和源码发布在我的Github[https://github.com/linxu-link/CarAndroidCourse]中在本视频的简介里可以找到相应的地址。
https://developer.android.google.cn/guide/topics/manifest/application-element?hlzh-cn#persistent
https://developer.android.google.cn/guide/topics/manifest/manifest-element?hlzh-cn#uid
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback