书接这位老哥的文章
他写博客的时候Soul还是用SQLite数据库存数据的,所以他找到数据库文件之后直接能用SQLite的客户端打开,我半年前看的时候根据评论区老哥所说已经换成Object-box数据库了,在objectbox目录下可以找到mdb文件,这个就是新的数据库文件。
要想打开这个文件,需要一些技巧,比SQLite麻烦多了。
整体思路就是先创建一个ObjectBox数据库的示例应用,然后利用反编译APK得到的数据库字段信息手动填到创建的示例应用里面,就能打开导出。
这是2021年年中的方法,如果新的Soul还是用Object-Box数据库的话,方法还是适用的。除非数据库像微信一样加密了,那还得想办法破解密码。
首先创建ObjectBox的示例应用
最好看看那个视频,有了示例应用之后,就要创建Soul的消息实例对象了,这个实例的字段,还有那个default.json里面的ID都是从反编译的APK里面找到的。(根据视频,编译之后自动生成的代码中有个叫MyObjectBox的类,里面包含了字段和字段对应的ID)
然后在反编译出来的代码里面找字段名称和ID
忘了原来怎么找到的了。。。
先反编译,就网上搜APK反编译的文章,很多,我用的是dex-tools和jd-gui。
找着了,自动生成的代码里面,每个实体类会有一个Cursor类,例如object-box官方文档中的NoteCursor。
知道这点之后,在反编译出来的代码里面搜索“Cursor”关键词,就能找到对应的包,我半年前备份的APK里面,这个包在“cn/soulapp/imlib/database/”这个目录下面,我是用Android Studio搜的,用jd-gui或者其它源码查看的软件应该都行。
找到这个包之后,里面会有要找的“MyObjectBox类”,不过因为编译过了,所以类名不是MyObjectBox,要挨个看看是哪个。
查看和导出
找着那个包之后,就有Soul的实体类的字段名称和ID了,然后对照着object-box官方文档中的示例代码填好,把自己的mdb文件在数据库初始化的时候加载进去,利用object-box官方文档里面提供的查看数据库的办法在浏览器里面打开相应的网址,可以查看和导出成json。
附件
下面是我在官方的初始化类的基础上改的加载自己的数据库文件的代码。
package io.objectbox.example;
import android.content.Context;
import android.util.Log;
import io.objectbox.BoxStore;
import io.objectbox.BoxStoreBuilder;
import io.objectbox.android.AndroidObjectBrowser;
import io.objectbox.exception.FileCorruptException;
public class ObjectBox {
private static BoxStore boxStore;
static void init(Context context) {
BoxStoreBuilder storeBuilder = MyObjectBox.builder()
.initialDbFile(() -> {
Log.i(App.TAG, "使用提供的数据文件");
return context.getAssets().open("data.mdb");
})
.androidContext(context.getApplicationContext());
try {
boxStore = storeBuilder.build();
} catch (FileCorruptException e) { // Demonstrate handling issues caused by devices with a broken file system
Log.w(App.TAG, "File corrupt, trying previous data snapshot...", e);
// Retrying requires ObjectBox 2.7.1+
storeBuilder.usePreviousCommit();
boxStore = storeBuilder.build();
}
if (BuildConfig.DEBUG) {
Log.d(App.TAG, String.format("Using ObjectBox %s (%s)",
BoxStore.getVersion(), BoxStore.getVersionNative()));
// Enable Data Browser on debug builds.
// https://docs.objectbox.io/data-browser
new AndroidObjectBrowser(boxStore).start(context.getApplicationContext());
}
Log.i(App.TAG, "----------------------------------------");
Log.i(App.TAG, "nativeStore" + boxStore.getNativeStore());
for (Class<?> entityClass : boxStore.getAllEntityClasses()) {
Log.i(App.TAG, entityClass.toString());
}
Log.i(App.TAG, "----------------------------------------");
}
public static BoxStore get() {
return boxStore;
}
}
有时间我再试试我的这套有没有过时。