easyclick 悬浮日志窗口修改为桌面壁纸背景

easyclick 这悬浮日志窗口挺好的,用的是com.yhao.floatwindow,

在github有开源,这里不讨论,因为很久不更新,窗口可以悬浮在顶层。

https://github.com/yhaolpz/FloatWindow

另一款,更新可用

https://github.com/princekin-f/EasyFloat

https://github.com/getActivity/XToast

在制作漂亮窗口的时候,确实需要有一款,感谢作者。

悬浮日志窗口想设置为桌面背景,但无耐其只能使用脚本中res中的固有图片。

说干就干,修复一下,使其可以使用sdcard或其它任意路径图片资源。

解包

apktool d -f ec.apk -o ./ec

先找到相应的smali代码修改处。

分析过程:通过 setLogViewSizeEx 找到文件:

com.gibb.abtest.js.wrapper.UtilsApiWrapper.smali

代码:

public boolean setLogViewSizeEx(String str) {
        checkDestroyException();
        if (str == null) {
            return false;
        }
        try {
            JSONObject jSONObject = new JSONObject(str);
            int optInt = jSONObject.optInt("x");
            int optInt2 = jSONObject.optInt("y");
            int optInt3 = jSONObject.optInt("w");
            int optInt4 = jSONObject.optInt("h");
            int optInt5 = jSONObject.optInt("textSize");
            String optString = jSONObject.optString("backgroundColor");
            String optString2 = jSONObject.optString("title");
            boolean optBoolean = jSONObject.optBoolean("showTitle");
            return o0ooolo01l11010.oo110000oo01101().l0oo000llo(optInt, optInt2, optInt3, optInt4, optInt5, optString, jSONObject.optString("backgroundImg"), optString2, jSONObject.optInt("backgroundAlpha", -1), optBoolean);
        } catch (JSONException unused) {
            return false;
        }
    }

其中 backgroundImg 说明是可以指定图片,

通过 l0oo000llo 找到 读取文件字节byte相关代码处:

l0l0ll0lo.ll000l.o0ooolo01l11010.smali

代码:

public boolean l0oo000llo(final int i, final int i2, final int i3, final int i4, final int i5, final String str, String str2, final String str3, final int i6, final boolean z) {
        llo1l100l llo1l100lVar = this.l1ol1llll010o;
        if (llo1l100lVar == null || llo1l100lVar.ll01ll1o10 == null) {
            return false;
        }
        final byte[] bArr = null;
        if (!TextUtils.isEmpty(str2)) {
            bArr = ll0l000o00l.l0oo000llo(App.getContext()).l1ol1llll010o(str2);
        }
        App.getHandler().post(new Runnable() {
            @Override // java.lang.Runnable
            public final void run() {
                o0ooolo01l11010.this.l0oo000llo(i3, i4, i5, z, str3, str, bArr, i6, i, i2);
            }
        });
        return true;
    }

看了费脑子是吗? 是的,大神打包的时候做了混装,

这里面:

bArr = ll0l000o00l.l0oo000llo(App.getContext()).l1ol1llll010o(str2);

是获取字节码,进去看了下里层的代码,只能读取脚本包的路径。

那就把这里修改掉。

在easyclick内,有一个读取文件为byte[]的类

com.android.dex.util.FileUtils

那就不用麻烦了,直接调用吧

修改smali处,查找

.method public l0oo000llo(IIIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IZ)Z

里面找到如下代码:

if-nez v1, :cond_1
    invoke-static {}, Lcom/gibb/App;->getContext()Landroid/content/Context;
    move-result-object v0
    invoke-static {v0}, Ll0l0ll0lo/ll000l/ll0l000o00l;->l0oo000llo(Landroid/content/Context;)Ll0l0ll0lo/ll000l/ll0l000o00l;
    move-result-object v0
    move-object/from16 v1, p7
    invoke-virtual {v0, v1}, Ll0l0ll0lo/ll000l/ll0l000o00l;->l1ol1llll010o(Ljava/lang/String;)[B
    move-result-object v0
    :cond_1

注释掉原来的代码,加入新的,改后的代码:

if-nez v1, :cond_1
    #invoke-static {}, Lcom/gibb/App;->getContext()Landroid/content/Context;
    #move-result-object v0
    #invoke-static {v0}, Ll0l0ll0lo/ll000l/ll0l000o00l;->l0oo000llo(Landroid/content/Context;)Ll0l0ll0lo/ll000l/ll0l000o00l;
    #move-result-object v0
    #move-object/from16 v1, p7
    #invoke-virtual {v0, v1}, Ll0l0ll0lo/ll000l/ll0l000o00l;->l1ol1llll010o(Ljava/lang/String;)[B
    #move-result-object v0
	move-object/from16 v0, p7
	invoke-static {v0}, Lcom/android/dex/util/FileUtils;->readFile(Ljava/lang/String;)[B
	
	move-result-object v0
    :cond_1

改好了,重打包,然后下面测试

apktool b -f ./ec/ -o ./signapk/ec.apk

签test

signapk ec.apk signed_ec.apk

手机重新安装。

javaDiy.java部分,放在plugin里面,我就不转换js语法了(懒)

public Drawable getWallPaperDrawable(Activity mActivity){
        WallpaperManager wmInstance = WallpaperManager.getInstance(mActivity);
        return wmInstance.getDrawable();
    }
public Bitmap drawableToBitmap(Drawable drawable) {
        //Drawable drawable = context.getResources().getDrawable(drawableRes);
        Canvas canvas = new Canvas();
        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        canvas.setBitmap(bitmap);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        drawable.draw(canvas);
        return bitmap;
    }

然后main.js测试脚本

var javaDiy=new com.plugin.tegong.javaDiy();
 let wallpaper="/storage/emulated/0/wallpaper.png";
 //let test="res/wallpaper.png";
 let wpDrawable = javaDiy.getWallPaperDrawable(ui.getActivity());
 let wpBitmap = javaDiy.drawableToBitmap(wpDrawable);
 let saved = image.saveBitmap(wpBitmap,"png",100,wallpaper);
 image.recycle(wpBitmap);
 logd("saved "+saved);
 var m =  {
    "x":0,
    "y":-60,
    "w":device.getScreenWidth(),
    "h":device.getScreenHeight()+70,
    "textSize":12,
    "textColor":"#ffffff",
    "backgroundColor":"#00FFFFFF",
    "backgroundImg": wallpaper,
    "backgroundAlpha":255,
    "title":"我就是一个日志窗口",
    //"titleBg":"#00404040",
    "showTitle":false
    }
var h =  {
    "show":false,
    "h":1,
    "textSize":12,
    "textColor":"#000000",
    "backgroundColor":"#000000"
    }
clearLog(-1); //清理一波日志
//setLogLevel("off",false);
let result=showLogWindow();
if(result){
    sleep(180);
    setLogViewSizeEx(m);
    setLogFixedViewEx(h);
    //floaty.close("ctrl_LOG_window");
}

桌面壁纸就成为你的日志窗口背景了。

笔记做好了,再见。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注