How To Improving Android Boot Time
来源:互联网 发布:网络爬虫采集器 编辑:程序博客网 时间:2024/05/26 09:54
How To Improving Android Boot Time
(2012-07-05 12:09:39)杂谈
来自:
http://wifihack.net/blog/2012/03/how-to-improving-android-boot-time/
Boot Sequence Overview
* bootloader
* kernel
* init
—- loads several daemons and services, including zygote
—- see /init.rc and init..rc* zygote
—- preloads classes
—- starts package manager* service manager
—- start services
提高Android系统启动时间, 这里只说优化Android的启动时间,不包括bootloader和Kernel的。
1. 精简init init.rc 和 init..rc
a. export ANDROID_BOOTLOGO 0 // 去掉启动画面.
b. bootanim // 去掉启动动画服务.
c. 由于设备里面没有蓝牙, wifi,所以去掉驱动了蓝牙,wifi相关的服务.
2. zygote preloads classes
在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件里面,去掉class加载或者资源加载。 在我的s5pv210 A8板子上只提高了3秒,如果你的CPU比较差的话可能提供的更多。
+
3. package manager
如果我们的设备是个平板没有phone,sms功能就可以去掉不用的package包来提供Android启动时间。
修改./build/target/product/AndroidProducts.mk文件中的PRODUCT_PACKAGES来消减多余的package包.
去掉系统默认的Launcher2, 换成我们自己的BootStart.
根据我们的设备修剪如下:
PRODUCT_PACKAGES := \ bouncycastle \ com.android.location.provider \ com.android.location.provider.xml \ core \ core-junit \ dalvikvm \ dexdeps \ dexdump \ dexlist \ dexopt \ dmtracedump \ dvz \ dx \ ext \ libdvm \ libexpat \ libicui18n \ libicuuc \ libjavacore \ libnativehelper \ libsqlite_jni \ libssl \ libz \ hprof-conv \ icu.dat \ jasmin \ jasmin.jar \ libcrypto \ libdex \ CertInstaller \ DrmProvider \ framework-res \ ApplicationsProvider \ DownloadProvider \ MediaProvider \ SettingsProvider \ UserDictionaryProvider \ DefaultContainerService \ bcm31 \ BootStart
修改完后最好把根目录的out目录删掉,然后再整个项目编译一下。
如果编译没有错,继续进行下一步。通过消减package速度只提高了1秒左右。
5. service manager
通过修改./frameworks/base/services/java/com/android/server/SystemService.java消减不必要的service.
根据我的设备我只保留了以下几个服务:
下面的6个服务是必须的:
*Power Manager*
*Activity Manager*
*Package Manager*
*Battery Service*
*Windows Manager*
*Connectivity Service*
下面的服务可以根据你的需求增加或者裁剪:
Entropy Service
Content Manager
System Content Providers
Lights Service
Vibrator Service
Mount Service
USB Observer
AppWidgert Service
DiskStats Service
消减服务的时候最好从服务的后面往前消减,以为各各服务之间有时是有关联的。每消减一两个服务最好编译一下,然后放到板子上跑跑,看看有没有错误信息,能不能正常进入主界面,如果不能就查看logcat日志,修复掉相关的错误信息。大部分错误信息都是空指针null,只要加些判断就可以修复。去掉相关的服务信息提高了1s左右。
更详细的信息参考附件中的boottime.patch
6. 去掉对zip文件的检查
frameworks/base/libs/utils/ZipFileRO.cpp@@ -349,11 +349,14 @@ bool ZipFileRO::parseZipArchive(void) goto bail; }+
7. 还有就是我的uboot默认等待3秒,通过修改uboot里面的CONFIG_BOOTDELAY设置为等待1秒。
具体文件在: ./include/configs/smdkc110n_mtd.h
总结:
1. 在我的s5pc110的板子上从启动时间19s优化到11s左右。
2. Kernel还有一定的优化空间,至少能再提高2秒.
下载:
boottime.patch
Android-bootup-time-linuxcon-2010-08
BootStartAPP
参考:
1. Using Bootchart on Android
http://elinux.org/Using_Bootchart_on_Android
2. Improving Android Boot Time Outline
http://elinux.org/Improving_Android_Boot_Time_Outline
3. Bootchart on Android
http://androidzaurus.seesaa.net/article/111434080.html
4. How to make bootchart for GingerBread
http://blog.csdn.net/magicyu2/article/details/6292440
patch 也贴一份:
diff --git a/build/target/product/core.mk b/build/target/product/core.mkindex 3b5a42c..4d9ed7e 100755--- a/build/target/product/core.mk+++ b/build/target/product/core.mk@@ -76,13 +76,13 @@ PRODUCT_PROPERTY_OVERRIDES := \ DefaultContainerService \ Bugreport+ PRODUCT_PACKAGES := \ bouncycastle \ com.android.location.provider \ com.android.location.provider.xml \ core \ core-junit \- create_test_dmtrace \ dalvikvm \ dexdeps \ dexdump \@@ -92,13 +92,6 @@ PRODUCT_PACKAGES := \ dvz \ dx \ ext \- framework-res \- hprof-conv \- icu.dat \- jasmin \- jasmin.jar \- libcrypto \- libdex \ libdvm \ libexpat \ libicui18n \@@ -108,29 +101,26 @@ PRODUCT_PACKAGES := \ libsqlite_jni \ libssl \ libz \- sqlite-jdbc \- Browser \- Home \- HTMLViewer \+ hprof-conv \+ icu.dat \+ jasmin \+ jasmin.jar \+ libcrypto \+ libdex \+ CertInstaller \+ DrmProvider \+ framework-res \ ApplicationsProvider \+ DownloadProvider \ MediaProvider \ SettingsProvider \ UserDictionaryProvider \- DefaultContainerService+ DefaultContainerService \+ BootStart -#Phone \- libnfc_ndef \- PicoTts \- ContactsProvider \- Contacts \- DownloadProvider \- DownloadProviderUi \- TelephonyProvider \- TtsService \- VpnServices \- PackageInstaller \- Bugreport+ #Launcher2+ #BootStart # host-only dependencies ifeq ($(WITH_HOST_DALVIK),true)diff --git a/build/target/product/full.mk b/build/target/product/full.mkindex c204aad..9736ca3 100755--- a/build/target/product/full.mk+++ b/build/target/product/full.mk@@ -19,7 +19,7 @@ # build of the emulator, but all those aspects can be overridden # in inherited configurations. -PRODUCT_PACKAGES := \+#PRODUCT_PACKAGES := \ OpenWnn \ PinyinIME \ VoiceDialer \@@ -27,6 +27,13 @@ PRODUCT_PACKAGES := \ libWnnJpnDic \ libwnndict +# Disable By: Bian Jiang 2012.2.26+PRODUCT_PACKAGES := \+ OpenWnn \+ libWnnEngDic \+ libwnndict++ # Additional settings used in all AOSP builds PRODUCT_PROPERTY_OVERRIDES := \ keyguard.no_require_sim=true \diff --git a/build/target/product/generic.mk b/build/target/product/generic.mkindex 13970f9..06e358c 100755--- a/build/target/product/generic.mk+++ b/build/target/product/generic.mk@@ -49,7 +49,6 @@ # AccountAndSyncSettings \ Music \- CertInstaller \ PstnPhone \ DeskClock \ AlarmProvider \@@ -67,14 +66,14 @@ CalendarProvider \ SyncProvider \ Updater \- DrmProvider \+ Settings \ -PRODUCT_PACKAGES := \- Camera \+++# Camera \ CameraVideo \ LatinIME \ Launcher2 \- Settings \ SystemUI diff --git a/build_android.sh b/build_android.shindex 5e75d99..3806ada 100755--- a/build_android.sh+++ b/build_android.sh@@ -3,6 +3,9 @@ CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}') CLIENT=$(whoami) +# Enable BootChart By: Bian Jiang 2012.2.23+export INIT_BOOTCHART=true+ ROOT_DIR=$(pwd) KERNEL_DIR=../kernel-tss diff --git a/device/samsung/smdkc110/device.mk b/device/samsung/smdkc110/device.mkindex b35f686..00a437e 100644--- a/device/samsung/smdkc110/device.mk+++ b/device/samsung/smdkc110/device.mk@@ -111,8 +111,9 @@ PRODUCT_PACKAGES += \ libcamera \ libstagefrighthw +# Disable By: Bian Jiang 2012.2.27 # Apps-PRODUCT_PACKAGES += \+#PRODUCT_PACKAGES += \ VoiceDialer \ SpeechRecorder \ LiveWallpapersPicker \@@ -121,10 +122,16 @@ PRODUCT_PACKAGES += \ VisualizationWallpapers \ librs_jni +PRODUCT_PACKAGES += \+ MagicSmokeWallpapers \+ librs_jni++ # These are the hardware-specific features PRODUCT_COPY_FILES += \- frameworks/base/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \- packages/wallpapers/LivePicker/android.software.live_wallpaper.xml:system/etc/permissions/android.software.live_wallpaper.xml+ frameworks/base/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml ++# packages/wallpapers/LivePicker/android.software.live_wallpaper.xml:system/etc/permissions/android.software.live_wallpaper.xml # The OpenGL ES API level that is natively supported by this device. # This is a 16.16 fixed point numberdiff --git a/device/samsung/smdkc110/init.rc b/device/samsung/smdkc110/init.rcindex 73ba7dd..d6de087 100644--- a/device/samsung/smdkc110/init.rc+++ b/device/samsung/smdkc110/init.rc@@ -5,13 +5,13 @@ on init sysclktz 0 -#loglevel 3-loglevel 7+loglevel 3+#loglevel 7 # setup the global environment export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin export LD_LIBRARY_PATH /vendor/lib:/system/lib- export ANDROID_BOOTLOGO 1+ export ANDROID_BOOTLOGO 0 export ANDROID_ROOT /system export ANDROID_ASSETS /system/app export ANDROID_DATA /data@@ -94,13 +94,13 @@ on fs # mount mtd partitions # Mount /system rw first to give the filesystem a chance to save a checkpoint mount yaffs2 mtd@system /system- mount yaffs2 mtd@system /system ro remount+#mount yaffs2 mtd@system /system ro remount mount yaffs2 mtd@userdata /data nosuid nodev mount yaffs2 mtd@cache /cache nosuid nodev on post-fs # once everything is setup, no need to modify /- mount rootfs rootfs / ro remount+#mount rootfs rootfs / ro remount # We chown/chmod /data again so because mount is run as root + defaults chown system system /data@@ -336,11 +336,11 @@ service media /system/bin/mediaserver group system audio camera graphics inet net_bt net_bt_admin net_raw ioprio rt 4 -service bootanim /system/bin/bootanimation- user graphics- group graphics- disabled- oneshot+#service bootanim /system/bin/bootanimation+# user graphics+# group graphics+# disabled+# oneshot service dbus /system/bin/dbus-daemon --system --nofork socket dbus stream 660 bluetooth bluetoothdiff --git a/device/samsung/smdkc110/setup-makefiles.sh b/device/samsung/smdkc110/setup-makefiles.shindex e2b0501..622cf00 100644--- a/device/samsung/smdkc110/setup-makefiles.sh+++ b/device/samsung/smdkc110/setup-makefiles.sh@@ -36,17 +36,23 @@ mkdir -p ../../../vendor/$MANUFACTURER/$DEVICE # This file is generated by device/__MANUFACTURER__/__DEVICE__/setup-makefiles.sh +# Disable By: Bian Jiang 2012.2.26 # Live wallpaper packages-PRODUCT_PACKAGES := \\- LiveWallpapers \\- LiveWallpapersPicker \\- MagicSmokeWallpapers \\- VisualizationWallpapers \\+#PRODUCT_PACKAGES := \+# LiveWallpapers \+# LiveWallpapersPicker \+# MagicSmokeWallpapers \+# VisualizationWallpapers \+# librs_jni++PRODUCT_PACKAGES := \+ MagicSmokeWallpapers \ librs_jni + # Publish that we support the live wallpaper feature.-PRODUCT_COPY_FILES := \\- packages/wallpapers/LivePicker/android.software.live_wallpaper.xml:/system/etc/permissions/android.software.live_wallpaper.xml+#PRODUCT_COPY_FILES := \\+# packages/wallpapers/LivePicker/android.software.live_wallpaper.xml:/system/etc/permissions/android.software.live_wallpaper.xml # Pick up overlay for features that depend on non-open-source files DEVICE_PACKAGE_OVERLAYS := vendor/__MANUFACTURER__/__DEVICE__/overlaydiff --git a/device/samsung/smdkv210/device.mk b/device/samsung/smdkv210/device.mkindex 421f03f..6845533 100644--- a/device/samsung/smdkv210/device.mk+++ b/device/samsung/smdkv210/device.mk@@ -112,7 +112,7 @@ PRODUCT_PACKAGES += \ libstagefrighthw # Apps-PRODUCT_PACKAGES += \+#PRODUCT_PACKAGES += \ VoiceDialer \ SpeechRecorder \ LiveWallpapersPicker \@@ -123,8 +123,9 @@ PRODUCT_PACKAGES += \ # These are the hardware-specific features PRODUCT_COPY_FILES += \- frameworks/base/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \- packages/wallpapers/LivePicker/android.software.live_wallpaper.xml:system/etc/permissions/android.software.live_wallpaper.xml+ frameworks/base/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml+ +# packages/wallpapers/LivePicker/android.software.live_wallpaper.xml:system/etc/permissions/android.software.live_wallpaper.xml # The OpenGL ES API level that is natively supported by this device. # This is a 16.16 fixed point numberdiff --git a/frameworks/base/core/java/android/app/ActivityThread.java b/frameworks/base/core/java/android/app/ActivityThread.javaindex 78df780..8add7a3 100644--- a/frameworks/base/core/java/android/app/ActivityThread.java+++ b/frameworks/base/core/java/android/app/ActivityThread.java@@ -3505,6 +3505,14 @@ public final class ActivityThread { final java.lang.ClassLoader cl = c.getClassLoader(); localProvider = (ContentProvider)cl. loadClass(info.name).newInstance();++ if (localProvider == null) {+ Slog.e(TAG, "LocalProvider Failed to instantiate class " ++ info.name + " from sourceDir " ++ info.applicationInfo.sourceDir);+ return null;+ }+ provider = localProvider.getIContentProvider(); if (provider == null) { Slog.e(TAG, "Failed to instantiate class " +diff --git a/frameworks/base/core/java/android/app/NotificationManager.java b/frameworks/base/core/java/android/app/NotificationManager.javaindex 1fae516..9b37723 100644--- a/frameworks/base/core/java/android/app/NotificationManager.java+++ b/frameworks/base/core/java/android/app/NotificationManager.java@@ -135,6 +135,9 @@ public class NotificationManager { INotificationManager service = getService(); String pkg = mContext.getPackageName();+ if (service == null || pkg == null) {+ return;+ } if (localLOGV) Log.v(TAG, pkg + ": cancel(" + id + ")"); try { service.cancelNotificationWithTa g(pkg, tag, id);@@ -150,6 +153,9 @@ public class NotificationManager { INotificationManager service = getService(); String pkg = mContext.getPackageName();+ if (service == null || pkg == null) {+ return;+ } if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); try { service.cancelAllNotifications(pkg);diff --git a/frameworks/base/core/java/android/content/ContentService.java b/frameworks/base/core/java/android/content/ContentService.javaindex fc2dfc0..de1cdf1 100644--- a/frameworks/base/core/java/android/content/ContentService.java+++ b/frameworks/base/core/java/android/content/ContentService.java@@ -40,7 +40,7 @@ import java.util.List; public final class ContentService extends IContentService.Stub { private static final String TAG = "ContentService"; private Context mContext;- private boolean mFactoryTest;+ private boolean mFactoryTest = false; private final ObserverNode mRootNode = new ObserverNode(""); private SyncManager mSyncManager = null; private final Object mSyncManagerLock = new Object();@@ -457,6 +457,8 @@ public final class ContentService extends IContentService.Stub { } public static IContentService main(Context context, boolean factoryTest) {+ // Add By: Bian Jiang 2012.2.29+ factoryTest = true; ContentService service = new ContentService(context, factoryTest); ServiceManager.addService(ContentResolver.CONTENT_SERVICE_NAME, service); return service;diff --git a/frameworks/base/core/java/android/content/SyncManager.java b/frameworks/base/core/java/android/content/SyncManager.javaindex 26b6ad7..ed2d0af 100644--- a/frameworks/base/core/java/android/content/SyncManager.java+++ b/frameworks/base/core/java/android/content/SyncManager.java@@ -309,6 +309,9 @@ public class SyncManager implements OnAccountsUpdateListener { mSyncStorageEngine = SyncStorageEngine.getSingleton(); mSyncQueue = new SyncQueue(mSyncStorageEngine);+ // Add By: Bian Jiang 2012.2.29+ factoryTest = true;+ mContext = context; HandlerThread syncThread = new HandlerThread("SyncHandlerThread",diff --git a/frameworks/base/core/java/android/view/accessibility/AccessibilityManager.java b/frameworks/base/core/java/android/view/accessibility/AccessibilityManager.javaindex 0186270..ba0c30c 100644--- a/frameworks/base/core/java/android/view/accessibility/AccessibilityManager.java+++ b/frameworks/base/core/java/android/view/accessibility/AccessibilityManager.java@@ -58,7 +58,7 @@ public final class AccessibilityManager { final Handler mHandler; - boolean mIsEnabled;+ boolean mIsEnabled = false; final IAccessibilityManagerCli ent.Stub mClient = new IAccessibilityManagerCli ent.Stub() { public void setEnabled(boolean enabled) {@@ -110,6 +110,10 @@ public final class AccessibilityManager { IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE); mService = IAccessibilityManager.Stub.asInterface(iBinder); try {+ if (mService == null) {+ mIsEnabled = false;+ return;+ } mService.addClient(mClient); } catch (RemoteException re) { Log.e(LOG_TAG, "AccessibilityManagerServ ice is dead", re);diff --git a/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java b/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.javaindex e30687f..d7ff8c0 100644--- a/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java+++ b/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java@@ -904,7 +904,7 @@ public final class InputMethodManager { // Make sure we have a window token for the served view. if (DEBUG) Log.v(TAG, "Starting input: view=" + view);- if (view == null) {+ if (view == null || mService == null) { if (DEBUG) Log.v(TAG, "ABORT input: no served view!"); return; }@@ -1146,6 +1146,9 @@ public final class InputMethodManager { try { final boolean isTextEditor = focusedView != null && focusedView.onCheckIsTextEditor();+ if (mService == null) {+ return;+ } mService.windowGainedFocus(mClient, rootView.getWindowToken(), focusedView != null, isTextEditor, softInputMode, first, windowFlags);diff --git a/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java b/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaindex f0e5517..9072caf 100644--- a/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java+++ b/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java@@ -561,9 +561,14 @@ public class ZygoteInit { registerZygoteSocket(); EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START, SystemClock.uptimeMillis());++ + EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END, SystemClock.uptimeMillis()); diff --git a/frameworks/base/libs/utils/ZipFileRO.cpp b/frameworks/base/libs/utils/ZipFileRO.cppindex 4261196..a5d515b 100644--- a/frameworks/base/libs/utils/ZipFileRO.cpp+++ b/frameworks/base/libs/utils/ZipFileRO.cpp@@ -349,11 +349,14 @@ bool ZipFileRO::parseZipArchive(void) goto bail; } + unsigned int fileNameLen, extraLen, commentLen, hash; diff --git a/frameworks/base/packages/SettingsProvider/res/xml/bookmarks.xml b/frameworks/base/packages/SettingsProvider/res/xml/bookmarks.xmlindex dfaeeaf..b695afe 100644--- a/frameworks/base/packages/SettingsProvider/res/xml/bookmarks.xml+++ b/frameworks/base/packages/SettingsProvider/res/xml/bookmarks.xml@@ -15,6 +15,7 @@ --> +<!-- <bookmark package="com.android.browser" class="com.android.browser.BrowserActivity" @@ -39,12 +40,10 @@ package="com.android.calendar" class="com.android.calendar.LaunchActivity" shortcut="l" />-<!-- <bookmark package="com.google.android.apps.maps" class="com.google.android.maps.MapsActivity" shortcut="m" />---> +--> diff --git a/frameworks/base/services/java/com/android/server/ConnectivityService.java b/frameworks/base/services/java/com/android/server/ConnectivityService.javaindex a663c3a..f51fb32 100644--- a/frameworks/base/services/java/com/android/server/ConnectivityService.java+++ b/frameworks/base/services/java/com/android/server/ConnectivityService.java@@ -66,7 +66,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { "android.telephony.apn-restore"; - private Tethering mTethering;+ private Tethering mTethering = null; private boolean mTetheringConfigValid = false; if (DBG) { mInetLog = new ArrayList(); }@@ -953,6 +954,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { */ private void handleDisconnect(NetworkInfo info) { + if (info == null) {+ return;+ } int prevNetType = info.getType(); mNetTrackers[prevNetType].setTeardownRequested(false);@@ -974,6 +978,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { } Intent intent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);+ if (intent == null) {+ return;+ } intent.putExtra(ConnectivityManager.EXTRA_NETWORK_INFO, info); if (info.isFailover()) { intent.putExtra(ConnectivityManager.EXTRA_IS_FAILOVER, true);@@ -1457,7 +1464,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { } pw.println(); - mTethering.dump(fd, pw, args);+ if (mTethering != null) {+ mTethering.dump(fd, pw, args);+ } if (mInetLog != null) { pw.println();@@ -1599,7 +1608,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { public int tether(String iface) { enforceTetherChangePermi ssion(); - if (isTetheringSupported()) {+ if (isTetheringSupported() && mTethering != null) { return mTethering.tether(iface); } else { return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;@@ -1610,7 +1619,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { public int untether(String iface) { enforceTetherChangePermi ssion(); - if (isTetheringSupported()) {+ if (isTetheringSupported() && mTethering != null) { return mTethering.untether(iface); } else { return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;@@ -1621,7 +1630,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { public int getLastTetherError(String iface) { enforceTetherAccessPermi ssion(); - if (isTetheringSupported()) {+ if (isTetheringSupported() && mTethering != null) { return mTethering.getLastTetherError(iface); } else { return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;@@ -1631,7 +1640,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { // TODO - proper iface API for selection by property, inspection, etc public String[] getTetherableUsbRegexs() { enforceTetherAccessPermi ssion();- if (isTetheringSupported()) {+ if (isTetheringSupported() && mTethering != null) { return mTethering.getTetherableUsbRegexs(); } else { return new String[0];@@ -1640,7 +1649,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { public String[] getTetherableWifiRegexs() { enforceTetherAccessPermi ssion();- if (isTetheringSupported()) {+ if (isTetheringSupported() && mTethering != null) { return mTethering.getTetherableWifiRegexs(); } else { return new String[0];@@ -1651,16 +1660,25 @@ public class ConnectivityService extends IConnectivityManager.Stub { // javadoc from interface public String[] getTetherableIfaces() { enforceTetherAccessPermi ssion();+ if (mTethering == null) {+ return null;+ } return mTethering.getTetherableIfaces(); } public String[] getTetheredIfaces() { enforceTetherAccessPermi ssion();+ if (mTethering == null) {+ return null;+ } return mTethering.getTetheredIfaces(); } public String[] getTetheringErroredIface s() { enforceTetherAccessPermi ssion();+ if (mTethering == null) {+ return null;+ } return mTethering.getErroredIfaces(); } diff --git a/frameworks/base/services/java/com/android/server/NotificationManagerServi ce.java b/frameworks/base/services/java/com/android/server/NotificationManagerServi ce.javaindex e8c1613..bbcef6c 100644--- a/frameworks/base/services/java/com/android/server/NotificationManagerServi ce.java +++ b/frameworks/base/services/java/com/android/server/NotificationManagerService.java @@ -1005,6 +1005,9 @@ public class NotificationManagerService extends INotificationManager.Stub }public void cancelAllNotifications(String pkg) {+ if (pkg == null) {+ return;+ } checkIncomingCall(pkg); // Calling from user space, don't allow the canceling of activelydiff --git a/frameworks/base/services/java/com/android/server/SystemServer.java b/frameworks/base/services/java/com/android/server/SystemServer.javaindex df69b76..8ee2f04 100644--- a/frameworks/base/services/java/com/android/server/SystemServer.java+++ b/frameworks/base/services/java/com/android/server/SystemServer.java@@ -111,6 +111,9 @@ class ServerThread extends Thread { int factoryTest = "".equals(factoryTestStr) ? SystemServer.FACTORY_TEST_OFF : Integer.parseInt(factoryTestStr); + // FACTORY_TEST_LOW_LEVEL By: Bian Jiang+ //factoryTest = SystemServer.FACTORY_TEST_LOW_LEVEL;+ LightsService lights = null; PowerManagerService power = null; BatteryService battery = null;@@ -139,9 +142,12 @@ class ServerThread extends Thread { Slog.i(TAG, "Activity Manager"); context = ActivityManagerService.main(factoryTest); + + AttributeCache.init(context); Slog.i(TAG, "Package Manager");@@ -152,6 +158,7 @@ class ServerThread extends Thread { mContentResolver = context.getContentResolver(); + Slog.i(TAG, "Content Manager"); ContentService.main(context,@@ -182,6 +190,7 @@ class ServerThread extends Thread { // lights service, content providers and the battery service. power.init(context, lights, ActivityManagerService.getDefault(), battery); + Slog.i(TAG, "Window Manager"); wm = WindowManagerService.main(context, power,@@ -198,6 +208,8 @@ class ServerThread extends Thread { ((ActivityManagerService)ServiceManager.getService("activity")) .setWindowManager(wm); + } catch (RuntimeException e) { Slog.e("System", "Failure starting core service", e);@@ -236,6 +249,7 @@ class ServerThread extends Thread { LocationManagerService location = null; if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {+ + try { Slog.i(TAG, "Connectivity Service");@@ -292,6 +309,7 @@ class ServerThread extends Thread { Slog.e(TAG, "Failure starting Connectivity Service", e); } + try { try { Slog.i(TAG, "USB Observer");@@ -404,6 +425,7 @@ class ServerThread extends Thread { Slog.e(TAG, "Failure starting UsbObserver", e); } + try { Slog.i(TAG, "AppWidget Service");@@ -428,12 +451,14 @@ class ServerThread extends Thread { Slog.e(TAG, "Failure starting AppWidget Service", e); } + try { Slog.i(TAG, "DiskStats Service");@@ -453,7 +478,10 @@ class ServerThread extends Thread { // Before things start rolling, be sure we have decided whether // we are in safe mode.- final boolean safeMode = wm.detectSafeMode();+ // Disable By: Bian Jiang 2012.2.29+ final boolean safeMode = false;+ //final boolean safeMode = wm.detectSafeMode();+ if (safeMode) { try { ActivityManagerNative.getDefault().enterSafeMode();@@ -481,7 +509,9 @@ class ServerThread extends Thread { if (statusBar != null) { statusBar.systemReady(); }- wm.systemReady();+ if (wm != null) {+ wm.systemReady();+ } power.systemReady(); try { pm.systemReady();diff --git a/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java b/frameworks/base/services/java/com/android/server/am/ActivityManagerService.javaindex 6db4559..40957a1 100644--- a/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java+++ b/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java@@ -6560,8 +6560,11 @@ public final class ActivityManagerService extends ActivityManagerNative (process.info.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0; final String dropboxTag = isSystemApp ? "system_app_strictmode" : "data_app_strictmode";+ + final DropBoxManager dbox = null; // Exit early if the dropbox isn't configured to accept this report type. if (dbox == null || !dbox.isTagEnabled(dropboxTag)) return;@@ -6768,9 +6771,11 @@ public final class ActivityManagerService extends ActivityManagerNative // otherwise the watchdog may be prevented from resetting the system. final String dropboxTag = processClass(process) + "_" + eventType;+ + final DropBoxManager dbox = null; // Exit early if the dropbox isn't configured to accept this report type. if (dbox == null || !dbox.isTagEnabled(dropboxTag)) return; diff --git a/frameworks/base/services/java/com/android/server/connectivity/Tethering.java b/frameworks/base/services/java/com/android/server/connectivity/Tethering.javaindex a73a4ce..12fda39 100644--- a/frameworks/base/services/java/com/android/server/connectivity/Tethering.java+++ b/frameworks/base/services/java/com/android/server/connectivity/Tethering.java@@ -127,6 +127,9 @@ public class Tethering extends INetworkManagementEventO bserver.Stub { IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); INetworkManagementService service = INetworkManagementServic e.Stub.asInterface(b); try {+ if (service == null) {+ return;+ } service.registerObserver(this); } catch (RemoteException e) { Log.e(TAG, "Error registering observer :" + e);diff --git a/system/core/init/init.c b/system/core/init/init.cindex 75ffb5c..665a1bd 100644--- a/system/core/init/init.c+++ b/system/core/init/init.c@@ -579,6 +579,10 @@ static int set_init_properties_action(int nargs, char **args) if (qemu[0]) import_kernel_cmdline(1);+ + // bootmode set to factory By: Bian Jiang 2012.2.24+ //unsigned char *factory = "factory";+ //memcpy(bootmode, factory, strlen(factory)); if (!strcmp(bootmode,"factory")) property_set("ro.factorytest", "1");@@ -646,6 +650,7 @@ static int bootchart_init_action(int nargs, char **args) } else { NOTICE("bootcharting ignored\n"); }+ return 0; } #endifdiff --git a/vendor/samsung/smdkv210/device-vendor.mk b/vendor/samsung/smdkv210/device-vendor.mkindex b8c26f4..d75cefa 100644--- a/vendor/samsung/smdkv210/device-vendor.mk+++ b/vendor/samsung/smdkv210/device-vendor.mk@@ -15,7 +15,7 @@ # This file is generated by device/samsung/smdkv210/setup-makefiles.sh # Live wallpaper packages-PRODUCT_PACKAGES := \+#PRODUCT_PACKAGES := \ LiveWallpapers \ LiveWallpapersPicker \ MagicSmokeWallpapers \@@ -23,7 +23,7 @@ PRODUCT_PACKAGES := \ librs_jni # Publish that we support the live wallpaper feature.-PRODUCT_COPY_FILES := \+#PRODUCT_COPY_FILES := \ packages/wallpapers/LivePicker/android.software.live_wallpaper.xml:/system/etc/permissions/android.software.live_wallpaper.xml
- How To Improving Android Boot Time
- Improving Android Boot Time
- Improving Android Boot Time
- How to make apache start at boot time
- How to auto start Apache during boot time – Linux
- How to use time...
- Spring Boot How To
- How to know windows last boot time? -如何知道Windows系统上次启动时间?
- Android: How to Unpack, Edit, and Re-Pack Boot Images
- How To Change, Customize & Create Android Boot Animation [Guide]
- How to Dual Boot Multiple ROMs on Your Android Phone
- [转]How to easy split the Android boot image
- How to modify linux time
- How to create more time?
- Android BOOT Time 优化
- Android BOOT Time 优化
- Android BOOT Time 优化
- Android Boot-time Readahead
- windows8开发-判断网络链接状况
- PowerManager
- 编译linux内核3.6.6
- linux网络参数设置
- Activity的添加和打开
- How To Improving Android Boot Time
- wxWidgets加速键(热键)
- Oracle:connect_by_isleaf
- Activity生命周期
- 【vim】将数字加1
- 在二叉树中找出和为某一值的所有路径
- Oracle Linux Sqlplus客户端
- 关于下拉刷新的总结
- PHP中$_SERVER的详细用法