删除framework层不使用语言配置文件
删除目录frameworks/base/core/res/res/下面的除了简体中文zh-rCN、繁体中文zh-rTW、zh-rHK和英文en-rXX之外的相关语言资源文件
删除前system.img文件为1.2G左右
删除后system.img文件为1.1G左右
删除设置应用中的不使用的语言选择列表
在frameworks/base/core/res/res/values/locale_config.xml中删除不使用的语言即可
删除目录frameworks/base/core/res/res/下面的除了简体中文zh-rCN、繁体中文zh-rTW、zh-rHK和英文en-rXX之外的相关语言资源文件
删除前system.img文件为1.2G左右
删除后system.img文件为1.1G左右
在frameworks/base/core/res/res/values/locale_config.xml中删除不使用的语言即可
Ubuntu18.04.4,不能使用Ubuntu16会有很多依赖软件版本太低
硬盘200G,内存4G+,交换分区(swap)4G+(可装完系统后添加,见后面错误处理部分)
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
sudo apt install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop git-core curl u-boot-tools mtd-utils android-tools-fsutils device-tree-compiler gdisk liblz4-tool m4 libz-dev
安装open-jdk-8
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
安装gcc-arm-none-eabi
sudo apt-get install gcc-arm-none-eabi
安装完这一项后,在~/.bashrc中最后一行添加脚本export ARMGCC_DIR=/usr/
然后执行source ~/.bashrc
安装cmake,需要3.13.0版本以上,安装步骤如下,其中./bootstrap那一步可以不用加后面的–qt-gui参数
https://blog.csdn.net/huigougou/article/details/84326907
然后进入到Android源码目录,假设源码在用户根目录的aosp目录中:
cd ~/aosp
然后初始化编译环境,使用下面的命令:
source build/envsetup.sh
然后选择要编译的目标版本,先输入lunch命令
lunch
然后在显示的列表中选择你的目标版本,输入相应的数字,按回车即可
然后使用make开始编译,可以使用-j参数增加编译的线程以提高速度,线程数量为cpu核心数的2倍比较合适,比如你的cpu是4核的使用
make -j8
就可以了
解决办法:
This will do the trick:
export LC_ALL=C
Add it to your bashrc file or equivalent.
参考链接:https://stackoverflow.com/questions/49955137/error-when-build-lineageos-make-ninja-wrapper-error-1
https://www.jianshu.com/p/2beae17c9b12
解决方案:
修改jack server内存
步骤:
打开./prebuilts/sdk/tools/jack-admin
找到下面这一行
JACK_SERVER_VM_ARGUMENTS=”${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8}”
修改为
JACK_SERVER_VM_ARGUMENTS=”${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096M}”
保存jack-admin文件
在命令行执行
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
重启jack server
然后重新编译
生成签名apk时,Android Studio报如下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Could not determine the dependencies of task ':app:lintVitalAilifenRelease'. > Could not resolve all artifacts for configuration ':app:wanjiaDebugAndroidTestRuntimeClasspath'. > Could not resolve com.android.support:support-annotations:{strictly 26.1.0}. Required by: project :app > Cannot find a version of 'com.android.support:support-annotations' that satisfies the version constraints: Dependency path 'simplescales:app:unspecified' --> 'com.android.support.test:runner:1.0.2' --> 'com.android.support:support-annotations:27.1.1' Constraint path 'simplescales:app:unspecified' --> 'com.android.support:support-annotations:{strictly 26.1.0}' because of the following reason: wanjiaDebugRuntimeClasspath uses version 26.1.0 Dependency path 'simplescales:app:unspecified' --> 'com.android.support:appcompat-v7:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:recyclerview-v7:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support.test:runner:1.0.2' --> 'com.android.support.test:monitor:1.0.2' --> 'com.android.support:support-annotations:27.1.1' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:appcompat-v7:26.1.0' --> 'com.android.support:support-vector-drawable:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:support-v4:26.1.0' --> 'com.android.support:support-compat:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:support-v4:26.1.0' --> 'com.android.support:support-media-compat:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:support-v4:26.1.0' --> 'com.android.support:support-core-utils:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:support-v4:26.1.0' --> 'com.android.support:support-core-ui:26.1.0' --> 'com.android.support:support-annotations:26.1.0' |
在app/build.gradle中加入以下依赖
1 |
implementation 'com.android.support:support-annotations:28.0.0' |
编译项目时出现下面的错误:
CMake Error: CMake was unable to find a build program corresponding to “Ninja”. CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
解决办法:
把项目的build.gradle中的buildscript下面dependencies里的gradle的版本升级以下就行了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
buildscript { repositories { google() maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' } jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.5.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } |
原来是:
1 |
classpath 'com.android.tools.build:gradle:3.5.3' |
在BoardConfig.mk中找BOARD_SEPOLICY_DIRS,将你的sepolicy目录加到这个变量中,如下所示:
1 2 3 4 |
BOARD_SEPOLICY_DIRS := \ device/fsl/imx8/sepolicy \ packages/services/Car/evs/sepolicy \ device/fsl/mek_8q/sepolicy |
在/system/sepolicy/public/attributes文件中输入如下的行来定义
1 |
attribute evs_domain; |
首先在/system/sepolicy/private/file_contexts中定义如下:
1 |
/system/bin/my_app u:object_r:my_app_exec:s0 |
然后创建my_app.te的文件来定义具体的规则:
我们可以在logcat中看到类似如下的日志:
1 2 3 4 5 6 |
04-01 07:55:37.768 5155 5155 I evs_app : type=1400 audit(0.0:20): avc: denied { read } for name="egl" dev="mmcblk0p4" ino=1732 scontext=u:r:evs_app:s0 tcontext=u:object_r:system_file:s0 tclass=dir permissive=1 04-01 07:55:37.768 5155 5155 I evs_app : type=1400 audit(0.0:21): avc: denied { open } for path="/system/lib64/egl" dev="mmcblk0p4" ino=1732 scontext=u:r:evs_app:s0 tcontext=u:object_r:system_file:s0 tclass=dir permissive=1 04-01 07:55:37.768 2879 2879 E SELinux : avc: denied { find } for interface=android.hardware.automotive.vehicle::IVehicle pid=5155 scontext=u:r:evs_app:s0 tcontext=u:object_r:hal_vehicle_hwservice:s0 tclass=hwservice_manager permissive=1 04-01 07:55:37.936 5155 5155 I evs_app : type=1400 audit(0.0:22): avc: denied { call } for scontext=u:r:evs_app:s0 tcontext=u:r:hal_configstore_default:s0 tclass=binder permissive=1 04-01 07:55:37.941 2879 2879 E SELinux : avc: denied { find } for interface=android.hardware.configstore::ISurfaceFlingerConfigs pid=5155 scontext=u:r:evs_app:s0 tcontext=u:object_r:hal_configstore_ISurfaceFlingerConfigs:s0 tclass=hwservice_manager permissive=1 04-01 07:55:42.928 5181 5181 I evs_app : type=1400 audit(0.0:23): avc: denied { call } for scontext=u:r:evs_app:s0 tcontext=u:r:hal_configstore_default:s0 tclass=binder permissive=1 |
我们可以通过audit2allow工具把上面的log转换成合适的规则,配置在策略文件中,如果没有安装过这个工具先安装工具,如下:
1 |
sudo apt install policycoreutils |
将相关的log保存到一个文件中,如avclog.txt,然后执行下面的命令来生成规则:
1 |
audit2allow -i avclog.txt |
本文基于Android8.1系统
进入Android系统的命令行控制台,可以通过locksettings命令来设置锁屏的一些选项,比如开启或者禁止锁屏,设置密码等
命令行的帮助如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
usage: locksettings set-pattern [--old OLD_CREDENTIAL] NEW_PATTERN locksettings set-pin [--old OLD_CREDENTIAL] NEW_PIN locksettings set-password [--old OLD_CREDENTIAL] NEW_PASSWORD locksettings clear [--old OLD_CREDENTIAL] locksettings verify [--old OLD_CREDENTIAL] locksettings set-disabled DISABLED locksettings get-disabled flags: --user USER_ID: specify the user, default value is current user locksettings set-pattern: sets a pattern A pattern is specified by a non-separated list of numbers that index the cell on the pattern in a 1-based manner in left to right and top to bottom order, i.e. the top-left cell is indexed with 1, whereas the bottom-right cell is indexed with 9. Example: 1234 locksettings set-pin: sets a PIN locksettings set-password: sets a password locksettings clear: clears the unlock credential locksettings verify: verifies the credential and unlocks the user locksettings set-disabled: sets whether the lock screen should be disabled locksettings get-disabled: retrieves whether the lock screen is disabled |
允许锁屏
locksettings set-disabled DISABLED
默认不锁屏
locksettings set-disabled true
1 |
frameworks/base/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java |
PinnerService是用于锁定某些模块在内存中,避免这些模块被移出\移入内存从而提高程序的运行效率
具体可以参考https://source.android.google.cn/devices/tech/debug/jank_jitter这个页面中的相关介绍
PinnerService是在Android7.0中才增加的
在Android8.1系统源码中如何配置PinnerService?
打开文件frameworks/base/core/res/res/values/config.xml,增加如下配置:
1 2 3 4 5 6 |
<string-array translatable="false" name="config_defaultPinnerServiceFiles"> <item>"/system/framework/arm/boot-framework.oat"</item> <item>"/system/framework/oat/arm64/services.odex"</item> <item>"/system/framework/arm64/boot.oat"</item> <item>"/system/framework/arm64/boot-core-libart.oat"</item> </string-array> |
具体哪些文件需要配置在PinnerService中?
adb shell dumpsys显示的结果比较长,有的时候我们只想看某一个服务的dump信息,在后面加上那个服务的名字就可以了。我们执行完adb shell dumpsys后,最顶部显示的是当前运行的服务列表,这个列表就是可以细项输出的每个服务名称的列表。
比如:adb shell dumpsys alarm输出的就只有SurfaceFlinger服务的输出信息。
对于某些服务,还能指定更小的分类,比如adb shell dumpsys activity还有更细的输出adb shell dumpsys activity broadcasts,这个我们通过adb shell dumpsys activity -h打印帮助信息就能看到子分类的参数说明了。
adb shell dumpsys生成的列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
Currently running services: DockObserver SurfaceFlinger accessibility activity alarm android.security.keystore android.service.gatekeeper.IGateKeeperService appops appwidget audio autofill backup battery batteryproperties batterystats carrier_config clipboard commontime_management companiondevice connectivity connmetrics content contexthub country_detector cpuinfo dbinfo device_identifiers device_policy deviceidle devicestoragemonitor display dreams drm.drmManager dropbox gfxinfo gpu graphicsstats hardware_properties input input_method installd iphonesubinfo isms isub jobscheduler launcherapps location lock_settings media.audio_flinger media.audio_policy media.camera media.camera.proxy media.drm media.extractor media.metrics media.player media.resource_manager media.sound_trigger_hw media_projection media_resource_monitor media_router media_session meminfo mount netd netd_listener netpolicy netstats network_management network_score network_time_update_service notification otadexopt overlay package package_native permission phone pinner power processinfo procstats recovery restrictions rttmanager scheduling_policy search sec_key_att_app_id_provider sensorservice serial servicediscovery settings shortcut simphonebook soundtrigger statusbar storaged storagestats telecom telephony.registry textservices thermalservice trust uimode updatelock usagestats usb user voiceinteraction vrmanager wallpaper webviewupdate wifi wificond wifiscanner window |
本文基于Android8.1系统整理
本文根据SystemServer.java中的代码进行整理
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调用
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