平台
RK3128 + Android 7.1
目标
1.使用Launcher3
2.显示状态栏和导航栏
3.把TvSettings替换为Settings
原图:
最终效果:
1. 模块整理
主要是增删一些编译模块, 如, 删除TvSettings, 加上Settings
device/rockchip/common/tv/tv_base.mk
device/rockchip/rk312x/device.mk
vendor/rockchip/common/apps/apps.mk
删除模块: RKTvLauncher MediaCenter TvProvider TvSettings rkmcapp-armeabi-v7a-debug
增加: Launcher3 RKVideoPlayer RkExplorer
2. Launcher3
Launcher3编译不出来, 检查下这几个OVERLAY
将对应的模块从配置中删除, 或直接注释掉.
./vendor/rockchip/common/apps/RockVRHome/Android.mk:LOCAL_OVERRIDES_PACKAGES := Launcher3 ./vendor/rockchip/common/apps/RKTvLauncher/Android.mk:#LOCAL_OVERRIDES_PACKAGES := Launcher3 ./vendor/rockchip/common/apps/MediaCenter/Android.mk:LOCAL_OVERRIDES_PACKAGES := Launcher3 ./vendor/rockchip/common/apps/itvlauncher/Android.mk:LOCAL_OVERRIDES_PACKAGES := Launcher3 ./vendor/rockchip/common/apps/ChangeLedStatus/Android.mk:LOCAL_OVERRIDES_PACKAGES := Launcher3
Launcher3 启动不了
1.am start -a android.intent.action.MAIN 不出现选择列表
主要原因是系统初始化未完成, 仅能显示android:directBootAware属性的APP, 这个后面再说
2.am start -n com.android.launcher3/.Launcher 崩溃, 且LOG很少
1970-01-01 08:01:06.113 1039-1113/com.android.launcher3 W/WallpaperManager: WallpaperService not running 1970-01-01 08:01:06.121 1039-1113/com.android.launcher3 E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-2 Process: com.android.launcher3, PID: 1039 DeadSystemException: The system died; earlier logs will point to the root cause
3.安装第三方NovaLauncher一样不能正常启动.
2和3是由于缺少壁纸服务导致, 解决方法有两种.
修改frameworks/base/services/java/com/android/server/SystemServer.java
if (!disableNonCoreServices/* && context.getResources().getBoolean( R.bool.config_enableWallpaperService)*/) { traceBeginAndSlog("StartWallpaperManagerService"); mSystemServiceManager.startService(WALLPAPER_SERVICE_CLASS); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); }
修改配置: device/rockchip/common/tv/overlay/frameworks/base/core/res/res/values/config.xml
<bool name="config_enableWallpaperService">true</bool>
无法使用其它桌面: RKTvLauncher优先级设置为2, 高于Launcher3
rk3128_box:/ # dumpsys package com.rockchips.android.leanbacklauncher Activity Resolver Table: Non-Data Actions: android.intent.action.MAIN: cc04bd7 com.rockchips.android.leanbacklauncher/.MainActivity filter 5b7e55d Action: "android.intent.action.MAIN" Category: "android.intent.category.HOME" Category: "android.intent.category.DEFAULT" mPriority=2, mHasPartialTypes=false AutoVerify=false 445fcc4 com.rockchips.android.leanbacklauncher/.DummyActivity filter ce29ea0 Action: "android.intent.action.MAIN" Category: "android.intent.category.LEANBACK_LAUNCHER" AutoVerify=false com.rockchips.android.leanbacklauncher.SETTINGS: 86887ad com.rockchips.android.leanbacklauncher/.settings.HomeScreenSettingsActivity filter a1d2ed2 Action: "com.rockchips.android.leanbacklauncher.SETTINGS" Category: "android.intent.category.DEFAULT" AutoVerify=false aa6aae2 com.rockchips.android.leanbacklauncher/.settings.FullScreenSettingsActivity filter b1d1ba3 Action: "com.rockchips.android.leanbacklauncher.SETTINGS" Category: "android.intent.category.DEFAULT" AutoVerify=false
如上mPriority=2
解决这个问题, 可以删除RkTvLauncher 或提高 Launcher3的优先级.
3. 卡Android动画
原因: 在服务启动完成的后, 执行**startHomeActivityLocked中, 找不到Activity:
ActivityManagerService.java
startHomeActivityLocked -> Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());
PackageManagerService.java
//没有返回对应的Launcher组件. PackageManagerService.resolveIntent
同样的, 和android:directBootAware有关系, 在MID的SDK中, 正常流程下, 这时候会启动设置中的FallbackHome
而在BOX的SDK中, Settings 中FallbackHome被删除了HOME属性, 导致启动后找不到Home…
缺少了
<category android:name="android.intent.category.HOME" />
加上即可
<!-- Triggered when user-selected home app isn't encryption aware --> <activity android:name=".FallbackHome" android:excludeFromRecents="true" android:screenOrientation="nosensor" android:theme="@style/FallbackHome"> <intent-filter android:priority="-1000"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
4. SystemUI
在BOX中, 状态栏和导航栏是不显示的, 修改以下代码让它显示出来:
修改组件,使用PhoneStatusBar: device/rockchip/common/tv/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
<string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.phone.PhoneStatusBar</string>
修改代码关于BOX的判断: frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java old mode 100644 new mode 100755 index da6265d..e8c6d84 --- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java +++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java @@ -87,9 +87,9 @@ public class SystemBars extends SystemUI implements ServiceMonitor.Callbacks { private void createStatusBarFromConfig() { if (DEBUG) Log.d(TAG, "createStatusBarFromConfig"); String clsName = mContext.getString(R.string.config_statusBarComponent); - if ("box".equals(SystemProperties.get("ro.target.product", "tablet"))){ + /*if ("box".equals(SystemProperties.get("ro.target.product", "tablet"))){ clsName = "com.android.systemui.statusbar.tv.TvStatusBar"; - } + }*/ if (clsName == null || clsName.length() == 0) { throw andLog("No status bar component configured", null); }
修改布局高度:device/rockchip/common/tv/overlay/frameworks/base/core/res/res/values/dimens.xml
<resources> <!-- Height of the status bar --> <dimen name="status_bar_height">24dp</dimen> <!-- Height of the bottom navigation / system bar --> <dimen name="navigation_bar_height">48dp</dimen> <!-- Height of the bottom navigation bar in landscape --> <dimen name="navigation_bar_height_landscape">48dp</dimen> <!-- Width of the navigation bar when it is placed vertically on the screen --> <dimen name="navigation_bar_width">42dp</dimen> </resources>
修改显示位置 frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
diff --git a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java index 7dfc835..dd737ce 100755 --- a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2088,7 +2088,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { int longSizeDp = longSize * DisplayMetrics.DENSITY_DEFAULT / density; // Allow the navigation bar to move on non-square small devices (phones). - mNavigationBarCanMove = width != height && shortSizeDp < 600; + mNavigationBarCanMove = false;// width != height && shortSizeDp < 600; mHasNavigationBar = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar); @@ -4524,6 +4524,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private int navigationBarPosition(int displayWidth, int displayHeight, int displayRotation) { + if(true)return NAV_BAR_BOTTOM; if (mNavigationBarCanMove && displayWidth > displayHeight) { if (displayRotation == Surface.ROTATION_270) { return NAV_BAR_LEFT; @@ -8270,6 +8271,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(" mForceClearedSystemUiFlags=0x"); pw.println(Integer.toHexString(mForceClearedSystemUiFlags)); } + pw.print(" mHasNavigationBar="); pw.print(mHasNavigationBar); if (mLastFocusNeedsMenu) { pw.print(prefix); pw.print("mLastFocusNeedsMenu="); pw.println(mLastFocusNeedsMenu);
5. 壁纸
默认使用黑背景图片
device/rockchip/common/tv/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
6. 扩展
1.若不使用Settings的FallbackHome 而 直接使用Launcher3 开机, 需要做以下修改
diff --git a/packages/apps/Launcher3/Android.mk b/packages/apps/Launcher3/Android.mk old mode 100644 new mode 100755 diff --git a/packages/apps/Launcher3/AndroidManifest.xml b/packages/apps/Launcher3/AndroidManifest.xml old mode 100644 new mode 100755 index 6c5990d..7816dfb --- a/packages/apps/Launcher3/AndroidManifest.xml +++ b/packages/apps/Launcher3/AndroidManifest.xml @@ -52,6 +52,7 @@ <application android:backupAgent="com.android.launcher3.LauncherBackupAgent" android:fullBackupOnly="true" + android:directBootAware="true" android:fullBackupContent="@xml/backupscheme" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher_home" diff --git a/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppWidgetHost.java b/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppWidgetHost.java old mode 100644 new mode 100755 index d3e5350..a4c5a3b --- a/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppWidgetHost.java +++ b/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppWidgetHost.java @@ -62,7 +62,7 @@ public class LauncherAppWidgetHost extends AppWidgetHost { // have been established by this point, and we will end up populating the // widgets upon bind anyway. See issue 14255011 for more context. } else { - throw new RuntimeException(e); + //throw new RuntimeException(e); } } } diff --git a/packages/apps/Launcher3/src/com/android/launcher3/QsbContainerView.java b/packages/apps/Launcher3/src/com/android/launcher3/QsbContainerView.java index ffed8fc..39170d9 100755 --- a/packages/apps/Launcher3/src/com/android/launcher3/QsbContainerView.java +++ b/packages/apps/Launcher3/src/com/android/launcher3/QsbContainerView.java @@ -249,7 +249,10 @@ public class QsbContainerView extends FrameLayout { public static AppWidgetProviderInfo getSearchWidgetProvider(Context context) { SearchManager searchManager = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE); - ComponentName searchComponent = searchManager.getGlobalSearchActivity(); + ComponentName searchComponent = null; + try{ + searchComponent = searchManager.getGlobalSearchActivity(); + }catch(Exception ignore){} if (searchComponent == null) return null; String providerPkg = searchComponent.getPackageName();
主要解决
1.AMS找不到Home导致卡动画问题.
2.启动Launcher3后自身崩溃问题, LOG如下:
Launcher3 崩溃
1970-01-01 08:01:05.414 2963-2963/com.android.launcher3 D/AndroidRuntime: Shutting down VM 1970-01-01 08:01:05.417 2963-2963/com.android.launcher3 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.android.launcher3, PID: 2963 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.launcher3/com.android.launcher3.Launcher}: java.lang.RuntimeException: java.lang.IllegalStateException: User 0 must be unlocked for widgets to be available at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802) Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: User 0 must be unlocked for widgets to be available at com.android.launcher3.LauncherAppWidgetHost.startListening(LauncherAppWidgetHost.java:65) at com.android.launcher3.Launcher.onCreate(Launcher.java:417) at android.app.Activity.performCreate(Activity.java:6709) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802) Caused by: java.lang.IllegalStateException: User 0 must be unlocked for widgets to be available at android.os.Parcel.readException(Parcel.java:1692) at android.os.Parcel.readException(Parcel.java:1637) at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.startListening(IAppWidgetService.java:494) at android.appwidget.AppWidgetHost.startListening(AppWidgetHost.java:191) at com.android.launcher3.LauncherAppWidgetHost.startListening(LauncherAppWidgetHost.java:56) at com.android.launcher3.Launcher.onCreate(Launcher.java:417) at android.app.Activity.performCreate(Activity.java:6709) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
frameworks/base/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
"User " + userId + " must be unlocked for widgets to be available");