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中测试。
了解更多新酷炫设备,敬请关注@爱搞机