一木记账_APK内置数据-真正意义的免登录可离线使用可在线切换账号

查看 125|回复 14
作者:syx594   
           一木记账-真正意义上的免登录、可离线使用、可在线切换账号

准备工具
一木记账 、MT管理器,这里主要的方法是内置数据库!
教程很简单,主要的方法就是通过数据内置释放,一木记账UI和功能都不错,但是没法保证服务器瘫痪或者作者跑路等等情况,导致这么好的软件首次使用的用户无法使用!!!

第一步,
先用MT管理器过签!
第二步,
下载我准备的的数据库文件“Custom.db”
[color=]第三步,
把“Custom.db”拷贝到 assets 目录下
[color=]第四步,
根据MT管理器特性找到APK入口→Lbin/mt/signature/KillerApplication688
               我测试的是 Lbin/mt/signature/KillerApplication688,可以搜索“Lbin/mt/signature/KillerApplication”

[color=]注意:
KillerApplication688,我的可能是688,你的不一定,新版可以自定义。
[color=]第五步,
找到入口所在的Smali文件,在文件底部粘贴以下代码:
[Java] 纯文本查看 复制代码.method public onCreate()V
    .locals 1
    invoke-super {p0}, Landroid/app/Application;->onCreate()V
    # 调用 copyDatabaseIfNotExists(this)
    invoke-direct {p0, p0}, Lbin/mt/signature/KillerApplication688;->copyDatabaseIfNotExists(Landroid/content/Context;)V
    return-void
.end method
.method private copyDatabaseIfNotExists(Landroid/content/Context;)V
    .locals 9
    .param p1, "context"    # Landroid/content/Context;
    const-string v0, "Custom.db"
    # 获取 context.getFilesDir().getParent()
    invoke-virtual {p1}, Landroid/content/Context;->getFilesDir()Ljava/io/File;
    move-result-object v1
    invoke-virtual {v1}, Ljava/io/File;->getParent()Ljava/lang/String;
    move-result-object v1
    # 构造 DB_PATH = parent + "/databases/"
    const-string v2, "/databases/"
    new-instance v3, Ljava/lang/StringBuilder;
    invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
    invoke-virtual {v3, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v3, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v2
    # 构造 dbFile = new File(DB_PATH + DB_NAME)
    new-instance v3, Ljava/io/File;
    invoke-direct {v3, v2, v0}, Ljava/io/File;->(Ljava/lang/String;Ljava/lang/String;)V
    # 检查文件是否存在
    invoke-virtual {v3}, Ljava/io/File;->exists()Z
    move-result v4
    if-nez v4, :db_exists
    :try_start_1
        # 打开 assets 输入流
        invoke-virtual {p1}, Landroid/content/Context;->getAssets()Landroid/content/res/AssetManager;
        move-result-object v4
        invoke-virtual {v4, v0}, Landroid/content/res/AssetManager;->open(Ljava/lang/String;)Ljava/io/InputStream;
        move-result-object v5
        # 创建目录
        new-instance v6, Ljava/io/File;
        invoke-direct {v6, v2}, Ljava/io/File;->(Ljava/lang/String;)V
        invoke-virtual {v6}, Ljava/io/File;->mkdirs()Z
        # 打开输出流
        new-instance v7, Ljava/io/FileOutputStream;
        invoke-direct {v7, v3}, Ljava/io/FileOutputStream;->(Ljava/io/File;)V
        # 分配缓冲区 byte[1024]
        const/16 v8, 0x400
        new-array v8, v8, [B
    :try_end_1
    .catch Ljava/io/IOException; {:try_start_1 .. :try_end_1} :io_exception
    :copy_loop
        invoke-virtual {v5, v8}, Ljava/io/InputStream;->read([B)I
        move-result v4
        if-lez v4, :copy_end
        const/4 v6, 0x0
        invoke-virtual {v7, v8, v6, v4}, Ljava/io/FileOutputStream;->write([BII)V
        goto :copy_loop
    :copy_end
    invoke-virtual {v7}, Ljava/io/FileOutputStream;->flush()V
    invoke-virtual {v7}, Ljava/io/FileOutputStream;->close()V
    invoke-virtual {v5}, Ljava/io/InputStream;->close()V
    goto :db_exists
    :io_exception
    move-exception v5
    invoke-virtual {v5}, Ljava/io/IOException;->printStackTrace()V
    goto :db_exists
:db_exists
    return-void
.end method
注意入口名称“Lbin/mt/signature/KillerApplication688”

这句话的意思:

# 调用 copyDatabaseIfNotExists(this)
    invoke-direct {p0, p0},
[color=]Lbin/mt/signature/KillerApplication688
;->copyDatabaseIfNotExists(Landroid/content/Context;)V
代码中“Lbin/mt/signature/KillerApplication688;”要根据你的文件名称修改,好多测试反应闪退的,多数是这里没改!

然后签名安装即可!

[color=]备注:
Custom.db文件可以自行导出,这个是为了不方便导出的同学测试使用!

Custom.zip
(20.43 KB, 下载次数: 237)
2025-4-30 16:10 上传
点击文件名下载附件
下载积分: 吾爱币 -1 CB

视频教程:https://wwrx.lanzoum.com/iFS3S2vhnfla


[color=]一木记账备份的数据
格式是:加密的zip压缩文件,不同的账号是没法恢复的,如果需要恢复就需要把另一个账号的备份数据解压出来,然后再压缩成无密码的zip格式文件,即可恢复!
这里通过反编译,给手动备份和自动备份的文件自动增加密码提示:
自动备份格式:6.0.6_auto_解压密码8888888_04301329
反编译后。搜索字符串“_auto_”
[Java] 纯文本查看 复制代码:cond_5e
    new-instance v2, Ljava/lang/StringBuilder;
    invoke-direct {v2}, Ljava/lang/StringBuilder;->()V
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-static {}, Lcom/blankj/utilcode/util/h;->C()Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    const-string v1, "_auto_"
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-static {}, Lcom/wangc/bill/database/action/o0;->e()Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    const-string v1, ".zip"
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v1
替换成:
[Java] 纯文本查看 复制代码 :cond_5e
    new-instance v2, Ljava/lang/StringBuilder;
    invoke-direct {v2}, Ljava/lang/StringBuilder;->()V
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-static {}, Lcom/blankj/utilcode/util/h;->C()Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    const-string v1, "_auto_解压密码"
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-static {}, Lcom/wangc/bill/application/MyApplication;->d()Lcom/wangc/bill/application/MyApplication;
    move-result-object v1
    invoke-virtual {v1}, Lcom/wangc/bill/application/MyApplication;->e()Lcom/wangc/bill/http/entity/User;
    move-result-object v1
    invoke-virtual {v1}, Lcom/wangc/bill/http/entity/User;->getId()I
    move-result v1
    invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    const-string v1, "_"
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-static {}, Lcom/wangc/bill/database/action/o0;->e()Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    const-string v1, ".zip"
    invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v1

手动备份格式:6.0.6_解压密码8888888_0506183416
反编译后。搜索字符串“本地备份”
[Java] 纯文本查看 复制代码.method private y0()V
    .registers 9
    new-instance v0, Ljava/lang/StringBuilder;
    invoke-direct {v0}, Ljava/lang/StringBuilder;->()V
    invoke-static {}, Lcom/blankj/utilcode/util/h;->C()Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
    move-result-wide v1
    const-string v3, "_MMddHHmmss"
    invoke-static {v1, v2, v3}, Lcom/blankj/utilcode/util/p1;->Q0(JLjava/lang/String;)Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v5
    new-instance v0, Lcom/wangc/bill/dialog/BottomEditDialog;
    const-string v6, "请输入备份的文件名"
    const/4 v7, 0x1
    const-string v4, "本地备份"
    move-object v2, v0
    move-object v3, p0
    invoke-direct/range {v2 .. v7}, Lcom/wangc/bill/dialog/BottomEditDialog;->(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
    new-instance v1, Lcom/wangc/bill/activity/setting/BackupActivity$h;
    invoke-direct {v1, p0}, Lcom/wangc/bill/activity/setting/BackupActivity$h;->(Lcom/wangc/bill/activity/setting/BackupActivity;)V
    invoke-virtual {v0, v1}, Lcom/wangc/bill/dialog/BottomEditDialog;->k(Lcom/wangc/bill/dialog/BottomEditDialog$a;)Lcom/wangc/bill/dialog/BottomEditDialog;
    move-result-object v0
    invoke-virtual {v0}, Lcom/wangc/bill/dialog/BottomEditDialog;->o()V
    return-void
.end method
替换成:
[Java] 纯文本查看 复制代码.method private y0()V
    .registers 9
    new-instance v0, Ljava/lang/StringBuilder;
    invoke-direct {v0}, Ljava/lang/StringBuilder;->()V
    invoke-static {}, Lcom/blankj/utilcode/util/h;->C()Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    const-string v1, "_解压密码"
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-static {}, Lcom/wangc/bill/application/MyApplication;->d()Lcom/wangc/bill/application/MyApplication;
    move-result-object v1
    invoke-virtual {v1}, Lcom/wangc/bill/application/MyApplication;->e()Lcom/wangc/bill/http/entity/User;
    move-result-object v1
    invoke-virtual {v1}, Lcom/wangc/bill/http/entity/User;->getId()I
    move-result v1
    invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
    move-result-wide v1
    const-string v3, "_MMddHHmmss"
    invoke-static {v1, v2, v3}, Lcom/blankj/utilcode/util/p1;->Q0(JLjava/lang/String;)Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v5
    new-instance v0, Lcom/wangc/bill/dialog/BottomEditDialog;
    const-string v6, "请输入备份的文件名"
    const/4 v7, 0x1
    const-string v4, "本地备份"
    move-object v2, v0
    move-object v3, p0
    invoke-direct/range {v2 .. v7}, Lcom/wangc/bill/dialog/BottomEditDialog;->(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
    new-instance v1, Lcom/wangc/bill/activity/setting/BackupActivity$h;
    invoke-direct {v1, p0}, Lcom/wangc/bill/activity/setting/BackupActivity$h;->(Lcom/wangc/bill/activity/setting/BackupActivity;)V
    invoke-virtual {v0, v1}, Lcom/wangc/bill/dialog/BottomEditDialog;->k(Lcom/wangc/bill/dialog/BottomEditDialog$a;)Lcom/wangc/bill/dialog/BottomEditDialog;
    move-result-object v0
    invoke-virtual {v0}, Lcom/wangc/bill/dialog/BottomEditDialog;->o()V
    return-void
.end method

根据需求,图片、附件改为到外部存储的根目录“一木记账”文件夹内
搜索字符串“uploadFile”     ---     .class public Lo5/a;

[color=]注意:
记得先手动给他访问外部存储的权限,不然没效果。
找到如下代码(
[color=]反编译后代码格式可能有所不一样
):
[Java] 纯文本查看 复制代码new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;->()V
invoke-static {}, Lcom/wangc/bill/application/MyApplication;->d()Lcom/wangc/bill/application/MyApplication;
move-result-object v1
invoke-virtual {v1}, Landroid/content/Context;->getFilesDir()Ljava/io/File;
move-result-object v1
invoke-virtual {v1}, Ljava/io/File;->getAbsolutePath()Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string v1, "/uploadFile/"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
sput-object v0, Lo5/a;->j:Ljava/lang/String;
替换为:
[Java] 纯文本查看 复制代码new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;->()V
invoke-static {}, Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File;
move-result-object v1
invoke-virtual {v1}, Ljava/io/File;->getAbsolutePath()Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string v1, "/一木记账/uploadFile/"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
sput-object v0, Lo5/a;->j:Ljava/lang/String;

代码, 备份

abendal   

哈哈,终于看到有人和我一样担忧的了。当时我刚安装好之后一打开就要求登陆,不然用不了,然后勉为其难注册登陆使用了,没想到挺好用的,会员价格也能接受,但就跟贴主一样的担心,万一哪天跑路了怎么办?全都白记了,到现在手机里还有这个软件,但没怎么用,转向其他记账软件了
Ssnakes   

我现在用的就是这个软件,功能和界面确实都很好用,是我用过的软件里面体验最好的了,还在他们的群里面,有什么建议或意见都可以提出来,作者会解决,而且98的永久会员确实也能接受,希望作者能一直做下去,不要黄了
Terra   


syx594 发表于 2025-5-4 12:35
等5月假后的,给个视频教程。

好的,谢谢,我找dex文件后搜不到对于的那个lbin后面的那个,所以都不知道代码放哪儿
Terra   

第四步怎么操作的,能详细介绍一下嘛,到这步就卡壳了,谢谢
syx594
OP
  


小白菜V5 发表于 2025-5-10 23:36
大佬,你好,首先非常感谢你提供这么棒的离线使用的方法,可是我想修改这APP里面“附件”的存储位置,这APP ...

有空研究下
左服   

插眼,尝试下
qiuyu2019   

感谢分享,收藏备用
dinghl   

好东西啊这个
longzheng747   

感谢楼主分享
您需要登录后才可以回帖 登录 | 立即注册