Android8.1系统服务整理

 分类:Android, Android, Java, Operating System 阅读 (836)  Android8.1系统服务整理已关闭评论
3月 092020
 

本文基于Android8.1系统整理

本文根据SystemServer.java中的代码进行整理

一、系统服务startBootstrapServices

1、Installer服务 – 应该是和底层的installd打交道的服务,用于管理安装删除app的服务,需要在启动其他服务之前完成

2、 DeviceIdentifiersPolicyService – 直译过来是设备标识符策略服务,注释上说有些app需要访问设备标识,因此要在activity manager 之前启动这个服务。

3、ActivityManagerService – 

4、PowerManagerService – 电源管理服务

5、RecoverySystemService – 在一些情况下可能会使用此服务重启系统

6、LightsService – 管理led灯或者背光服务

7、DisplayManagerService – 

8、PackageManagerService

9、UserManagerService – 多用户管理

10、OverlayManagerService – 

11、SensorService – 管理各种传感器的服务,是一个c层的服务,通过jni调用

二、核心服务startCoreServices – 其他必要的服务,但是没和启动服务纠缠在一起

1、DropBoxManagerService – 记录错误和日志

2、BatteryService – 电池管理服务,跟踪电池电量,需要LightService运行

3、UsageStatsService – 跟踪应用使用情况

4、WebViewUpdateService – Webview更新服务

三、其他服务

1、KeyChainSystemService – 好像是com.android.keychain的一个扩展,在android O以后用于处理应用删除时的清理动作。

2、SchedulingPolicyService – 调度策略管理,不知道是干啥用的

3、TelecomLoaderService – 用于启动通讯服务的?

4、TelephonyRegistry

5、VibratorService – 振动器服务

6、AlarmManagerService – 系统定时运行服务

7、ConsumerIrService – 红外遥控管理服务

8、AccountManagerService

9、ContentService

10、Watchdog

11、InputManagerService

12、VrManagerService – vr管理服务

13、BluetoothService – 蓝牙服务

14、IpConnectivityMetrics – 不知道是干啥的

15、PinnerService

16、InputMethodManagerService – 接收屏幕开关、系统关闭对话框事件,启动、关闭输入法service,弹出选择输入法的对话框等等

17、AccessibilityManagerService

18、StorageManagerService – 存储管理服务

19、StorageStatsService – 磁盘统计服务

20、UiModeManagerService – 管理UI模式,汽车模式、电视模式、手表模式、黑夜模式等,adb shell dumpsys uimode

21、LockSettingsService – 管理多个用户的锁屏图案、锁屏密码等的服务

22、PersistentDataBlockService – 连续数据块服务,好像是工厂模式用的?

23、OemLockService

24、DeviceIdleController – 设备空闲状态控制,低功耗模式的运行就是基于这个服务

25、DevicePolicyManagerService – 设备策略服务

26、StatusBarManagerService – 状态栏服务

27、ClipboardService – 剪贴板服务

28、NetworkManagementService

29、TextServicesManagerService – 文本服务,主要是提供拼写检查服务

30、NetworkScoreService

31、NetworkStatsService – 网络统计服务,给其他系统服务使用,也可以使用adb shell dumpsys netstats查看

32、NetworkPolicyManagerService – 网络策略管理

33、WifiService – wifi服务

34、WifiScanningService – wifi扫描服务

35、com.android.server.wifi.RttService

36、WifiAwareService

37、WifiP2pService

38、LowpanService

39、EthernetService

40、ConnectivityService

41、NsdService

42、UpdateLockService

43、NotificationManagerService

44、DeviceStorageMonitorService

45、LocationManagerService – 位置管理服务

46、CountryDetectorService – 国家检测服务,类ComprehensiveCountryDetector.java,检测顺序:移动网络、位置、sim卡的国家、手机的位置

47、SearchManagerService

48、WallpaperManagerService – 壁纸管理服务

49、BroadcastRadioService – 收音机服务

50、DockObserver – ???

51、ThermalObserver – 用于监测温度变化,需要FEATURE_WATCH,监测体温的?

52、WiredAccessoryManager

53、MidiService – midi服务

54、UsbService – usb设备服务,管理所有USB相关的状态,包括host(UsbHostManager)和device(UsbDeviceManager)模式

55、SerialService – 串口服务

56、HardwarePropertiesManagerService

57、TwilightService – 根据用户的位置判断当前时间是否是夜间时间

58、NightDisplayService – 夜晚显示服务,黑夜模式

59、JobSchedulerService

60、SoundTriggerService

61、TrustManagerService

62、BackupManagerService

63、AppWidgetService

64、VoiceInteractionManagerService

65、GestureLauncherService

66、SensorNotificationService

67、ContextHubSystemService – 主要是为了启动ContextHubService

68、DiskStatsService – 磁盘统计服务,只是在使用adb shell dumpsys diskstats时被调用

69、timezone.RulesManagerService

70、NetworkTimeUpdateService

71、CommonTimeManagementService

72、EmergencyAffordanceService – 紧急呼叫服务,从 2017 年 1 月 1 日开始,在印度地区销售的所有移动设备都必须应印度电信部门 (DoT) 的要求提供紧急呼叫按钮。为响应这些监管要求,Android 包含了“提供紧急呼叫”功能的参考实现,以启用 Android 设备上的紧急呼叫按钮。此功能在 Android 8.0 和更高版本中默认启用,但较早版本中必须安装相应的补丁程序。目前,该功能专门针对在印度市场销售的设备;不过,鉴于该功能在印度境外无效,因此也可以在全球范围销售的所有设备上提供。

73、DreamManagerService – 屏保服务?

74、GraphicsStatsService – 用来汇总屏幕卡顿数据的,通过adb shell dumpsys graphicsstats调用查看汇总结果

75、CoverageService – JaCoCo相关服务,和coverage命令相对应,用于导出JaCoCo的输出文件

76、PrintManagerService – 打印管理服务

77、CompanionDeviceManagerService – 伙伴设备管理服务?

78、RestrictionsManagerService – 限制管理服务,好像是app可以通过manifest定义一些限制规则?

79、MediaSessionService – 多媒体会话服务,在多个进程中共享多媒体播放状态,https://developer.android.google.cn/reference/androidx/media2/session/MediaSessionService

80、HdmiControlService – hdmi服务,控制hdmi设备的显示?

81、TvInputManagerService – 电视输入服务

82、MediaResourceMonitorService – 不清楚有啥用

83、TvRemoteService – 电视摇控服务

84、MediaRouterService – 媒体路由服务,用于给实现了Google Cast的设备提供远程播放、远程控制音乐和视频服务,https://developer.android.google.cn/guide/topics/media/mediarouter

85、FingerprintService – 指纹服务

86、BackgroundDexOptService – dex后台优化服务,在packmanager中有调用

87、PruneInstantAppsJobService

88、ShortcutService – 快捷方式服务

89、LauncherAppsService – Launcher应用相关的服务

90、MediaProjectionManagerService – 媒体投影服务,可用于录屏或者屏幕投射

91、WearConnectivityService – 穿戴设备连接服务

92、WearDisplayService – 穿戴设备显示服务

93、WearLeftyService – 穿戴设备左撇子服务

94、WearTimeService – 穿戴设备时间服务

95、CameraServiceProxy

96、MmsServiceBroker – 彩信服务

97、AutofillManagerService – 自动填充服务,比如自动填充密码,看说明https://developer.android.google.cn/guide/topics/text/autofill

98、CarServiceHelperService

99、SystemUIService – SystemUi状态栏等

四、其他说明

1、线程是同步执行还是异步执行的?

根据代码看,大部分服务的启动是同步执行的,即启动完成一个服务才会启动后面的服务,因为后面的一些服务会引用到前面的服务,如下图:

但是也有一些服务是在子线程中处理的,可能是异步执行的

还要注意有个startBootPhase函数(还未查看此函数)

2、如何查看服务是否在进程中

这些服务通常是子线程中运行的,度娘说可以通过下面的指令查看子线程

ps -T -p 进程id

进程id是指system_server的进程id。

但是我用这个看不到子进程,使用下面的命令可以看到

ps -T -A|grep 进程id

 Posted by on 2020-03-09

Android8.1系统中启用bootchart

 分类:Android, Android, Java, Operating System 阅读 (471)  Android8.1系统中启用bootchart已关闭评论
3月 072020
 

bootchart是用于记录开机时进程启动时间的工具

默认情况下是没有启用的,在init.rc中是有启动的,看如下代码:

但是,查看了一下bootchart的源码(在system/core/init/bootchart.cpp中),它启动要判断另外一个条件,代码如下:

也就是说检查/data/bootchart/enabled文件是否存在(不管文件是不是有内容),如果存在就启用bootchart,这样就好办了,我们在/data/bootchart中随便新建一个名字enabled的空文件就好了。

修改完后再重新启动安卓系统发现/data/bootchart目录下有了下面几个文件:

header

proc_diskstats.log

proc_ps.log

proc_stat.log

接下来就可以用其他工具根据这些log生成图片了,我使用的是linux下的pybootchartgui工具

 

 Posted by on 2020-03-07

Android模拟器部分参数说明

 分类:Android, Android, Java, Operating System 阅读 (267)  Android模拟器部分参数说明已关闭评论
3月 052020
 

模拟器版本Android emulator version 26.1.3.0 (build_id 4240222) 

本文所述都是基于android8.1系统源码编译后的模拟器程序,不是android studio中的模拟器

部分参数说明:

-screen 触屏模式,可以为如下参数:touch, multi-touch, or no-touch

-accel 加速模式,可以为如下参数:on, off, auto

-writable-system 执行adb remount后system和vender分区可写

-skin 皮肤名称,如果是安卓系统源码,皮肤在development/tools/emulator/skins目录下

-wipe-data 清除用户数据

-shell 看着是可以显示系统的log了,其他区别不清楚

-cores 模拟器的cpu核心数

-gpu 设置硬件OpenGLES模拟模式,可选参数:on, off, auto

-memory 设置模拟器的物理内存大小,单位MB,有的时候设置比较大的值会导致模拟器无法启动

-show-kernel 显示内核消息

-no-boot-anim 禁止开机动画,加速模拟器启动速度,有的时候加上模拟器启动不了

-tcpdump <file> 将网络包抓到某个文件

-bootchart 允许-bootcharting,具体可以百度搜索一下bootchart

-selinux <disabled|permissive> 是否开启selinux

-dpi-device 设置设备的dpi

参数帮助列表:

其他的配置文件

在生成的镜像目录中还有一个config.ini,也可以进行一些配置,具体参考自己机器上的文件进行配置

在我的机器上是out/target/product/generic_x86_64/config.ini这个文件

 Posted by on 2020-03-05

ThreadLocal的使用

 分类:Android, Java, Java语言 阅读 (148)  ThreadLocal的使用已关闭评论
3月 052020
 
一、ThreadLocal的作用

  ThreadLocal也是用作保证线程安全的一种方式,与平常我们所说的线程安全的方式不同,ThreadLocal是对每个线程都保存一份数据来保证多个线程不会同时使用这个数据。

  也许你会说,那我在线程里定义一个这样的数据变量不就可以了?如果你只是定义一个线程类,而运行该线程类的多个实例,当然是可以的。

  ThreadLocal是可以用在一个程序中的所有线程中,比如主线程和子线程同时使用这个变量(这听起来有点像单例的场景)。

  在Android中比较典型的应用就是Looper了,看Looper池的定义

  看ThreadLocal<Looper>是定义成了静态变量了

二、ThreadLocal的方法

  ThreadLocal支持泛型,一共有如下三个方法

  • set
  • get
  • remove

  根据函数的名字我们很容易知道他们的作用,这里就不再介绍了

三、其他高级用法

  可以和软引用配合使用,以节省内存的使用

 Posted by on 2020-03-05

Android Studio中gradle实现多维度打包

 分类:Android, Java 阅读 (431)  Android Studio中gradle实现多维度打包已关闭评论
1月 132020
 

举个不太恰当的例子,比如我们需要生成针对友盟统计的渠道为官网、应用宝、百度应用市场三个渠道各自对应的开发环境和测试环境的应用包。

那么,我们首先在AndroidManifest.xml中定义相关的点位符

友盟统计渠道点位符:

开发环境占位符:

在项目的build.gradle的android节点下定义flavorDimensions,如下:

然后我们定义productFlavors

获取当前apk占位符的值

我们以app_enviornment这个占位符为例,获取这个点位符的值后,确定连接开发服务器还是测试服务器

新建项目自定义的Application类(如果不明白,请百度一下这步如何操作),本例代码如下:

如上,获取到了占位符app_enviornment的值,根据AppEnviornment就可以做其他处理了

这个操作也不是必须放在自定义的Application类中,放在Activity中也可以

自动多版本apk的打包

在项目的build.gradle文件的android节点中增加如下代码:

  1. ${variant.versionName} – 版本名称
  2. ${variant.versionCode} – 版本编码
  3. ${variant.productFlavors[0].name} – 第一维度的名称(官网、应用宝等)
  4. ${variant.productFlavors[1].name}- 第二维度的名称(开发环境、测试环境等)

生成的apk截图如下:

Android Studio中如何指定要调试的版本

在studio左下角,找到Build Variants工具栏,在Active Build Variant中选择要调试的那个版本

代码下载

https://github.com/wintergoes/DimensionTestApp

 Posted by on 2020-01-13

Android8.1系统源码集成三方应用三方apk的方法

 分类:Android, Java 阅读 (579)  Android8.1系统源码集成三方应用三方apk的方法已关闭评论
12月 242019
 

首先在源码目录下建一个apks的目录,然后在apks下面建应用的目录,比如music

将my_music.apk拷贝到music目录下

在music目录下新建Android.mk文件,编译Android.mk文件,输入以下内容:

最后记得找到相应的包含PRODUCT_PACKAGES的mk文件,并在PRODUCT_PACKAGES属性中加入新建的LOCAL_MODULE,示例如下:

然后执行make编译

 Posted by on 2019-12-24

使用Android Studio调试系统应用的方法

 分类:Android, Java 阅读 (691)  使用Android Studio调试系统应用的方法已关闭评论
12月 202019
 

本文不适用于正常的手机应用开发,本文是在定制的安卓系统上开发

一、如何使应用变成系统应用

在AndroidManifest.xml中,根节点manifest中增加如下属性:

二、问题

如果直接run,则程序无法安装,会提示INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误

三、解决办法,使用keytool-importkeypair

见下面的链接:

https://www.jianshu.com/p/407c3754e490

keytool-importkeypair下载地址:

https://github.com/getfatday/keytool-importkeypair

 

 Posted by on 2019-12-20

Android8.1不使用jack编译的方法

 分类:Android, Java 阅读 (457)  Android8.1不使用jack编译的方法已关闭评论
12月 202019
 
一、为什么使用jack?
  1. 支持增量编译,编译速度快
二、全局禁用

禁止整个系统编译使用jack编译,在/build/core/combo/javac.mk中将

修改为false,即

三、单个模块禁用

在模块的Android.mk中增加如下设置

LOCAL_JACK_ENABLED := disabled

四、jack的三种模式

jack有三种模式:full、incremental、disabled

full – 全量编译

incremental – 增量编译,在frameworks/base下的Android.mk可看到frameworks是采用增量编译的

disabled – 禁用

 Posted by on 2019-12-20

Android8.1开发系统服务步骤

 分类:Android, Java 阅读 (352)  Android8.1开发系统服务步骤已关闭评论
12月 192019
 

1.在frameworks/base/core/java/下新建aidl文件的目录结构,比如你的服务所在包名为com.zht.car,则新建如下层级目录com/zht/car

2.新建aidl文件,如IBeidou.aidl

3.输入IBeidou.aidl的内容

4.在frameworks/base/Android.mk中的LOCAL_SRC_FILES中增加新增加aidl路径

5.在build/core/tasks/check_boot_jars/package_whitelist.txt中增加包的白名单,如下:com\.zht\.car\..*

6.执行make update-api

7.执行make检查前边的步骤有没有问题

5.在frameworks/base/services/core/java/com/android/server/中,根据服务的名称新建目录

 Posted by on 2019-12-19

Android8.1中SeLinux使用

 分类:Android, Java 阅读 (675)  Android8.1中SeLinux使用已关闭评论
12月 172019
 
查看SeLinux是否启用,输入命令:

getenforce

如果返回:Enforcing – 正在启用,Permissive – 未启用但会提示

临时设置为不启用(需要root权限):

setenforce 0

查看进程的SeLinux相关权限:

ps -AZ

查看文件的SeLinux相关权限:

ls -lZ

在源码中关闭SeLinux:

找到相应的BoardConfig.mk,打开文件,找到BOARD_KERNEL_CMDLINE项,在这一行的结尾增加

androidboot.selinux=permissive(前面加一个空格)

 

 Posted by on 2019-12-17