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.cancelNotificationWithTag(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 IAccessibilityManagerClient.Stub mClient = new IAccessibilityManagerClient.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, "AccessibilityManagerService 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 &amp;&amp;                         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 @@ --&gt; +<!--     <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" />---> +--&gt; 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) {         enforceTetherChangePermission()-        if (isTetheringSupported()) {+        if (isTetheringSupported() &amp;&amp; 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) {         enforceTetherChangePermission()-        if (isTetheringSupported()) {+        if (isTetheringSupported() &amp;&amp; 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) {         enforceTetherAccessPermission()-        if (isTetheringSupported()) {+        if (isTetheringSupported() &amp;&amp; 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() {         enforceTetherAccessPermission();-        if (isTetheringSupported()) {+        if (isTetheringSupported() &amp;&amp; mTethering != null) {             return mTethering.getTetherableUsbRegexs();         } else {             return new String[0];@@ -1640,7 +1649,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {      public String[] getTetherableWifiRegexs() {         enforceTetherAccessPermission();-        if (isTetheringSupported()) {+        if (isTetheringSupported() &amp;&amp; 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() {         enforceTetherAccessPermission();+        if (mTethering == null) {+            return null;+        }         return mTethering.getTetherableIfaces();     }      public String[] getTetheredIfaces() {         enforceTetherAccessPermission();+        if (mTethering == null) {+            return null;+        }         return mTethering.getTetheredIfaces();     }      public String[] getTetheringErroredIfaces() {         enforceTetherAccessPermission();+        if (mTethering == null) {+            return null;+        }         return mTethering.getErroredIfaces();     } diff --git a/frameworks/base/services/java/com/android/server/NotificationManagerService.java b/frameworks/base/services/java/com/android/server/NotificationManagerService.javaindex e8c1613..bbcef6c 100644--- a/frameworks/base/services/java/com/android/server/NotificationManagerService.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 &amp; (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 INetworkManagementEventObserver.Stub {         IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);         INetworkManagementService service = INetworkManagementService.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
原创粉丝点击