首页 爱折腾 文章详情
移植Sony的漂浮小工具
igao7-Mr.DoubleX 2013-04-14 13:36

移植Sony的漂浮小工具

 
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" />

如下图所示移植Sony的漂浮小工具

重新编译framework-res.apk

 

第二步:

反编译 android.policy.jar

找到 com\android\internal\policy\impl\PhoneWindowManager.smal

添加下面红色的段落

Code:
.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主题。

移植Sony的漂浮小工具移植Sony的漂浮小工具

 

此方法仅在多数Xperia设备以及Galaxy SL使用CM9、cm10、PA、PACMAN中测试。

 

了解更多新酷炫设备,敬请关注@爱搞机

移植Sony的漂浮小工具

分享到朋友圈 分享到微博
微信扫一扫,将页面分享到朋友圈
推荐使用当前手机浏览器内置分享功能
-->
相关文章