Sony新发布的Xperia带有漂浮小工具功能,可以很方便的在不切换应用的情况下使用计算机,笔记本等。今天来教教大家怎么将这个功能移植到其他无Xperia的CM系统。
本文不适合无折腾经验的用户,请自行搭建好 android apk 的反编译环境,作者不对任何意外负责。
第一步:
反编译你当前 ROM 里的 framework-res.apk
在导出目录中找到 res/values/strings.xml 将下面几行插到最后
<string name="permlab_externalTaskSwitcher">Start as an external task switcher</string> <string name="permdesc_externalTaskSwitcher">Allows the application to be an external task switcher replacing the native task switcher</string> <string name="permlab_smallapp">Small application overlay</string> <string name="permdesc_smallapp">Allows running movable small applications on top of other applications.</string>
打开 AndroidManifest.xml
然后添加下面两行代码
<permission android:name="android.permission.SYSTEM_ALERT_WINDOW" android:label="@string/permlab_systemAlertWindow" android:description="@string/permdesc_systemAlertWindow" android:protectionLevel="dangerous" android:permissionGroup="android.permission-group.SYSTEM_TOOLS" />
以及
<permission android:name="com.sony.smallapp.permission.SMALLAPP" android:label="@string/permlab_smallapp" android:description="@string/permdesc_smallapp" android:protectionLevel="dangerous" />
重新编译framework-res.apk
第二步:
反编译 android.policy.jar
找到 com\android\internal\policy\impl\PhoneWindowManager.smal
添加下面红色的段落
.field static final RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH:I = 0x3 .field static final RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW:I = 0x1 .field static final RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS:I = 0x0 .field static final SHOW_PROCESSES_ON_ALT_MENU:Z = false .field static final SHOW_STARTING_ANIMATIONS:Z = true ----------------------添加这行,如果你没有的话 .field static final SMALLAPP_LAYER:I = 0x3 .field public static final SYSTEM_DIALOG_REASON_ASSIST:Ljava/lang/String; = "assist" .field public static final SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS:Ljava/lang/String; = "globalactions" .field public static final SYSTEM_DIALOG_REASON_HOME_KEY:Ljava/lang/String; = "homekey" .field public static final SYSTEM_DIALOG_REASON_KEY:Ljava/lang/String; = "reason" .field public static final SYSTEM_DIALOG_REASON_RECENT_APPS:Ljava/lang/String; = "recentapps"
然后找到如下部分
.method public checkAddPermission(Landroid/view/WindowManager$LayoutParams;)I .locals 4 .parameter "attrs" .prologue const/4 v2, 0x0 .line 1588 iget v1, p1, Landroid/view/WindowManager$LayoutParams;->type:I .line 1590 .local v1, type:I const/16 v3, 0x7d0 if-lt v1, v3, :cond_0 const/16 v3, 0xbb7 if-le v1, v3, :cond_1 .line 1622 :cond_0 :goto_0 return v2 .line 1594 :cond_1 const/4 v0, 0x0 .line 1595 .local v0, permission:Ljava/lang/String; sparse-switch v1, :sswitch_data_0 .line 1614 const-string v0, "android.permission.INTERNAL_SYSTEM_WINDOW" .line 1616 :goto_1 :sswitch_0 if-eqz v0, :cond_0 .line 1617 iget-object v3, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mContext:Landroid/content/Context; invoke-virtual {v3, v0}, Landroid/content/Context;->checkCallingOrSelfPermission(Ljava/lang/String;)I move-result v3 if-eqz v3, :cond_0 .line 1619 const/4 v2, -0x8 goto :goto_0 .line 1611 :sswitch_1 const-string v0, "android.permission.SYSTEM_ALERT_WINDOW" .line 1612 goto :goto_1 .line 1595 nop :sswitch_data_0 .sparse-switch 0x7d2 -> :sswitch_1 0x7d3 -> :sswitch_1 0x7d5 -> :sswitch_0 0x7d6 -> :sswitch_1 0x7d7 -> :sswitch_1 0x7da -> :sswitch_1 0x7db -> :sswitch_0 0x7dd -> :sswitch_0 0x7e7 -> :sswitch_0 .end sparse-switch .end method
将所有 蓝色 标记部分替换为红色 标记部分
.method public checkAddPermission(Landroid/view/WindowManager$LayoutParams;)I .locals 4 .parameter "attrs" .prologue const/4 v2, 0x0 .line 1115 iget v1, p1, Landroid/view/WindowManager$LayoutParams;->type:I .line 1117 .local v1, type:I const/16 v3, 0x7d0 if-lt v1, v3, :cond_0 const/16 v3, 0xbb7 if-le v1, v3, :cond_1 .line 1152 :cond_0 :goto_0 return v2 .line 1121 :cond_1 const/4 v0, 0x0 .line 1122 .local v0, permission:Ljava/lang/String; sparse-switch v1, :sswitch_data_0 .line 1144 const-string v0, "android.permission.INTERNAL_SYSTEM_WINDOW" .line 1146 :goto_1 :sswitch_0 if-eqz v0, :cond_0 .line 1147 iget-object v3, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mContext:Landroid/content/Context; invoke-virtual {v3, v0}, Landroid/content/Context;->checkCallingOrSelfPermission(Ljava/lang/String;)I move-result v3 if-eqz v3, :cond_0 .line 1149 const/4 v2, -0x8 goto :goto_0 .line 1137 :sswitch_1 const-string v0, "android.permission.SYSTEM_ALERT_WINDOW" .line 1138 goto :goto_1 .line 1141 :sswitch_2 const-string v0, "com.sony.smallapp.permission.SMALLAPP" .line 1142 goto :goto_1 .line 1122 :sswitch_data_0 .sparse-switch 0x7d2 -> :sswitch_1 0x7d3 -> :sswitch_1 0x7d5 -> :sswitch_0 0x7d6 -> :sswitch_1 0x7d7 -> :sswitch_1 0x7da -> :sswitch_1 0x7db -> :sswitch_0 0x7dd -> :sswitch_0 0xbb5 -> :sswitch_2 0xbb6 -> :sswitch_2 .end sparse-switch .end method
保存并重新编译 android policy.jar
第三步:
下载1
反编译framework.jar
将整个sony文件夹放入 导出文件夹中smali/com
然后重新编译 framework.jar
第四步:
下载2
添加浮动工具框架到 system/app、system/etc以及system/framewrok
所有文件都被打包好了,也可以使用它们直接加入到你制作的刷机包。
第五步:
你还需要下载一个 Slauncher来启动这些小工具,可以在google play里找到
完成! 你可以在多数基于CM的ROM中享受这些小工具。
截图为Galaxy SL运行CM10 并安装了 xperia主题。
此方法仅在多数Xperia设备以及Galaxy SL使用CM9、cm10、PA、PACMAN中测试。
了解更多新酷炫设备,敬请关注@爱搞机