How To Improving Android Boot Time

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.mk
index 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.mk
index 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.mk
index 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.sh
index 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.mk
index 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 number
diff --git a/device/samsung/smdkc110/init.rc b/device/samsung/smdkc110/init.rc
index 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 bluetooth
diff --git a/device/samsung/smdkc110/setup-makefiles.sh b/device/samsung/smdkc110/setup-makefiles.sh
index 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__/overlay
diff --git a/device/samsung/smdkv210/device.mk b/device/samsung/smdkv210/device.mk
index 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 number
diff --git a/frameworks/base/core/java/android/app/ActivityThread.java b/frameworks/base/core/java/android/app/ActivityThread.java
index 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.java
index 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.java
index 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.java
index 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.java
index 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.java
index 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.java
index 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.cpp
index 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.xml
index 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" />
--->
 
+--&gt;
 
diff --git a/frameworks/base/services/java/com/android/server/ConnectivityService.java b/frameworks/base/services/java/com/android/server/ConnectivityService.java
index 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.java
index 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 actively
diff --git a/frameworks/base/services/java/com/android/server/SystemServer.java b/frameworks/base/services/java/com/android/server/SystemServer.java
index 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.java
index 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.java
index 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.c
index 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;
 }
 #endif
diff --git a/vendor/samsung/smdkv210/device-vendor.mk b/vendor/samsung/smdkv210/device-vendor.mk
index 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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值