Android 高通8909 系统之路之裁剪系统 一
*Android系统之应用裁剪
*Android系统之服务裁剪
此前在MTK6573,6577 做了很多系统裁剪以及部分驱动,接下来对之前MTK经验基础上对高通8909(7.1.1),8905(5.1)进行系统裁剪与定制,开始前记录下 系统定制之路遇到过的坑!
android系统裁剪优化一直是各个厂商定制产品的关键步骤,包括浅层次的去除不必要的apk(android apk裁剪定制 )和深层次的裁剪整个编译系统和框架层. android作为开源系统,各个产品同质化严重,只有深层次的裁剪定制自己的系统,才能充分体现各自产品的特性,也是优化各自产品的关键步骤,此篇文章主要关注编译系统和框架层的裁剪,抛砖引玉, 还有很多地方可以改进的地方,基于工作中时间限制,没有彻彻底底的进行。
android系统裁减之应用裁减
android系统大而繁杂,对于不太熟悉android真个框架的朋友可以从简单删除应用入手:
1: 给予原生的代码镜像,adb shell进入单板, 主要是查看/system文件夹的内容,从这个文件夹入手,裁剪不必要的服务,库文件,apk,等等.
2: 了解真个编译系统,从编译过程入手,看隐含的可裁剪项,过程和思路很重要
具体裁剪内容:
1: build/target/product是编译产品关键的mk文件存放处,此处可以更加各个mk文件编译内容进行裁剪
base.mk文件:去除不必要的lib库文件和bin文件
core_minimal.mk: dmtracedump, Shell, HTMLViewer, screencap等工具和apk等
core.mk: libnfc_ndef, mms-common nfc功能库文件和mms短信功能等
embedded.mk: dumpstate, dumpsys
emulator.mk: camera.goldfish , camera.goldfish.jpeg , lights.goldfish , gps.goldfish等
full_base.mk: 去除不需要的库和apk
full_base_telephony.mk: 去除apk和电话功能
generic_no_telephony.mk:去除apk和不必要的库
languages_full.mk,locales_full.mk: 去除不需要的语言设置(可以去除res包的大小)
2:
external/icu4c/stubdata/icu-data-default.txt: 修改此文件,去除编译出的icu.dat文件大小,去除不需要的语言,重新用脚本生成想要的dat文件即可
external/skia/Android.mk: 去除其中test的编译
3:
frameworks/base/data/etc/platform.xml: 去除不需要的属性
frameworks/base/data/fonts/Android.mk: 去除不需要的字体
frameworks/base/data/fonts/fallback_fonts.xml: 去除不需要的字体
frameworks/base/data/fonts/fonts.mk: 去除不需要的字体
4:
frameworks/base/data/sounds/AllAudio.mk: 去除不需要的声音文件(除了ui的保留,其他都可以去除)
frameworks/base/data/videos/VideoPackage1.mk: 去除不需要的视频文件
frameworks/native/data/etc/handheld_core_hardware.xml: 去除不需要的属性
frameworks/native/data/etc/tablet_core_hardware.xml: 去除不需要的属性
frameworks/base/preloaded-classes: 裁剪不必要的资源加载
5:
init.rc: 裁剪不需要的本地服务
system.prop: 裁剪不必要的属性内容
以上这些内容可以使得镜像大大的减少,包括参加apk内容,根据实践,镜像减少100M,当然还有可以裁剪的地方,请广大同胞搞点玉出来,我也好学习学习
1,
Andriod 4.0.4系统包 | Andriod 4.1.1系统包 | 说明 | |
ApplicationsProvider.apk | ApplicationsProvider.apk | 应用程序存储、 程序管理器(不可删) | |
BackupRestoreConfirmation.apk | BackupRestoreConfirmation.apk | (不能删) | |
Bluetooth.apk | Bluetooth.apk | 蓝牙(不能删,你懂的) | |
BooksTablet.apk | Books.apk | 谷歌读书软件(可删,没用的看书软件,可用GGbook或者其他代替,没啥用,我删了) | |
BrowserGoogle.apk | BrowserGoogle.apk | 自带浏览器(可删,没啥用,我删了,反正我用UC浏览器) | |
Calculator.apk | Calculator.apk | 计算器(可删,鸡肋的计算器,可用其他多功能计算器代替,没啥用,我删了) | |
CalendarGoogle.apk | CalendarGoogle.apk | 日历(可删,鸡肋的日历,我删了,加个中华万年历) | |
CalendarProvider.apk | CalendarProvider.apk | 日历储存(可删,上面删了这个也要删) | |
CameraGoogle.apk | 相机(不能删,系统自带的好过其他软件,我已经对比过很多照相软件都没自带的好.原生的强大啊! | ||
CertInstaller.apk | CertInstaller.apk | 证书(不能删) | |
ChromeBookmarksSyncAdapter.apk | ChromeBookmarksSyncAdapter.apk | 书签同步(可删,没啥用,我删了) | |
Contacts.apk | Contacts.apk | 通讯录(不建议删,自带通讯录) | |
ContactsProvider.apk | ContactsProvider.apk | 联系人储存(不建议删,如果用QQ通讯录可直接删掉) | |
Currents.apk | 新鲜汇(4.1.1新增,可删,没用过) | ||
DefaultContainerService.apk | DefaultContainerService.apk | 软件包访问(不能删,删了不能安装软件了) | |
DeskClockGoogle.apk | DeskClockGoogle.apk | 时钟(可删,可用整点闹钟代替,没啥用,我删了) | |
DownloadProvider.apk. | DownloadProvider.apk | 下载提供(可删,那个下载内容,没啥用,我删了) | |
DownloadProviderUi.apk | DownloadProviderUi.apk | 下载提供UI(可删,没啥用,我删了) | |
DrmProvider.apk | DrmProvider.apk | DRM受保护数据存储服务(不能删) | |
EmailGoogle.apk | EmailGoogle.apk | 电子邮件(可删,没用手机看邮件的可删,可用其他代替) | |
ExchangeGoogle.apk | Exchange2Google.apk | 电子邮件服务(可删,上面删了,这也删) | |
FaceLock.apk | FaceLock.apk | 人脸识别(不能删,删了就不能通过人脸锁屏了) | |
GalleryGoogle.apk | GalleryGoogle.apk | 图库 4.1.1包括了相机(不要删,很强大,很好用) | |
GenieWidget.apk | GenieWidget.apk | 新闻与天气(可删,没用的东西) | |
Gmail.apk | Gmail.apk | 谷歌邮箱(可删,没用谷歌邮箱都可以删,反正我就删了) | |
GmsCore.apk | 谷歌PLAY服务(4.1.1新增,可删,不用Google PLAY的可删) | ||
GoogleBackupTransport.apk | GoogleBackupTransport.apk | 谷歌备份传输(建议不删,不喜谷歌者或不需要可删,无FC) | |
GoogleContactsSyncAdapter.apk | GoogleContactsSyncAdapter.apk | 谷歌联系人同步适配器(可删,不喜谷歌者或不需要可删,无FC) | |
GoogleEars.apk | 歌曲识别功能(可删,不怎么用) | ||
GoogleEarth.apk | GoogleEarth.apk | 谷歌地球(可删,没啥用的东西,电脑上用还可以,手机简直无用) | |
GoogleFeedback.apk | GoogleFeedback.apk | 电子市场反馈(可删,不用自带的电子市场就可以删掉这个了,没啥用,反正我就删了) | |
GoogleLoginService.apk | GoogleLoginService.apk | 谷歌账户管理(可删,谷歌帐户,我从不用谷歌帐号的,我删了) | |
GooglePartnerSetup.apk | GooglePartnerSetup.apk | 谷歌合作伙伴(可删,要用谷歌的服务的别删.没啥用,我删了) | |
GoogleQuickSearchBox.apk | 谷歌搜索(可删,要用谷歌搜索的别删.没啥用,我删了) | ||
GoogleServicesFramework.apk | GoogleServicesFramework.apk | 谷歌服务构架(可删,不喜谷歌者或不需要可删,无FC) | |
GoogleTTS.apk | GoogleTTS.apk | 文字转语音(可删,没啥用的东西,反正我就删了) | |
HoloSpiralWallpaper.apk | HoloSpiralWallpaper.apk | 不能删,删了出FC | |
HTMLViewer.apk | HTMLViewer.apk | HTML查看器(可删,没啥用,反正我删了,无FC) | |
InputDevices.apk | 4.1.1新增,不能删 | ||
KeyChain.apk | KeyChain.apk | 密码管理服务, 系统基本组件, 不可卸载(不能删) | |
LatinImeDictionaryPack.apk | LatinImeDictionaryPack.apk | 词典大全(可删.没啥用,,无FC) | |
LatinImeGoogle.apk | LatinImeGoogle.apk | 安卓键盘(可删,没啥用,可百度输入法替代) | |
Launcher2.apk | Launcher2.apk | 启动器(不能删,删了你就没有桌面,也就是用不了了,除非你用其他桌面软件替代 | |
LiveWallpapers.apk | LiveWallpapers.apk | 动态壁纸(可删,上面删看这个也要删) | |
LiveWallpapersPicker.apk | LiveWallpapersPicker.apk | 动态壁纸选择器(可删,反正我不用动态壁纸的,卡啊!,反正我就删了) | |
Magazines.apk | 谷歌杂志(4.1.1新增,可删,没怎么用) | ||
Map.apk | Maps.apk | 地图(可删,可用高德地图或者导航替代,没啥用,我删了) | |
MediaProvider.apk | MediaProvider.apk | 媒体储存(不能删,删除后会出现无法设置铃声) | |
MediaUploader.apk | MediaUploader.apk | 上传的内容(可删,不发彩信的可删) | |
Microbes.apk | 微生物动态壁纸(可删,反正我不用动态壁纸的,我删了) | ||
Mms.apk | Mms.apk | 短信(删除后接受不了彩信) | |
Music2.apk | Music2.apk | 音乐(可删,没有天天动听好用,反正我删了) | |
MusicFX.apk | MusicFX.apk | 音乐音效(可删,上面删了,这也删) | |
NetworkLocation.apk | NetworkLocation.apk | 提供网络位置(可删,删除后有时无法定位,GPS好的时候就没影响) | |
Nfc.apk | Nfc.apk | 近场通讯(可删,反正也用不上) | |
NoiseField.apk | NoiseField.apk | 动态壁纸(可删,反正我不用动态壁纸的,我删了) | |
OneTimeInitializer.apk | OneTimeInitializer.apk | (建议不删,刷机后第一次启动用到的,现在没啥用了,我删了) | |
PackageInstaller.apk | PackageInstaller.apk | 打包安装管理(不能删) | |
PhaseBeam.apk | PhaseBeam.apk | 动态壁纸(可删,反正我不用动态壁纸的,我删了) | |
Phone.apk | Phone.apk | 手机拨号器(不能删) | |
Phoneskyapk | Phonesky.apk | Google play电子市场(可删,反正不用电子市场,删了就不能从google play上下载软件了) | |
PlusOne.apk | PlusOne.apk | google+社区软件(可删,没啥用,我删了) | |
Settings.apk | Settings.apk | 设置(不能删) | |
SettingsProvider.apk | SettingsProvider.apk | 设置储存(不能删) | |
SetupWizard.apk | SetupWizard.apk | 设置向导(不建议删,如果删了,在恢复出厂值开机的时候进不去) | |
SharedStorageBackup.apk | SharedStorageBackup.apk | 共享存储备份(不能删) | |
SoundRecorder.apk | SoundRecorder.apk | 录音机(建议不删,不用的可删) | |
Stk.apx | Stk.apk | SIM卡管理程序(不可删) | |
Street.apk | Street.apk | 谷歌街景(可删,没啥用,我删了,大把软件替代) | |
Superuser.apk | Superuser.apk | Root后才有的(当然不能删) | |
SystemUI.apk | SystemUI.apk | 系统用户界面(不能删) | |
TagGoogle.apk | TagGoogle.apk | NFC标记(建议不删,删了NFC功能不能用) | |
Talk.apk | Talk.apk | 谷歌talk(可删,没啥用,反正我就删了) | |
Talkback.apk | talkback.apk | 盲人辅助(可删,在辅助功能里的,没啥用,反正我就删了) | |
TelephonyProvider.apk | TelephonyProvider.apk | 电话信息储存(不能删) | |
Thinkfree.apk | Thinkfree.apk | 文档软件(可删,没啥用,用其他文档软件可替代) | |
UserDictionaryProvider.apk | UserDictionaryProvider.apk | 我的字典(不能删,删了这个设置语言和输入法的时候会出现FC) | |
Velvet.apk | 谷歌搜索(4.1.1新增,可删,要用谷歌搜索的别删) | ||
VideoEditorGoogle.apk | VideoEditorGoogle.apk | 电影(可删,没啥用,反正我就删了) | |
Videos.apk | Videos.apk | 视频(可删,没啥用,反正我就删了) | |
VisualizationWallpapers.apk | VisualizationWallpapers.apk | 可视化壁纸(可删,反正我不用动态壁纸的,我删了) | |
VoiceDialer.apk | 语音拨号器(可删,语音?那不如那国产山寨机哦,识别速度慢死了,有后天进程,我删了) | ||
VoiceSearch.apk | 语音搜索(可删,理由同上) | ||
VoiceSearchStub.apk | 语音搜索(4.1.1改名了 不用语音搜索的可删) | ||
v*p*nDialogs.apk | v*p*nDialogs.apk | v*p*n连接上网管理(不可删) | |
YouTube.apk | YouTube.apk | (可删,国内都用不了,都被封了,建议都删) |
3,
2 apkCompassCH.apk 超级指南针(建议保留)
3 Bluetooth.apk 蓝牙(删了就没有蓝牙了)建议保留
4 Calculator.apk 计算器(自带计算器较弱,可用其他替代)
5 Camera.apk 自带相机(用360的可删)
6 Contacts.apk 通讯录/联系人(用第三方通讯录的可删)
7 DataDialog.apk 数据对话框 不确定,没删
8 DeskClock.apk 自带闹钟(用第三方闹钟的可删)
9 EngineerMode.apk 工程师模式 不确定,没删
10 ES_filemanager.apk 资源浏览器(建议保留)
11 fmradio.apk 收音机(可删)
12 Gallery3D.apk 相机相框 (可删)
13 GoLauncher.apk 桌面
14 Mms.apk 自带信息(可删,用第三方短信的就删了吧,提示:删了后,用handsms的的弹出短信框会变得延时,chomp没自带短信甚至不能使用)
15 Music.apk 自带音乐(可删,换成其他播放器)
16 Provision.apk 开机引导程序
17 SetupWizard.apk 开机引导(在定制rom时不可删,刷好机可用rootexplorer删掉,恢复出厂前要装回去)
18 SoundRecorder.apk 录音机(可用第三方录音软件替代)
19 Stk.apk s卡服务(可删,有机油把联系人复制在s卡上的就不要删它,删了可解决信号问题)
20 Superuser.apk 授权程序(就是程序列表上面那个,用这个获取root才有的)
21 Term.apk 访问终端的
22 VolumeControl.apk 音量控制中心
23 YGPS.apk 这个应该和GPS有关吧
2 Calendar.apk 日历(不用日历的可删)
3 CalendarProvider.apk 日历程序支持服务(不用日历的可删)
4 ChtPack.apk touchpal输入法注音语言包(从来不用注音的删)
5 Email.apk Email(不用自带email接受邮件的可删)
6 facebook.apk facebook(用不到的删)
7 GenieWidget.apk 天气与新闻(我自己不用他看新闻,删了)
8 Gmail.apk Gmail邮件(可删)
9 GoogleBackupTransport.apk 谷歌备份(可删)
10 GoogleCalendarSyncAdapter.apk 谷歌日历同步适配器(可删)
11 GoogleContactsSyncAdapter.apk 谷歌联系人同步适配器(可删)
12 GoogleFeedback.apk 谷歌反馈(可删)
13 GooglePartnerSetup.apk 谷歌合作伙伴设置(可删)
14 GoogleQuickSearchBox.apk 谷歌搜索(删了影响到桌面的搜索插件)
15 GoogleServicesFramework.apk 谷歌同步支持服务框架(删了不能同步联系人,不能登录google)
16 HTMLViewer.apk HTML浏览器(本地看html,用不到可删)
17 HWCalla_TaiWan.apk 繁体中文手写输入法(可写简体的,不用手写的可删)
18 KaiXinAccountService.apk 未知程序,没敢删
19 LatinIME.apk android键盘输入法(可删)
20 LatinImeGoogle.apk 未知程序,没敢删 输入法谷歌,换百度输入了,删
21 LatinImeTutorial.apk android键盘输入法设置(可删)
22 Launcher2.apk 2.2原生桌面(用ADW和PRO的可删,删了以后第三方桌面要在开机以后从电脑安装,91,豌豆助手都可)
23 LiveWallpapers.apk 动态壁纸
24 LiveWallpapersPicker.apk 同上动态壁纸(可删)
25 LiveWalls.apk 动态壁纸(可删)
26 MagicSmokeWallpapers.apk 魔术烟雾壁纸
27 Maps.apk Google地图(可删,自行换成brust版本)
28 MarketUpdater.apk 谷歌市场升级(软件更新用到,可删)
29 MediaUploader.apk 媒体上传(可删)
30 MMITest_II.apk 工程模式里用到的 手机测试程序(可删)
31 NetworkLocation.apk 网络位置(可删)
32 NotePad.apk 记事本(可删)
33 OneTimeInitiaLizer.apk 首次启动时用来装 Google Apps 的,可删除
34 PicoTts.apk 可删(文字语言转换的语音合成引擎,设置-语音输入与输出中)
35 PingYinIME.apk 拼音输入法
36 ProjectMenuAct.apk 工程菜单
37 Protips.apk 桌面小绿人插件(可删,就是有提示怎么玩手机)
38 RenRenAccountService.apk
39 SNSCommon.apk 常见的SNS,不需要,删
40 SnsContentProvider.apk SnS的内容提供商,删
41 SnsWidget.apk SnS的小工具,删
42 SnsWidget24.apk SnS社区,删
43 Soundback.apk 辅助功能 删
44 Street.apk 谷歌街道(可删,对于国内街道无效果的貌似,与地图关联)
45 Talk.apk 谷歌talk(可删,但删了就用不了电子市场)
46 Talkback.apk 辅助功能 删
47 TouchPal.apk TouchPal输入法(可删,但自带的三种输入法最好至少保留一种)
48 TtsService.apk Google TTS(Text-to-speech)语音库服务(可删)
49 TwidroydFree342-Huawei-rev1.apk twitter客户端(不用的删了)
50 Updataonline.apk 在线升级(可删)
51 UserDictionaryProvider.apk 用户数据字典服务(可删)
52 Vending.apk 电子市场(可删,不过不建议,很多软件的自动升级时候有它很方便)
53 VisualizationWalls.apk 动态音乐背景壁纸 (删了)
54 VoiceSearch.apk 语音搜索(可删,虽然看上去很美好,事实上我从未用过)
55 VpnServices.apk VPN服务(vpn服务,可删)
56 YouTube.apk YouTube视频(要vpn才能看,删了)
57 zhuyincangjieIME.apk 注音仓颉输入法,用百度了,删
android系统裁减之服务裁减
android系统服务分本地(native)服务和java服务。
1、本地(native)服务裁减
很明显:本地(native)服务是基于C/C++实现的,本地服务的启动都在init.rc中通过脚本的方式控制,如surfaceflinger这个服务的启动,
service surfaceflinger /system/bin/surfaceflinger
class core
user system
group graphics drmrpc
onrestart restart zygote
本地(native)服务由ServiceManager注册和管理,如下所示:
sp<IServiceManager> sm(defaultServiceManager);
sm->addService(String16(SurfaceFlinger::getServiceName), flinger, false);
所以对于本地服务的裁减其实只要将相应的服务从init.rc中删除,同时屏蔽掉相应的源码即可。
2、java服务裁减
系统中大部分的服务都以java服务的方法存在,可以在adb shell下通过如下命令查看有哪些服务在后台运行:
<strong>service list</strong>
java服务大部分都在frameworks/base/services/java/com/android/server/SystemServer.java中进行添加,在这里有如下几个方法:
startBootstrapServices:在这里启动了一些系统启动依赖的服务,如:InstallerService、ActivityManagerService、PowerManagerService等等。
startCoreServices:在这里启动了一些如:LightsService、BatteryService、WebViewUpdateService等
startOtherServices:这里启动的服务就比较多了,系统开机耗时也主要在这里,如:TelephonyRegistry、AccountManagerService、VibratorService、FingerprintService、LauncherAppsService等。
所有的java服务都通过ServiceManager注册和管理,对于要裁减掉的java服务,只需要在这里不让其注册就可以了,但对于系统依赖度很高的一些服务,像TelephonyRegistry,单纯的不让其注册是行不通的,系统启动之后会报错误,需要另行处理(后面再说)。
对于一些系统依赖不是很高的服务,可简单的通过如下方法裁减掉,如VibratorService
boolean disableVibrator = SystemProperties.getBoolean("config.disable_vibrator", false);
if(!disableVibrator){
Slog.i(TAG, "Vibrator Service");<pre name="code" class="plain">service check vibrator
vibrator = new VibratorService(context); ServiceManager.addService("vibrator", vibrator); } 然后在对应的vendor中加入如下properties属性值即可,
#Xandy add only for system service config
PRODUCT_PROPERTY_OVERRIDES += \
config.disable_vibrator = true
删掉system目录下的build.prop,重新编译system,烧录启动系统之后,运行如下命令
service check vibrator
得到如下提示:
<strong>service check vibrator
Service vibrator: not found</strong>
ANDROID修改源代码控制永不锁屏
Android系统的锁屏时间存放在Setting数据库中,字段为Settings.System.SCREEN_OFF_TIMEOUT。查看SettingsProvider源码,查看如下文件的源码:
frameworks/base/packages/SettingsProvider/src/com/Android/providers/settings/DatabaseHelper.java
查看loadSystemSettings()函数的代码如下:
private void loadSystemSettings(SQLiteDatabase db) {
SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
+ " VALUES(?,?);");
Resources r = mContext.getResources();
loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
R.bool.def_dim_screen);
loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
"1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
R.integer.def_screen_off_timeout);
// Set default cdma emergency tone
loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);
// Set default cdma call auto retry
loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);
// Set default cdma DTMF type
loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
// Set default hearing aid
loadSetting(stmt, Settings.System.HEARING_AID, 0);
// Set default tty mode
loadSetting(stmt, Settings.System.TTY_MODE, 0);
loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
R.bool.def_airplane_mode_on);
loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
R.string.def_airplane_mode_radios);
loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
R.string.airplane_mode_toggleable_radios);
loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
R.bool.def_auto_time); // Sync time to NITZ
loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
R.integer.def_screen_brightness);
loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
R.bool.def_screen_brightness_automatic_mode);
loadDefaultAnimationSettings(stmt);
loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
R.bool.def_accelerometer_rotation);
loadDefaultHapticSettings(stmt);
stmt.close();
}
从 代码中我们可以看出,假如 Settings.System.SCREEN_OFF_TIMEOUT没有初始化的话(系统首次启动,这个字段肯定是没有初 始化的),将会利用资源中的R.integer.def_screen_off_timeout来初始化。我们为了让系统永不锁屏,只需要把资源 R.integer.def_screen_off_timeout设为-1即可。查看文件
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
可以找到R.integer.def_screen_off_timeout的定义。
<integer name="def_screen_off_timeout">60000</integer>
发现默认值为60000ms,也就是60s。我们只需要把这个参数改为-1。然后重新编译SettingsProvider模块,就OK了。
另外为了防止用户进入系统后,修改锁屏时间,在Setting模块中删除对锁屏时间的设置。这样Android设备就永不锁屏了。
后来发现我的Android设备烧录好之后第一次启动永远不会锁屏,但是设备重启之后开机就进入锁屏状态,解锁之后就再也不会锁屏了(因为永远不超时)。看来“革命尚未成功,同志仍需努力”啊。
那么为什么启动之后没有进入锁屏状态呢?是不会系统有把超时锁屏的值给修改了呢?我通过sqlite3去查看settings.db的内容,发现超时锁屏的值仍然是-1。说明启动之后,系统并没有去数据库中查看屏幕超时锁屏的值,就直接锁屏了。
但是怎样才能开机之后不进入锁屏状态呢?这个是个非常费思量的问题。经过go,我知道锁屏的代码在LockScreen.java中,然后顺藤摸瓜,终于找到了可以设置锁屏功能开关的位置。代码位于:
frameworks/policies/base/phone/com/Android/internal/policy/impl/KeyguardViewMediator.java
该文件中有一个变量定义如下:
/**
* External apps (like the phone app) can tell us to disable the keygaurd.
*/
private boolean mExternallyEnabled = true;
mExternallyEnabled是用来管理是否开启屏幕锁的关键。默认值是打开屏锁,根据注释可以知道他是希望应用程序来修改这个值。但是经过加打印信息发现开机的时候没有任何应用程序会修改它。修改这个值调用如下函数:
/**
* Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide
* a way for external stuff to override normal keyguard behavior. For instance
* the phone app disables the keyguard when it receives incoming calls.
*/
public void setKeyguardEnabled(boolean enabled) {
synchronized (this) {
if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")");
mExternallyEnabled = enabled;
if (!enabled && mShowing) {
if (mExitSecureCallback != null) {
if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring");
// we're in the process of handling a request to verify the user
// can get past the keyguard. ignore extraneous requests to disable / reenable
return;
}
// hiding keyguard that is showing, remember to reshow later
if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, "
+ "disabling status bar expansion");
mNeedToReshowWhenReenabled = true;
hideLocked();
} else if (enabled && mNeedToReshowWhenReenabled) {
// reenabled after previously hidden, reshow
if (DEBUG) Log.d(TAG, "previously hidden, reshowing, reenabling "
+ "status bar expansion");
mNeedToReshowWhenReenabled = false;
if (mExitSecureCallback != null) {
if (DEBUG) Log.d(TAG, "onKeyguardExitResult(false), resetting");
mExitSecureCallback.onKeyguardExitResult(false);
mExitSecureCallback = null;
resetStateLocked();
} else {
showLocked();
// block until we know the keygaurd is done drawing (and post a message
// to unblock us after a timeout so we don't risk blocking too long
// and causing an ANR).
mWaitingUntilKeyguardVisible = true;
mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_DRAWING, KEYGUARD_DONE_DRAWING_TIMEOUT_MS);
if (DEBUG) Log.d(TAG, "waiting until mWaitingUntilKeyguardVisible is false");
while (mWaitingUntilKeyguardVisible) {
try {
wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
if (DEBUG) Log.d(TAG, "done waiting for mWaitingUntilKeyguardVisible");
}
}
}
}
经过上面的讨论我们可以发现我们有两个解决方法:
1、定义变量的时候,给其初始化为false。
2、在launcher模块启动的时候,调用setKeyguardEnabled方法,关闭锁屏功能。
我懒得修改Laucher模块,我的解决方法就是在定义mExternallyEnabled时修改其初始值为false。各位朋友可以根据自己的实际情况选择解决方案。我的代码如下:
/**
* External apps (like the phone app) can tell us to disable the keygaurd.
*/
private boolean mExternallyEnabled = false;
这样修改之后,Android设备开机之后,默认不会进入锁屏状态,除非你在应用程序中调用setKeyguardEnabled方法显示打开这个功能。因为设置的超时时间为-1,则永远也不会进入锁屏界面。完全满足了我的需求,终于大功告成了。开心啊~!!
/**********************************************************************************************/
修改Settings源码,可修改系统设置项,Settings数据被存放于com.android.providers.settings/databases/settings.db中,如果想修改系统启动后加载的默认值
一种方法是直接修改settings.db的值,另一种就是修改SettingsProvider默认值,Settings应用能够配置Android系统的各种设置,这些设置的默认值都是由frameworks中的SettingsProvider从数据库中读取的,那么第一次开机的时候这些数据都是从哪儿来的呢?
frameworks/base/packages/SettingsProvider/res/values/defaults.xml这个文件就是用来存储Android系统的默认设置
例如:
<integername="def_screen_off_timeout">600000</integer>设置关屏超时时间的默认值
<integername="def_screen_brightness">102</integer>设置亮度的默认值
<boolname="def_install_non_market_apps">false</bool>设置是否允许安装非Market应用程序的默认值
如果想定义defaults.xml中没有的,在这里添加后,需修改frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java,加入自己的存储代码。
来电铃声:SD卡ringtones文件下, 支持音频文件(MP3、wav、ogg等格式)。
通知铃声:SD卡notifications,支持音频文件(MP3、wav、ogg等格式)。
闹钟铃声:SD卡alarms,支持音频文件(MP3、wav、ogg等格式)。
附:系统自带铃声文件位置
来电铃声:/system/media/audio/ringtones
通知铃声:/system/media/audio/notifications
闹钟铃声:/system/media/audio/alarms
界面操作事件音:/system/media/audio/ui
/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.jpg
/packages/wallpapers/Basic/src/com/android/wallpaper/nexus/NexusWallpaper.java
/frameworks/base/core/res/res/values/config.xml/mediatek/config/xxx/ProjectConfig.mk
BOOT_LOGO = wvga
开关机和关机充电图
/mediatek/custom/common/uboot/logo/wvga
/packages/apps/Launcher2/res/values/wallpapers.xml
/packages/apps/Launcher2/res/drawable-mdpi/wallpaper_architecture.jpg
/packages/apps/Launcher2/res/drawable-mdpi/wallpaper_architecture_small.jpg
Launcher2 里面预置桌面上的 Item
/packages/apps/Launcher2/res/xml/default_workspace.xml
铃声位置
/frameworks/base/data/sounds/newwavelabs/Backroad.ogg