转èª: http://www.th7.cn/Program/Android/201505/447097.shtml
åå¨åé¢çè¯
ä¸è¬å¨æ°é¡¹ç®å¼å§ä¹åï¼æ们éè¦é对客æ·éæ±è¿è¡åç§ç³»ç»é»è®¤å±æ§çé ç½®ï¼é常è¿äºå±æ§é½æ¯éè¿build.propãsettings.db ãdefault.xmlãä¸äºåè½packageä¸ç config.xml çæ¥è¿è¡åå§åé ç½®çã
é£ä¹ï¼è¦æ»¡è¶³å®¢æ·çå®å¶éæ±ï¼å¯¹äºæ们å¼åè æ¥è¯´ï¼ä¿®æ¹SettingsProvideré»è®¤å¼ï¼è第ä¸æ¬¡å¼æºæ¶ï¼ç¨æ¥å¡«å settings.dbçæ°æ®é½æ¯ä»
frameworks/base/packages/SettingsProvider/res/values/defaults.xml è¿ä¸ªæ件æ¥è¯»åçãæ以大é¨åçç³»ç»å±æ§é½æ¯éè¿ä¿®æ¹æ¤å¤çxmlèç¹æ¥ä¿®æ¹çãå½ç¶æä¸äºå±æ§æ¯å¨deviceä¸çproject.mkä¸å»ä¿®æ¹ä½¿å ¶ç¼è¯æ¶æ·»å å°build.propä¸å»ã
æ¥ä¸æ¥ï¼æå°ä»ææåä¸è¿ç项ç®ä¸ï¼å»ä¸ç¹ç¹çè®°å½éè¦ä¿®æ¹çå±æ§é½æä¹è®¾ç½®ã
对äºAndroidææºODMççæåï¼é读è¿ç¯æç« åï¼åºæ¬ä¸è½å®æ项ç®åæ70%çéé å·¥ä½ï¼å¦ææ¯åMTKå¹³å°çè¯ï¼é£æ´å¥½ï¼å¯ä»¥ç¨æ¥æ§å¶çå®åéæ´å 丰å¯ï¼ã
对äºå¸¦é¡¹ç®ç人æ¥è¯´ï¼è¿äºä¸è¥¿é½æ¯åæå·¥ä½å¿ ä¸å¯å°çä¿®æ¹ç¹ï¼å¯¹äºMMIå·¥ç¨å¸ï¼æ头æ¿å°å®¢æ·éæ±ç±»çBUGæ¶ ï¼è¿äºä¸è¥¿ä¹æ¯è½å¸®å©ä½ å¿«édebugçæåã
è¯ä¸å¤è¯´ï¼è¿äºå°çç¥è¯ç¹ï¼é½æ¯æå¨å¹³å¸¸çå·¥ä½ä¸æ»ç»åºæ¥çï¼æçæ¯éç¨çï¼æçæ¯å¨ç¹å®å¹³å°ä¸æä¼ç¨çå°çï¼ä» ä¾åä½åèï¼å¼éä¸ä¸æè·¯èå·²ï¼è¿ç¯åææä¼ä¸å®æ¶æ´æ°ï¼å享æ´å¤ä»¥å项ç®ä¸éå°çä¸äºéç¨åæ°é ç½®çä¿®æ¹ã
-
å»æâ亮度âä¸çèªå¨è°è
第ä¸æ¥ãä¿®æ¹frameworks/base/core/res/res/values/config.xmlä¸ç
false
第äºæ¥ãå¨Marvell1908å¹³å°ä¸ï¼æ²¡ææ ¹æ®æ¤propertyæ¥ç¡®å®âèªå¨âæé®çæ¾ç¤ºè¿æ¯éèï¼æ以è¿éå¨SystemUIä¸å¨æç¡®å®è¯¥CheckBoxçæ¾ç¤ºä¸å¦:
BrightnessController.javaä¸æ·»å å¦ä¸æ¹æ³
private void updateAutomaticButton(boolean automatic) {
android.util.Log.d(TAG, " Automatic button aviliable: " + automatic);
if(null != mControl) {
mControl.setAutomaticAvailable(automatic);
}
}
å¨updateMode()ä¸è°ç¨è¯¥æ¹æ³:
private void updateMode() {
// ⦠â¦
} else {
mControl.setChecked(false);
updateIcon(false /*automatic*/);
}
updateAutomaticButton(mAutomaticAvailable);
}
å¨ToggleSlider.javaä¸æ·»å æ¥å£ï¼
public void setAutomaticAvailable(boolean autoBrightness) {
if(null != mToggle) {
//mToggle.setWidth(autoBrightness ? 48: 0);
mToggle.getLayoutParams().width = autoBrightness ? 48: 0;
mToggle.setOnCheckedChangeListener(autoBrightness ? this : null);
}
}
Tip:
ä¸æ¯æå æ设å¤å»æâèªå¨è°è亮度âéè¦èè æ¡é¢å°é¨ä»¶ãä¸æç¶ææ ã亮度è°èDialog以å第ä¸æ¹apkè¿å个æ¹é¢çIconçæ¾ç¤ºé®é¢ãå¦æä¿®æ¹boolean propertyè¿ä¸è½è¾¾å°ææï¼å°±éè¦èè第äºæ¥ã
-
ä¿®æ¹â亮度âçæå¼ãé»è®¤å¼ãåæå¼
ä¿®æ¹frameworks/base/core/res/res/values/config.xmlä¸ç
10<!âææå¼ -->
255<!âæ亮å¼â>
102<!âé»è®¤å¼â>
10<!âé¿æ¶é´ä¸æä½æ¶å±å¹ä¼çªç¶åæä½å¹¶ä¸çå±æ¶ç亮度â>
-
ä¿®æ¹å¼æºæ¶çé»è®¤äº®åº¦
ä¿®æ¹frameworks/base/packages/SettingsProvider/res/values/defaults.xmlä¸ç
51
-
ä¿®æ¹å¼å ³æºé声
å¼å ³æºå¨ç»ç¸å ³æå¨è·¯å¾æ¯å¨frameworks/base/cmds/bootanimation/ä¸å»æä½ç(ä¸åå¹³å°ç¥æä¸å)ï¼
Android设å¤çé声èµæºé½æ¯å¨frameworks/base/data/soundsä¸
Marvell å¹³å°æ¯å¨frameworks/base/cmds/bootanimation/BootAudio.cpp
#define USER_BOOTMUSIC_FILE â/data/local/bootupmusic.mp3â
#define SYSTEM_BOOTMUSIC_FILE â/system/media/bootupmusic.mp3â
#define USER_SHUTDOWNMUSIC_FILE â/data/local/shutdownmusic.mp3â
#define SYSTEM_SHUTDOWNMUSIC_FILE â/system/media/shutdownmusic.mp3â
ç¨éè¦æ¿æ¢çå¼å ³æºé声overlay 对åºçæ件 /system/media/bootupmusic.mp3 å /system/media/shutdownmusic.mp3 å³å¯ï¼æ³¨æèµæºå称è¦ä¸è´ï¼æ¹ä¸ºå¯¹åºçbootupmusic.mp3 æè shutdownmusic.mp3
Qualcommå¹³å°æ¯å¨frameworks/base/cmds/bootanimation/ bootanimation_main.cppä¸
void BootAnimation::playBackgroundMusic(void)
{
char bootAudioFile[] = "/system/media/boot.wav";
char shutdownAudioFile[] = "/system/media/shutdown.wav";
// ⦠â¦
}
éè¦å°æ¿æ¢çèµæºoverlayä¸boot.wav shutdown.wav 注æå称ä¸è´ï¼æ ¼å¼ä¹å¿ é¡»ä¸è´ãæè ç´æ¥ä¿®æ¹è¿éçcpp代ç ã
-
ä¿®æ¹Androidé»è®¤å£çº¸
Overlayæframeworks/base/core/res/res/drawable-nodpi/ default_wallpaper.jpgå³å¯
-
ç¼è¯çæ¬æ¶ä¸çæodex
ä¸è¬odexåæ¯å¨4.0以åççæ¬ä¸æçåè½ï¼odexåå¯ä»¥ä½¿ç³»ç»çå¯å¨åç¨åºè¿è¡é度大大æé«ï¼ç¨³å®æ§ä¸åãä½æ¯ç¼è¯æ¶çæodexå ä¼å¤§å¤§å¢å system.imgçä½ç§¯ï¼ä¸å©äºotaå级ï¼tå¡å级ï¼æ以å¨ç¼è¯æ¶å¯ä»¥å»odexã
éè¦å¨.mkæ件ä¸æ·»å å±æ§ï¼
#remove odex
DISABLE_DEXPREOPT:=true
-
ä¿®æ¹é»è®¤æ¥çµé声ãéç¥é声
é¦å éè¦æ£æ¥è¦ä¿®æ¹çèµæºæ¯å¦å¨frameworks/base/data/sounds/ä¸çnotifications/åringtones/ä¸ï¼å¦æ没æï¼éè¦æ·»å ä¸å»ï¼å°èµæºå¨è¯¥ç®å½ä¸ç.mkä¸æç §å ¶ä»çèµæºçæ¹å¼æ·»å è¿å»ãç¶åå¨deviceä¸ç.mkä¸æ·»å å±æ§ï¼
ADDITIONAL_BUILD_PROPERTIES += /
ro.config.ringtone = Andromeda.ogg /
ro.config.notification_sound=Heaven.ogg
注æï¼å¨ä¸åçå¹³å°ä¸propertiesçå®å®ä¹å¯è½ææä¸åï¼å¨Marvellä¸ADDITIONAL_BUILD_PROPERTIES为propertyçoverlay propertyèå¨Qualcommä¸ build peopertyçå® ä¸ºPRODUCT_PROPERTY_OVERRIDESï¼è¦é¢ç½®çé声èµæºéè¦å¨è®¾å¤ä¸åå¨ï¼ä¸ç¶é»è®¤é声就为âæ âï¼è¿ä¸ªå¯ä»¥å»frameworks/base/data/sounds/ä¸é¢æ¥çï¼ç¶å对åºä¿®æ¹AllAudio.mklæ件å³å¯ã
-
ä¿®æ¹è¯è¨å表ãé»è®¤è¯è¨
å¨.mkä¸ä¿®æ¹å±æ§ï¼
only use zh_CN ,us and default CN
PRODUCT_LOCALES += zh_CN en_US
PRODUCT_PROPERTY_OVERRIDES += /
persist.sys.language=zh /
persist.sys.country=CN /
ro.product.locale.language=zh /
ro.product.locale.region=CN
注ææ¯ += èä¸æ¯ :=
:= è¦çåé¢çå¼
+= æ·»å =åé¢çå¼
?= å¦æ没æ被èµå¼ï¼å°±èµå¼äº=åé¢çå¼
å¨è¿éå°±æ¯å°è¿äºå±æ§å ¨é¨è¦çä¹åçå®ä¹ãå¯ä»¥çå°å¨è¿éå®ä¹äº é»è®¤è¯è¨ä¸ºä¸æï¼é»è®¤å°åºä¸ºä¸å½ã并ä¸åªæ ä¸æè±æ 两ç§ã
-
ä¿®æ¹é»è®¤æ¶åº
å¨.mkä¸æ·»å ï¼
PRODUCT_PROPERTY_OVERRIDES += /
persist.sys.timezone= Asia/Shanghai
å¦å¤è¿æä¸ç§æ¹æ³ï¼
å¨ init.rc ä¸æ·»å
#set default timezone
setprop persist.sys.timezone Asia/Shanghai
ç´æ¥å¨åºå±ä¿®æ¹é»è®¤æ¶åºï¼å¦æä¸çæï¼æ好让驱å¨å·¥ç¨å¸æ¥ä¿®æ¹ï¼
-
ä¿®æ¹å¼å ³æºå¨ç»
ä¸ä¿®æ¹å¼å ³æºé声ä¸æ ·ï¼å¼å ³æºå¨ç»ç¸å ³ä»£ç é½æ¯å¨frameworks/base/cmds/bootanimation/ä¸ï¼éè¦æä»¬æ ¹æ®ä»£ç å»å¶ä½å¨ç»ã
ä¸è¬å¨Android设å¤ä¸ï¼å¼å ³æºå¨ç»é½æ¯éè¿å¸§å¨ç»æ¥å®ç°çã
以Marvellå¹³å°ä¸ºåèï¼
frameworks/base/cmds/bootanimation/BootAnimation.cpp
#define USER_BOOTANIMATION_FILE â/data/local/bootanimation.zipâ
#define SYSTEM_BOOTANIMATION_FILE â/system/media/bootanimation.zipâ
//add shutdown animation
#define USER_SHUTDOWNANIMATION_FILE â/data/local/shutdown.zipâ
#define SYSTEM_SHUTDOWNANIMATION_FILE â/system/media/shutdown.zipâ
æ以éè¦å»overlay èµæº /system/media/bootanimation.zip å/system/media/shutdown.zipï¼ä¸é¢ç®åçä»ç»ä¸å¼å ³æºå¨ç»zipçå¶ä½ï¼
- 建ç«bootanimationæ件夹ï¼
- å¨bootanimation/ä¸æ·»å å¼æºå¾çï¼å¾çå¿ é¡»ä¸º.pngæ ¼å¼ï¼
- å°å¾çæç §start00001.png start00002.png ⦠⦠start00049.pngæ ¼å¼å½åï¼
- æç §ä¸ªäººéè¦å°å¾çæåºå·æ¾å¨æ件夹part0 ãpart1 ãpart2ä¸ï¼å ·ä½å 个partXæ件夹ï¼æç §ä¸ªäººéæ±ï¼
- å¨bootanimation/ä¸æ·»å å¨ç»å±æ§æè¿°æ件desc.txt,ä»ç¨æ¥è®¾ç½®å¨ç»çåç´ ã帧ãéªç次æ°ãæ件夹å称ï¼
desc.txt å¿ é¡»ä¸¥æ ¼æ§è¡Makefileæ ¼å¼
æ们çä¸ä¸ªdest.txt:
320 480 15
p 1 0 part0
p 0 0 part1
320 480 15 --> 320 åç´ å®½åº¦ 480 åç´ é«åº¦ 15 帧æ°
p 1 0 part --> p æ è¯ç¬¦ 1 循ç¯æ¬¡æ°ä¸º1 0 é¶æ®µé´éæ¶é´ä¸º0 part0 对åºæ件夹ï¼ä¸ºç¬¬ä¸é¶æ®µå¨ç»ç®å½
p 0 0 part1 --> p æ è¯ç¬¦ 0 æ¬é¶æ®µæ éå¾ªç¯ 0 é¶æ®µé´éæ¶é´ä¸º0 part1 对åºæ件夹ï¼ä¸ºç¬¬äºé¶æ®µå¨ç»
æåå¿ é¡»è¦æå车符ï¼ç¡®ä¿æ令é½å·²ç»å®æã
- å¼å§æå ï¼ä½¿ç¨WinRARåç¼©å·¥å ·ï¼æå 为bootanimation.zipï¼
éè¦éæ©âå缩æä»¶æ ¼å¼â为 .zip;
éè¦éæ©âå缩æ¹å¼â为âåå¨âã
å¶ä½å®æã
-
ä¿®æ¹ç¶ææ éæ
ç¶ææ éæçå±æ§æ¯å¨andorid4.4ä¸é¢åºç°çæ°ç¹æ§ï¼ä¸è¿å¯¹äºç¶ææ éæææç设置è¦æ±æ¯è¾é«ï¼ä¸è¬æ¯å¨è¿è¡å å>=512Mç设å¤ä¸æè½è¿è¡ï¼å 为è¦å®ç°ç¶ææ éæéè¦ç¡¬ä»¶å éæ¥é åï¼ä¸ç¶å¨ç»ææååå¡é¡¿ãä¿®æ¹ç¶ææ éæéè¦SystemUIä¸Launcheré åï¼æè½è¾¾å°ææã
- ä¿®æ¹SystemUIçä¸ä¸ªå±æ§
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java::
public static final boolean HIGH_END = ActivityManager.isHighEndGfx() ;
// ActivityManager.isHighEndGfx()æ¯ç¨æ¥å¤æç³»ç»æ¯å¦ä¸ºå¤§å å设å¤ãå°HIGH_END = true 让SystemUIé»è®¤ä¸ºå¤§å å设å¤
- å¨packages/apps/Launcher2/src/com/android/launcher2/style.xmlä¸èªå®ä¹ä¸ä¸ªç¶ææ éæçThemeå±æ§èç¹ï¼
å¨android4.4以åframewokä¸Theme.xmlä¸å¢å äºä»¥ä¸ä¸¤ä¸ªå±æ§èç¹ï¼
<item name="windowTranslucentStatus">false</item><!â设置ç¶ææ éæ -->
<item name="windowTranslucentNavigation">false</item><!â设置èææé®éæ -->
ç±äºMarvell项ç®ä¸ä½¿ç¨çæ¯å®ä½æé®ï¼æ以就åªè¦çäºä¸é¢é£ä¸ªå±æ§ã
-
ä¿®æ¹packages/apps/Launcher2/src/com/android/launcher2/Launcher2.java::
@Override
protected void onCreate(Bundle savedInstanceState) {
if("pxa1L88H3".equals(Build.DEVICE)) {//Added by hanhao for bug30425 20140902 setTheme(R.style.TransparentTheme); }
}
å¨LauncherçonCreateæ¹æ³ä¸ä½¿ç¨èªå®ä¹å±æ§ï¼æè ç´æ¥å¨AndroidMainest.xmlä¸éè¿android:theme=â@style/ TransparentThemeâèç¹æ¥å®ç°ã
-
å»ææ¡é¢ä¸çGoogleæç´¢æ¡
ä¸è¬è¿ä¸ªéæ±æ¯é对使ç¨Googleåçå¯å¨å¨Launcher2èè¨çãå 为å¨Googleåç代ç éï¼ææ¾ç¤ºGoogleSearchç代ç ï¼ä¸»è¦æ¯ä¸ºäºæ¾ç¤ºGoogleæç´¢ï¼å¦ææGoogleVoiceè¿å¯ä»¥æ¾ç¤ºè¯é³æç´¢æé®ï¼é对大éææºæ¥è¯´ï¼Google Searchåè½å·²ç»è¢«åè°æï¼æ以è¦ä¹å¶ä½æç¾åº¦æç´¢ï¼è¦ä¹å»æãå»æGoogleæç´¢æ¡çæ¹æ³æå¾å¤ãå两æ¥èµ°ï¼ç¬¬ä¸ï¼å»æGoogleæç´¢æ¡ï¼ç¬¬äºãè°æ´Workspaceå¸å±ï¼å»æGoogleæç´¢æ¡å¨çé¢ä¸çå ä½ã
第ä¸ãå»æGoogleæç´¢æ¡
- ç®åç²æ´å¼ä¸
packages/apps/Launcher2/src/com/android/launcher2/Launcher.java::
private boolean updateGlobalSearchIcon() {
final SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
ComponentName activityName = searchManager.getGlobalSearchActivity();
if(Build.DEVICE.equals(âpxa1L88H3â)) {
activityName = null;
}
if (activityName != null) {
// ⦠â¦
else {
// We disable both search and voice search when there is no global search provider
}
}
å¨Launcher2è¿ç¨å¯å¨æ¶ï¼onCreateåonResumeä¸ä¼æ´æ°GlobalSearchå¾æ 并ä¿åå¨æ°ç»ä¸ï¼ä¸é¢çä¿®æ¹ å°é»è¾ä¿®æ¹æäºå¨è®¾å¤ä¸æ°¸è¿é»è®¤æ²¡æGlobalSearch åºç¨ï¼æ以就走äºä¸é¢çelseåæ¯ï¼å¯ä¿è¯æ¡é¢ä¸æ¾ç¤ºGoogleæç´¢æ¡ï¼ä¸é¢æ¯æ ¹æ®é¡¹ç®ååå¤æï¼ä¹å¯ä»¥ç´æ¥è¿æ ·ï¼
if (false && activityName != null) {
- ç®åç²æ´å¼äº
å¨packages/apps/Launcher2/res/values/dimens.xmlä¸ä¿®æ¹èç¹
0dp<!âGoogleæç´¢æ¡çé«åº¦â>
è¿æ ·ä¹è½ä¿è¯æ°¸ä¸æ¾ç¤ºGoogleæç´¢æ¡
- ä¿®æ¹QuickSearchBox模å
å»æAndroidManifest.xmlçä¸é¢èç¹:
æ¯è¾å¯åçæ¯1ã3è¿ä¸¤ç§æ¹æ³ã
第äºãå»æWorkspaceçå ä½
主è¦æ¯å¾®è°å¸å±ï¼ä¿®æ¹values/dimens.xmlï¼æéä¿®æ¹éå½çæ°å¼ï¼ä¸é¢æ¯å 个亲æµç¬¦åho9021项ç®4.3寸å±çå¸å±
è°æ´cellLayoutçå¸å±+è°æ´ShortcutIconçé´è·ï¼ä½¿å ¶æ´ä½ä¸ç§»
28dp
48dp
18dp
å¦å¤è¿å¯ä»¥éè¿è®¾ç½®Workspaceçé«åº¦é åè°æ´ShortcutIconçé´è·ä¹è½å®ç°ï¼
100dp
-
å¨Launcherä¸éèææ个App
å¨è¿éæ说çLauncheré½æ¯GoogleåççLauncher2åºç¨ã
ä¿®æ¹packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java::
private void loadAllAppsByBatch() {
// ⦠â¦
apps = packageManager.queryIntentActivities(mainIntent, 0);
if (DEBUG_LOADERS) {
Log.d(TAG, "queryIntentActivities took "
+ (SystemClock.uptimeMillis()-qiaTime) + "ms");
}
if (apps == null) {
return;
}
// Added for example code start
ResolveInfo removeApp = null;
for(ResolveInfo info : apps) {
if(nullï¼= info &&
info.activityInfo.packageName.equals(âcom.android.spare_partsâ)) {
removeApp = info;
}
}
if(null != removeApp) {
apps.remove(removeApp);
}
// Added end
N = apps.size();
// ⦠â¦
}
ä¸é¢ç代ç æ¯å¨å¯å¨å¨å¯å¨æ¶ä¼éè¿ä¸ä¸ªListå°å个appä¿¡æ¯ä¿åèµ·æ¥ï¼ç¶ååæ·»å å°æ¡å¸ä¸ï¼ä¸é¢ç代ç å°±æ¯éåè·åå°çææç符åæ¡ä»¶çappï¼è¿æ»¤ææ们ä¸æ³æ¾ç¤ºçãå½ç¶è¯¥ä»£ç å¯ä»¥æ½ååºæ¥æä¸ä¸ªæ¹æ³ï¼æè æ¾å ¥æ²¹æ¡å ä¸ï¼æ½è±¡æä¸ä¸ªstaticçå·¥å ·ã
é£ä¹å¦æè¦éèæçappæ¯è¾å¤çæ¶åæä¹åï¼ å ¶å®å¯ä»¥æ°å»ºä¸ä¸ªtempArrayList,å°æ¥è¯¢ä¿¡æ¯ç¬¦åååæ¥æ¾æ¡ä»¶çåaddå°appsä¸ï¼è¯¥æ¹æ³ä¸ºå¦ä¸patchï¼
-
å¨ä»»å¡ç®¡çå¨âå ¨é¨âä¸å»ææ个App
ä»»å¡ç®¡çå¨æ¯Setting模åä¸çä¸ä¸ªåè½ï¼å ¶å®ä¹å°±æ¯â设置âåºç¨ç¨åºâå ¨é¨âãéè¦ä¿®æ¹packages/apps/settings/src/com/android/settings/applications/ManageApplications.java
static class ApplicationsAdapter::
ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
ArrayList<ApplicationsState.AppEntry> origEntries) {
// æ¤å¤è®¾ç½®è¿æ»¤æ¡ä»¶è¿è¡è¿æ»¤çé
if (prefix == null || prefix.length() == 0) {
return origEntries;
} else {
// ⦠â¦
}
}
该éæ±çå®ç°ä¸éèæLauncherä¸çæ个Appçé»è¾ç¸åãPatchå¦ä¸ï¼
- ä¿®æ¹è¾å ¥æ³å表ã设置é»è®¤çè¾å ¥æ³
é»è®¤è¾å ¥æ³æ¯å¨frameworks/base/packages/SettingsProvider/res/values/defaults.xmlä¸çèç¹ï¼åªéè¦å¨.mkä¸å»overlayå³å¯ã
com.android.inputmethod.latin/ .LatinIME:com.baidu.input/.ImeService:com.baidu.input/com.baidu.input.IME
>com.baidu.input/.ImeService
å ¶ä¸def_enable_input_methodsæ¯è¦æ¾ç¤ºå°è¾å ¥æ³å表ä¸çé»è®¤è¾å ¥æ³ï¼å¯ä»¥çå°è¿ä¸ªèç¹ä¸é»è®¤çæ两个è¾å ¥æ³ï¼Androidé®çåç¾åº¦è¾å ¥æ³ï¼
def_input_methodæ¯é»è®¤è¢«éä¸çé£ä¸ªè¾å ¥æ³ï¼å¯ä»¥çå°è¿ä¸ªèç¹ä¸é»è®¤è¢«éä¸çè¾å ¥æ³æ¯ç¾åº¦è¾å ¥æ³ã
com.baidu.input ->å¨AndroidManifest.xmlä¸ç pachakename
.ImeService ->å¨AndroidManifest.xmlä¸ç service name
-
ä¿®æ¹é»è®¤ä¸éå±
1.å¨.mk ä¸å¦ææå±æ§ ro.lockscreen.disable.default = true å注éæï¼
2.Overlay SettingsProviderä¸çä¸ä¸ªå±æ§:
frameworks/base/packages/SettingsProvider/res/values/defaults.xml:
false
<!âæ¹ä¸ºtrue å°±é»è®¤éå±æ¹å¼âæ ââ>
å 为å¨frameworks/base/packages/settingsprovider/src/com/android/providers/settings/ DatabaseHelper.java::
if (SystemProperties.getBoolean("ro.lockscreen.disable.default", false) == true) {
loadSetting(stmt, Settings.System.LOCKSCREEN_DISABLED, "1");
} else {
loadBooleanSetting(stmt, Settings.System.LOCKSCREEN_DISABLED,
R.bool.def_lockscreen_disabled);
}
å¦æè®¾ç½®äº propertyå±æ§ï¼é£ä¹å°±ç´æ¥è®¾ç½®ä¸ºé»è®¤æéå±ï¼å¿½ç¥default.xmlä¸çèç¹ã
-
设置第ä¸æ¬¡å¼æºæ¶çé»è®¤Launcher
该éæ±æ¯å¨Marvellçho_9021ä¸åçï¼å¨9021ä¸é¤äºGoogleåçLauncherä¹å¤ï¼è¿é¢ç½®äºä¸ä¸ªå®¾ææ¡é¢ï¼é£ä¹å¨ç¬¬ä¸æ¬¡å¼æºæ¶ï¼ç±äºæ²¡æ设置preferred Activity è¿å°±å¯¼è´å¨ç¬¬ä¸æ¬¡å¼æºæ¶åé¦å ä¼å¼¹åºä¸ä¸ªé项æ¡è®©ç¨æ·éæ©launcherã
è¿ä¸ªéæ±æ¯å¨ç¬¬ä¸æ¬¡å¼æºæ¶ï¼ç´æ¥è¿å ¥é»è®¤çLauncherï¼ä¸å¼¹åºé项æ¡ï¼å½ç¨æ·ä»â设置âåºç¨âå ¨é¨âï¼éæ©æ£å¨ä½¿ç¨çLauncherï¼å¹¶ç¹å»âæ¸ é¤é»è®¤è®¾ç½®âï¼å°±è½å»æLauncherçpreferred å±æ§ï¼å½å次åå°æ¡é¢ï¼åæ£å¸¸å¼¹åºé项æ¡ã
该éæ±ä¿®æ¹çåææ¯ç³»ç»æ²¡æå¼æºå导ï¼ä½¿ç¨Androidé»è®¤çå¼æºå导ãå¨Androidæºç ä¼ææ个packages/apps/Provision模åï¼å¾å°æ人注æå°ä»ã
ä»ä»çAndroidManifest.xmlä¸ä»category å¯ä»¥çå°ä»ä¹æ¯ä¸ä¸ªLauncherï¼åæ¶ä»çpriority=â1â说æä»çä¼å 级æ¯æé«çï¼ä¹å°±æ¯ç³»ç»ç¬¬ä¸æ¬¡å¯å¨æ¶ï¼å¯å¨ç第ä¸ä¸ªLauncherå°±æ¯ä»DefaultActivityã对è¿éæå ´è¶£çåå¦ï¼å¯ä»¥çä¸ä¸è¿ä¸ªæ¨¡åï¼åè½é常ç®åï¼å°±æ¯ä» ä» å¨ç¬¬ä¸æ¬¡å¼æºæ¶å®æä¸äºå¼æºå导类çå·¥ä½ã
ä¸é¢å°±æ¥å ¥æ£é¢ï¼åæä¸ä¸æä¹è®¾ç½®é»è®¤launcherï¼é¦å æä¸¤ä¸ªå ³é®ç¹ï¼
- 设置é»è®¤Applicationéè¦å ä¸æéï¼
- éè¦å¨DefaultActivity.javaçä¸é¢è¿æ®µä»£ç ä¹ååæä½ï¼
ComponentName name = new ComponentName(this, DefaultActivity.class);
pm.setComponentEnabledSetting(name,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
è¿æ®µä»£ç æ¯å°Provision Applicationä»PackageManagerä¸ç§»é¤ãå¦æå¨è¿æ®µä»£ç ä¹åæä½ï¼å°±ä¼æ¥éï¼æè 失败ã
设置é»è®¤Luancherï¼
- è·å注åå°ç³»ç»ä¸çææLauncherï¼
Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent, 0);
Tips:
å¨æ¤å¤è·åç³»ç»ä¸LauncherçListæ¶ä¸è½ä½¿ç¨pckageManagerç
getHomeActivities(List outActivities)ï¼æ¹æ³ï¼éè¿è¿ç§æ¹æ³ä¼å¯¼è´è®¾ç½®å¤±è´¥ï¼å ·ä½åå æè¿ä¸å¤ªç¥éã
- å°Pervisionä»resolveInfoListä¸è¿æ»¤æï¼
int size = resolveInfoList.size();
for(int i = 0; i < size; ) {
final ResolveInfo resolveInfo = resolveInfoList.get(i);
final ActivityInfo activityInfo = resolveInfo.activityInfo;
if(null != activityInfo && activityInfo.packageName.equals(this.getPackageName())) {
resolveInfoList.remove(i);
size -= 1;
} else {
i++;
}
}
- è·åè¦è®¾ç½®ä¸ºé»è®¤Launcherç match(ç³»ç»å¹é 度)
ComponentName[] set = new ComponentName[size];
ComponentName defaultLauncher = new ComponentName(âcom.android.bglauncherâ,
âcom.ibingo.launcher2.Launcherâ);
int defaultMatch = 0;
for(int i = 0; i < size; i++) {
final ResolveInfo resolveInfo = resolveInfoList.get(i);
final ActivityInfo activityInfo = resolveInfo.activityInfo;
if(null == activityInfo) {
continue;
}
set[i] = new ComponentName(activityInfo.packageName, activityInfo.name);
if(defaultLauncher.getClassName().equals(activityInfo.name)) {
defaultMatch = resolveInfo.match;
}
Slog.d(TAG, " candidate launcher:" + resolveInfo.toString());
}
- 使ç¨PackageManagerçaddPreferredActivityæ¹æ³è®¾ç½®é»è®¤Launcher
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);
pm.clearPackagePreferredActivities(defaultLauncher.getPackageName());
pm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);
Slog.d(TAG, " set default Launcher succesfully!");
æ们å¯ä»¥çå°ç¬¬2ã3æ¥éª¤é½æ¯å¨ä¸ºPackageManagerçaddPreferredActivityæ¹æ³è·ååæ°ï¼ä¸»è¦ç设置preferred Activityçæ¹æ³å°±æ¯å æ¸ é¤applicationä¹åçé»è®¤å±æ§ï¼ç¶ååå°è¯¥Application设置为ææ符åIntentFilteræ¡ä»¶çApplicationsä¸çé»è®¤å¼ã
Tips:
å¨æ´ä¸ªæ·»å ç代ç ä¸éè¦å ä¸try-catchä¿æ¤
é£ä¹æ们åæ¥çä¸ä¸addPreferredActivityè¿ä¸ªæ¹æ³ï¼
Filteræ¯è¿æ»¤æ¡ä»¶ï¼ä¹å°±æ¯Applicationä¸æ»¡è¶³filterçåæ°é ç½®çActivityæä¼è¢«æä½ï¼
Match æ¯è¿æ»¤æ¡ä»¶filterä¸è¢«æä½çApplicationçå¹é 度å¼
Set ä½ç¨æ¯è¢«æä½çApplicationä¼å¨setéåä¸çè¿äºApplicationä¸æææ
Activity å°±æ¯è¢«æä½çApplication
äºè§£äºè¿ä¸ªæ¹æ³ä¹åï¼ä¸ä» æ¯é»è®¤Launcherï¼æ们åæ ·ä¹å¯ä»¥ä»æ»¡è¶³ä¸å®filteræ¡ä»¶çApplicationsä¸éæ©ä¸ä¸ªï¼è®¾ç½®æ
-
ä¿®æ¹Wifi便æºå¼çç¹çé»è®¤SSIDå称
frameworks/base/wifi/java/android/net/wifi/WifiApConfigStore.javaä¸ç
setDefaultApConfiguration() {
// ⦠â¦
config.SSID = mContext.getString(R.string.wifi_tether_configure_ssid_default);
// ⦠â¦
}
两ç§æ¹æ³:
- æ·»å Stringï¼æ¿æ¢èµæº
- æ·»å âro.settings.wifi.ssid âå±æ§ï¼æ¿æ¢ä¸º
config.SSID = SystemProperties.get(âro.settings.wifi.ssidâ,
mContext.getString(R.string.wifi_tether_configure_ssid_default));
- ä¿®æ¹Wifi Direct çé»è®¤åå
- ä¿®æ¹âro.settings.wifi_p2p_name = Default Nameâ å¦æ没æ该å±æ§ï¼åè¦çï¼
- frameworks/base/packages/settingsprovider/src/com/android/providers/settings/
DatabaseHelper.javaä¸æ·»å ï¼
loadGlobalSettings(SQLiteDatabase db) {
// ⦠â¦
loadSetting(stmt,Settings.Global.WIFI_P2P_DEVICE_NAME,
SystemProperties.get(âro.settings.wifi_p2p_nameâ,""));
// ⦠â¦
}
- æéä¿®æ¹frameworks/base/wifi/java/android/net/wifi/p2p/ WifiP2pService.javaä¸
getPersistedDeviceName() {
String deviceName = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.WIFI_P2P_DEVICE_NAME);
// ⦠â¦
if (deviceName == null) {
// æéä¿®æ¹æ¤å¤çè¿åå¼
}
// ⦠â¦
}
ä¸è¬æ åµä¸æ£å¸¸ä¿®æ¹ï¼ç¬¬1第2æ¥å°±è¡äºï¼æ¯è¾è§èï¼å¦æåæ·»å ä¸ç¬¬3æ¥çä¿®æ¹ï¼æ´å ä¿é©ï¼é»è¾ç´§å¯ï¼æ æå¯å»ï¼å¦æåªå¨ç¬¬3æ¥çgetPersistedDeviceName() ä¸å»æä½ï¼è½ç¶ä¹è½è¾¾å°ç®çï¼ä½æ¯ä¸ä¸¥è°¨ã
-
ä¿®æ¹WIFIçç¹ä¸é»è®¤ç½ç»SSIDå称AndroidAP
请修æ¹frameworks/base/core/res/res/values/Strings.xmlæ件ä¸çå¦ä¸é»è®¤å符ï¼
AndroidAP
ä¿®æ¹ä¸ºéè¦çå符串ï¼
-
ä¿®æ¹å£°é³ï¼æ¥çµãçä¿¡ãéç¥ãé³ä¹ãéè¯ãèçãFMçï¼çé»è®¤å¤§å°
ä¿®æ¹frameworks/base/media/java/android/media/ AudioManager.javaä¸ç
public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
5, // STREAM_VOICE_CALL
7, // STREAM_SYSTEM
7, // STREAM_RING
15, // STREAM_MUSIC
6, // STREAM_ALARM
5, // STREAM_NOTIFICATION
7, // STREAM_BLUETOOTH_SCO
7, // STREAM_SYSTEM_ENFORCED
11, // STREAM_DTMF
11, // STREAM_TTS
11 //STREAM_FM
};
Tipï¼
å¨AudioService.javaä¸è®¾ç½®äºå个é³æºçæ大å¼ã
-
ä¿®æ¹éå±æ示é³å¤§å°
请修æ¹framework/base/core/res/res/values/config.xml ä¸å¯è®¾ç½®éå±é»è®¤é³é
-6
å¯ä¿®æ¹ä¸º-6ï½0ä¹é´ï¼é»è®¤å¼ä¸º-6,0为æ大é³éï¼éè¿ä¿®æ¹æ¤å¼å¯ä»¥è¾¾å°è°èéå±é³éç®çã
Tipï¼
è¦æ³¨æKeyguardä¸æ¯å¦ç¨äºæ¤å¼ï¼å¦æ没æç¨æ¤å¼çè¯ï¼å°±éè¦ä¿®æ¹é³æºæ件çé³éã
-
ä¿®æ¹ç¶ææ éæ
å¨Android Kitkatä¹åGoogleå å ¥äºåççç¶ææ éæçææãä½æ¯è¿ä¸ææå¨SystemUIä¸ï¼æä¸ä¸ªpropertyéå¶ä½¿å ¶åªè½å¨å¤§å å设å¤ä¸æç¨ãè¦ä¿®æ¹ç¶ææ éæï¼éè¦ä¿®æ¹SystemUIåAppã
1.ä¿®æ¹frameworks/base/packages/systemui/src/com/android/systemui/statusbar/phone/ BarTransitions.java::{
public static final boolean HIGH_END = ActivityManager.isHighEndGfx() || true;
}
强å¶HIGH_END为trueï¼æè½ä½¿ç¨éæææï¼å¦æåºç¨è¦æ±Statuséæçè¯ï¼ï¼å¯å®ç°Googleé»è®¤çéæææï¼æä»ä¸å°ä¸çç°è²é´å½±æ¸åææï¼ã
2.å¦ææ客æ·è¦æ±ç¶ææ å®å ¨éæï¼å继ç»ä¿®æ¹
frameworks/base/packages/systemui/src/com/android/systemui/statusbar/phone/ BarTransitions.java:: BarBackgroundDrawable->draw(Canvas canvas){
if (mGradientAlpha > 0 && false ) {
mGradient.setAlpha(mGradientAlpha);
mGradient.draw(canvas);
}
}
åæ¶ç¶ææ çæ¸åææã
- Launcherä¿®æ¹ï¼
æ³ä¸ï¼
1.å¦æå¸æç»´æActionBarçåå¨ï¼é£ä¹éè¦Style.xmlä¸å®ä¹Theme继æ¿ä¸è¬ç主é¢å¹¶å å ¥ä¸é¢ä¸¤ä¸ªå±æ§ï¼
2.AndroidManifest.xmlä¸å¯¹Activity设置Themeèç¹
android:theme="@style/ TransparentTheme "
æ³äºï¼
packages/apps/launcher2/src/com/android/launcher2/ Launcher.java->onCreate() {
// å¤æçæ¬å·ï¼é²æ¢åºé(å¨apkå¼åä¸å¾æå¿ è¦è¿æ ·å¤æä¸ä¸)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
// å¦ææåºé¨èæ导èªæ ï¼ä¹è®¾ç½®ä¸ºéæ
window.setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
æ³ä¸ï¼
Style.xmlä¸èªå®ä¹ä¸»é¢ï¼å¹¶è®¾ç½®ç¶ç±»ä¸º
Theme.Holo.Light.NoActionBar.TranslucentDecor
Theme.Holo.NoActionBar.TranslucentDecor
è¿ä¸¤ç§ä¸»é¢é½è½å®ç°appå ¨å±çææï¼åææ¯Deviceæ¯æç¶ææ éæã
Tipï¼
对äºå ¶ä»apkï¼å¦æè¦å¨åºç¨ä¸è®¾ç½®ç¶ææ éæï¼ä»¥è¾¾å°æè°çæ²æµ¸å¼ç¶ææ ï¼é£ä¹æ¨èçæ¹æ³æ¯å¨Java代ç ä¸å»åã
å¦æ设置äºStatusBaréææ¶ï¼Appçå 容ä¼è¢«ä¸æå°ä»StatusBarå¼å§ï¼è¿æ¶åéè¦å¨Layout(XML)ä¸ææå¤è¾¹é£ä¸å±çå¸å±å ä¸ä¸ä¸ªå±æ§android:fitsSystemWindows="true"å¨çé¢çæ ¹å±å å ¥äºè¿ä¸ªå±æ§ï¼appçå 容就å¯ä»¥ä»ActionBarçä¸æ¹å¼å§å±ç°äºã
-
ä¿®æ¹å ³æºæ¶çæ¯å¨æ¶é¿
ä¿®æ¹frameworks/base/services/java/com/android/server/power/ ShutdownThread.javaä¸ç
// length of vibration before shutting down
private static final int SHUTDOWN_VIBRATE_MS = 500; // Android åçé»è®¤500毫ç§
-
ä¿®æ¹Launcherçåºç¨èåçèæ¯
ä¿®æ¹GoogleåçLauncher2çapp listçéæ度ï¼åªéè¦ä¿®æ¹
packages/apps/launcher2/res/layout/ Apps_customize_pane.xmlä¸ç
android:background="#00000000â
-
ä¿®æ¹Launcheråºç¨èåèæ¯éæ
请修æ¹Launcher.java ä¸çæ¹æ³
void updateWallpaperVisibility(boolean visible) {
visible = true; // always show wallpaper
// ⦠â¦
}
æè å¨ææè°ç¨updateWallpaperVisibility(boolean)æ¹æ³çå°æ¹ï¼ä¼ åæ°é½ä¸ºtrue
-
é»è®¤å ³éGPSï¼æ¯è¾ççµï¼
å¨åQualcomm MSM8610å¹³å°é¡¹ç®æ¶æè¿ä¸ªéæ±.ä¿®æ¹æ¤é¡¹çåææ¯å¨é¦æ¬¡å¼æºæ¶ï¼æ²¡æå¼æºå导ï¼å¦ææçè¯ï¼ä¸ä¿è¯è½ä¿®æ¹æåï¼é常ä¼æ示æå¼GPS以æä¾ç»Googleæ´ç²¾åçå®ä½ä»¥æä¾æ´å¥½çæå¡ï¼å·´æå·´æâ¦.
åªéè¦å¨deviceä¸è¦çå±æ§ï¼
frameworks/base/packages/SettingsProvider/res/values/defaults.xmlä¸çèç¹ï¼
gps
å°gpså»æå°±è¡ï¼
Tipï¼
ä¸è¬æ @null | gps | gps,network è¿ä¸ç§æ åµ
-
ä¿®æ¹æªå±ä¿åä½ç½®ãæªå±å£°é³ãå¾ççå½å
Android 4.4ä¸ï¼å ³äºæªå±çå建ä¸ä¿åçé»è¾æ¯å¨SystemUIä¸çï¼æºç è·¯å¾å¨frameworks/base/packages/systemui/src/com/android/systemui/screenshot/ ä¸ã
ä¿®æ¹æªå±å£°é³ï¼
frameworks/base/packages/systemui/src/com/android/systemui/screenshot/GlobalScreenshot.java
请修æ¹æé å½æ°ä¸ç
// Setup the Camera shutter sound
mCameraSound = new MediaActionSound();
mCameraSound.load(MediaActionSound.SHUTTER_CLICK);
ä¸è¦ç´æ¥ä¿®æ¹frameworks/base/media/java/android/media/MediaActionSound.java
ä¿®æ¹æªå±ä¿åè·¯å¾ä¸å½åï¼
frameworks/base/packages/systemui/src/com/android/systemui/screenshot/GlobalScreenshot.javaï¼ï¼SaveImageInBackgroundTask
请修æ¹æé å½æ°ä¸çä¸é¢ä»£ç ï¼
// Prepare all the output metadata
mImageTime = System.currentTimeMillis();
String imageDate = new SimpleDateFormat(âyyyy-MM-dd-HH-mm-ssâ)
.format(new Date(mImageTime));
mImageFileName = String.format(SCREENSHOT_FILE_NAME_TEMPLATE, imageDate);
mScreenshotDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES),SCREENSHOTS_DIR_NAME); mImageFilePath = new File(mScreenshotDir, mImageFileName).getAbsolutePath();
-
ä¿®æ¹åä½å¤§å°é»è®¤ä¸ºæ大
请修æ¹
frameworks/base/core/java/android/content/res/Configuration.java:: setToDefaults() {
//fontScale = 1;
fontScale = 1.05;
}
éè¦æ£æ¥è®¾ç½®âæ¾ç¤ºâåä½å¤§å° ä¸ç valueâarrayï¼
<string-array name="entryvalues_font_size" translatable="false">
<item>0.85</item>
<item>1.0</item>
<item>1.05</item>
<item>1.10</item>
ä¸è®¾ç½®âæ¾ç¤ºâåä½å¤§å°âæ大 对åºçæ¾å¤§åæ°ä¿æä¸è´ã
Tipï¼
è¦æ´ä½ä¿®æ¹åä½å¤§å°åéè¦èèä¸æ¹é¢çä¸è´ï¼
- entryvalues_font_size arrayä¸çæ°ç»è¦æåºï¼ä»å°å°å¤§ï¼
- com.android.settings.accessibility.AccessibilitySettings.javaä¸çLARGE_FONT_SCALEè¦åarrayä¸çæ大å¼ä¸è´(è¾ å©åè½â大å·åä½)
- Configuration.javaä¸çfontScaleè¦åæ°ç»ç第äºä¸ªå¼ä¸è´ï¼å³âæ®éâçå¼ä¸è´
-
设置ä¸é»è®¤æå¼æªç¥æ¥æº
请修æ¹frameworks/base/packages/SettingsProvider/res/values/defaults.xml
true
æ两ç§æ¹æ³ï¼
- ç´æ¥å¨device/project/overlay该å±æ§èç¹
- ä¸overlayï¼ç´æ¥å¨é¡¹ç®ä¸æ·»å propertyå±æ§ï¼å¨ä»£ç ä¸æ¥æ§å¶
å¨.mkä¸æ·»å ADDITIONAL_BUILD_PROPERTIE += ro.settings.install.nomarket = 1
å¨frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.javaä¸
loadBooleanSetting(stmt,Settings.Global.INSTALL_NON_MARKET_APPS,
R.bool.def_install_non_market_apps);
ä¿®æ¹ä¸º
int nomarket
= SystemProperties.getInt(âro.settings.install.nomarketâ,
mContext.getResources().getBoolean(R.bool.def_install_non_market_apps) ? 1 : 0); loadSetting(stmt, Settings.Global.INSTALL_NON_MARKET_APPS,nomarket);
æ¹æ³äºç好å¤æ¯ï¼åå·®åæ¶ä¸ç¨æ¯æ¬¡é½å»overlayï¼èæ¯ç¨è¿propertyæ§å¶ï¼è¿æ ·æ¯è¾çèµæºï¼æ¨è第äºç§æ¹æ³ã
-
é»è®¤ä½¿ç¨24å°æ¶å¶
请å¨frameworks/base/packages/SettingsProvider/res/values/defaults.xmlä¸æ·»å èç¹
12
请添å DatabaseHelper.java:: loadSystemSettings(SQLiteDatabase db){
// ⦠â¦
loadSetting(stmt, Settings.System.TIME_12_24,
mContext.getResources().getString(R.string.def_hour_format));
// ⦠â¦
}
-
ä¿®æ¹é»è®¤èçå称
请修æ¹external/Bluetooth/bluedroid/btif/src/btit_dm.c::
static char btif_default_local_name[DEFAULT_LOCAL_NAME_MAX+1] = {â/0â};
ä¿®æ¹ä¸º
static char btif_default_local_name[DEFAULT_LOCAL_NAME_MAX+1] = {âLaboo T2â};
-
Launcher让åºç¨ç¨åºå表èæ¯éææåéæ
请修æ¹packages/apps/Launcher2/res/layout/apps_customize_pane.xml
1.<com.android.launcher2.AppsCustomizeTabHost/> çandroid:background为
android:background="@android:color/transparent"
2.id为android:id="@+id/animation_bufferâç
FrameLayoutèç¹ä¸android:background="@android:color/transparent"
-
packages/apps/Launcher2/src/com/android/launcher2/Launcher.javaä¸
updateWallpaperVisibility(boolean visible) {
visible = true;
// ⦠â¦
}
å¦æ以ä¸è®¾ç½®ä¸æåï¼æè ææä¸å¥½ï¼è¿è¦ç»§ç»check
setWorkspaceBackground(boolean workspace);æ¹æ³æ¯å¦æå½±åï¼å¦ææçè¯ï¼å¯ä»¥ç´æ¥å¨æ¤å¤ä¿®æ¹
mLauncherView.setBackground(workspace ?
mWorkspaceBackgroundDrawable : null);
为
mLauncherView.setBackgroundColor(android.R.color.transparent);
-
é»è®¤æ¾ç¤ºâå¼åè é项â
请修æ¹packages/apps/Settings/src/com/android/settings/Settings.java
private void updateHeaderList(List
target)
/*final boolean showDev = mDevelopmentPreferences.getBoolean(
DevelopmentSettings.PREF_SHOW,
android.os.Build.TYPE.equals("eng"));*/
ä¿®æ¹ä¸º boolean showDev = true;
-
ä¿®æ¹æ¥åçé»è®¤æéæ¶é´
请修æ¹packages/apps/calendar/res/xml/ General_preferences.xml
android:defaultValue="@string/preferences_default_reminder_default"
-
æé«è¾å ¥æ³ãèææé®çæ¯å¨ææ
1ãé¦å ï¼ç¡®è®¤éå¨å¨æ¯å¦æ¯å¥½çãå¦ï¼
aãå¼æºæ¶åæ没éå¨
bãå个å°ä¾åï¼è°ç¨å¦ä¸ä»£ç
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); vibrator.vibrate(200);// ææºæ¯å¨(200毫ç§)
2ãå¦æå¦ä¸é½æ²¡ææï¼è¯´ææ¯å¨å¨é®é¢ï¼éè¦é©±å¨æ¥ä¸
3ãå¦æå¦ä¸æææï¼é£ä¹å°±å¾å¯è½æ¯è®¾ç½®çéå¨ææ太弱äºï¼å¯ä»¥è·é代ç æ¥ä¸æç»è°ç¨vibrator.vibrate(200)çå°æ¹æ¬å·ä¸çå¼æ¯å¤å°ï¼éå½å 大å³å¯
è¾å ¥æ³é®ççå¼ï¼å ¶ä»ç±»åçä¹æï¼å®ä¹å¨config.xmlä¸ï¼å¯ä»¥çå°æ¯40ï¼å¦ä¸ï¼
<!-- Vibrator pattern for a very short but reliable vibration for soft keyboard tap -->
<integer-array name="config_keyboardTapVibePattern">
<item>40</item>
-
æ¾ç¤ºèææé®
请修æ¹frameworks/base/core/res/res/values/config.xmlæ件ä¸
true //å°è¿ä¸ªå±æ§è®¾ç½®ä¸ºtrue
å¦æå¼ä¸äºæºï¼å°±éè¦å¤æåºå±æ¯å¦æ¯æäºï¼
100%æææçæ¹æ³æ¯ä¿®æ¹
frameworks/base/packages/systemui/src/com/android/systemui/statusbar/phone/ PhoneStatusBar.javaä¸ç
protected PhoneStatusBarView makeStatusBarView();
//boolean showNav = mWindowManagerService.hasNavigationBar();
boolean showNav = true;
Tip:
èææé®ç®åæ们åç项ç®è¿æ²¡æ使ç¨è¿ï¼ä¸é¢ä¸¤ç§æ¹æ³é½æ¯æèªå·±å¨ho9021çmarvell项ç®ä¸äº²æµéè¿çã
PhoneWindowManager.javaä¸:
mHasNavigationBar =
res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
// Allow a system property to override this. Used by the emulator.
// See also hasNavigationBar().
String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
mHasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
mHasNavigationBar = true;
}
-
ä¿®æ¹USBé»è®¤éä¸PTP
请修æ¹device/marvell/common/common.mkä¸
persist.sys.usb.config=rndis,acm,marvell_diag
ä¿®æ¹ä¸º
persist.sys.usb.config=ptp
Tip:
ä¿®æ¹æ¤éæ±ï¼è¯·å¡å¿ ä¸é©±å¨å·¥ç¨å¸æ²éã
-
é»è®¤å ³éæ°æ®è¿æ¥
请æ¥çä¸é¢ä»£ç
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.javaä¸
public class DatabaseHelper extends SQLiteOpenHelper {
// Mobile Data default, based on build
String sim1Default, sim2Default;
sim1Default = âtrueâ;
sim2Default = âfalseâ;
loadSetting(stmt, Settings.Global.MOBILE_DATA,
âtrueâ.equalsIgnoreCase(
SystemProperties.get("ro.com.android.mobiledata",sim1Default))
? 1 : 0);}
loadSetting(stmt, Settings.Global.MOBILE2_DATA,
âtrueâ.equalsIgnoreCase(
SystemProperties.get(âro.com.android.mobiledata2â,sim2Default))
? 1 : 0);
}
æ以éè¦å¨deviceä¸è¦çè¿ä¸¤ä¸ªproperty:
ADDITIONAL_BUILD_PROPERTIES += /
ro.com.android.mobiledata = false /
ro.com.android.mobiledata2 = false /
-
æå ¥è³æºæ¶ç¦æ¢ç¶ææ æ¾ç¤ºå¾æ
请修æ¹
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.javaçupdateHeadSetæ¹æ³ä¸ï¼
ä¿®æ¹åï¼
mService.setIconVisibility(âheadsetâ, visiable);
ä¿®æ¹åï¼
mService.setIconVisibility(âheadsetâ, false);
-
éæ©USB大容éåå¨æ¨¡å¼æ¶ï¼ç´æ¥æè½½tå¡å°PC
第ä¸ãé¦å æ£æ¥SystemUIService.java å¨åå§åæ¶æ¯å¦æ对
com.android.systemui.usb.StorageNotification.class çåå°ã
å¦ææï¼åå»æ;
private final Class<?>[] SERVICES = new Class[] {
com.android.systemui.recent.Recents.class,
com.android.systemui.statusbar.SystemBars.class,
//com.android.systemui.usb.StorageNotification.class,
com.android.systemui.power.PowerUI.class,
com.android.systemui.media.RingtonePlayer.class,
com.android.systemui.settings.SettingsUI.class,
};
StorageNotificationæ§å¶è·³è½¬å°USB大容éåå¨çé¢çNotificationçåéã
第äºãä¿®æ¹UsbDeviceManager.java è¿æ¯UsbManagerç代ç
Usbè¿æ¥ç¶ææ¹åæ¶ä¼çå¬å°/sys/class/android_usb/android0/state ååæç»è°ç¨
UsbDeviceManager:: updateState(String.class)éè¿handleræ´æ°Usbç¶æå°UIã
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE_STATE:
mConnected = (msg.arg1 == 1);
mConfigured = (msg.arg2 == 1);
// å¨æ¤å¤æ·»å é对Mass_storageçæ´æ°
updateMassStorageState(mConnected);
updateUsbNotification();
updateAdbNotification();
// æ·»å å¦ä¸æ¹æ³
private void updateMassStorageState(boolean connected) {
StorageManager storageMgr=
(StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
if (storageMgr == null) {
Log.w(TAG, "Failed to get StorageManager");
return;
}
if(connected && UsbManager.USB_FUNCTION_MASS_STORAGE
.equals(new UsbManager(null, null).getDefaultFunction())) {
if(!storageMgr.isUsbMassStorageEnabled()) {
storageMgr.enableUsbMassStorage();
}
} else if(storageMgr.isUsbMassStorageConnected()){
storageMgr.disableUsbMassStorage();
}
}