Android-查找讯飞输入法的下载资源的路径01

查找讯飞输入法的下载资源的路径(间接证据):

  1. 点击下载之后可以看到sd卡下“./iFlyIME/speech”文件夹下多了如下两个so,删除离线包之后so消失。

    • libAitalk5_v5_rnn.so

    • libAitalk5_res_cnsms_v5_rnn.so

  1. 调试smali文件可以看到:点击开启离线功能时,会先调用SpeechHelper的getAitalkChildType方法,在该方法中回去调用isV5RnnExist方法,之后会调用到getV5RnnSo跟getV5RnnRes方法,而这两个方法分别是获取这两个so的。(调试过程中截 取的数据中有这两个路径)。
SpeechHelper
  1. getAitalkChildType
1
2
3
4
5
6
7
8
public static int getAitalkChildType(Context paramContext)
{
。。。
if (isV5RnnExist()) {///////////////////////////////******1*******////////////////////
return 0;
}
。。。
}
  1. isV5RnnExist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
private static boolean isV5RnnExist()
{
boolean bool2 = false;
removeFilesToHiddenDir();
File[] arrayOfFile1 = getV5RnnSo();//////////*******2******////////////////
File[] arrayOfFile2 = getV5RnnRes();/////////*******3******////////////////
boolean bool1 = bool2;
if (arrayOfFile1 != null)
{
bool1 = bool2;
if (arrayOfFile1.length > 0)
{
bool1 = bool2;
if (arrayOfFile2 != null)
{
bool1 = bool2;
if (arrayOfFile2.length > 0)
{
int i;
String str;
int j;
if (arrayOfFile1.length > arrayOfFile2.length)
{
i = 0;
if (i < arrayOfFile2.length)
{
str = arrayOfFile2[i].getName().substring(DIR_AITALK5_5_RNN_RES_PREFIX.length());
j = 0;
for (;;)
{
if (j < arrayOfFile1.length)
{
if (arrayOfFile1[i].getName().endsWith(str)) {
mRnnVer = str;
}
}
else
{
i += 1;
break;
}
j += 1;
}
}
}
else
{
i = 0;
if (i < arrayOfFile1.length)
{
str = arrayOfFile1[i].getName().substring(DIR_AITALK5_5_RNN_SO_PREFIX.length());
j = 0;
for (;;)
{
if (j < arrayOfFile1.length)
{
if (arrayOfFile2[i].getName().endsWith(str)) {
mRnnVer = str;
}
}
else
{
i += 1;
break;
}
j += 1;
}
}
}
if (Logging.isDebugLogging()) {
Logging.d(TAG, "rnn ver: " + mRnnVer);
}
bool1 = bool2;
if (!TextUtils.isEmpty(mRnnVer)) {
bool1 = true;
}
}
}
}
}
return bool1;
}
  1. getV5RnnSo
1
2
3
4
5
6
7
8
9
10
//DIR_AITALK5_5_RNN_SO_PREFIX = "libAitalk5_v5_rnn"
private static File[] getV5RnnSo()
{
removeFilesToHiddenDir();
File localFile = new File(DIR_AITALK5_5_RNN_ROOT);
if ((localFile.exists()) && (localFile.isDirectory())) {
return localFile.listFiles(new ccf(Pattern.compile(DIR_AITALK5_5_RNN_SO_PREFIX + "(_v)?[0-9]*.so")));
}
return null;
}
  1. getV5RnnRes
1
2
3
4
5
6
7
8
9
10
//DIR_AITALK5_5_RNN_RES_PREFIX = "libAitalk5_res_cnsms_v5_rnn"
private static File[] getV5RnnRes()
{
removeFilesToHiddenDir();
File localFile = new File(DIR_AITALK5_5_RNN_ROOT);
if ((localFile.exists()) && (localFile.isDirectory())) {
return localFile.listFiles(new ccg(Pattern.compile(DIR_AITALK5_5_RNN_RES_PREFIX + "(_v)?[0-9]*.so")));
}
return null;
}
  1. 调试过程截取的常量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
CPU_ARM_V6 = "(v6"
CURRENT_DIR_SPEECH = "/storage/emulated/0/.iFlyIME/speech/"
DIR_AITALK5_2_RES = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms_v2.so"
DIR_AITALK5_2_RES_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms_v2.so"
DIR_AITALK5_2_SO = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_v2.so"
DIR_AITALK5_2_SO_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_v2.so"
DIR_AITALK5_3_RES = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms_v3.so"
DIR_AITALK5_3_RES_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms_v3.so"
DIR_AITALK5_3_SO = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_v3.so"
DIR_AITALK5_3_SO_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_v3.so"
DIR_AITALK5_4_RES = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms_v4.so"
DIR_AITALK5_4_RES_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms_v4.so"
DIR_AITALK5_4_SO = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_v4.so"
DIR_AITALK5_4_SO_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_v4.so"
DIR_AITALK5_5_RNN_PATTERN = "(_v)?[0-9]*.so"
DIR_AITALK5_5_RNN_RES = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms_v5_rnn.so"
DIR_AITALK5_5_RNN_RES_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms_v5_rnn.so"
DIR_AITALK5_5_RNN_RES_PREFIX = "libAitalk5_res_cnsms_v5_rnn"
DIR_AITALK5_5_RNN_ROOT = "/storage/emulated/0/.iFlyIME/speech/"
DIR_AITALK5_5_RNN_ROOT_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/"
DIR_AITALK5_5_RNN_SO = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_v5_rnn.so"
DIR_AITALK5_5_RNN_SO_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_v5_rnn.so"
DIR_AITALK5_5_RNN_SO_PREFIX = "libAitalk5_v5_rnn"
DIR_AITALK6_RES = "/storage/emulated/0/.iFlyIME/speech/libAitalk6_res_cnsms.so"
DIR_AITALK6_RES_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk6_res_cnsms.so"
DIR_AITALK6_SO = "/storage/emulated/0/.iFlyIME/speech/libAitalk6.so"
DIR_AITALK6_SO_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk6.so"
DIR_AITALK_RES = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms.so"
DIR_AITALK_RES_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5_res_cnsms.so"
DIR_AITALK_SO = "/storage/emulated/0/.iFlyIME/speech/libAitalk5.so"
DIR_AITALK_SO_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/libAitalk5.so"
DIR_LIBS_AITALK5_2_SO = "/libs/libAitalk5_v2.so"
DIR_LIBS_AITALK5_3_SO = "/libs/libAitalk5_v3.so"
DIR_LIBS_AITALK5_4_SO = "/libs/libAitalk5_v4.so"
DIR_LIBS_AITALK5_5_RNN_ROOT = "/libs/"
DIR_LIBS_AITALK5_5_RNN_SO = "/libs/libAitalk5_v5_rnn.so"
DIR_LIBS_AITALK6_SO = "/libs/libAitalk6.so"
DIR_LIBS_AITALK_SO = "/libs/libAitalk5.so"
DIR_SPEECH = "/storage/emulated/0/iFlyIME/speech/"
DIR_SPEECH_HIDDEN = "/storage/emulated/0/.iFlyIME/speech/"
FILE_PATH = "FILE_PATH"
MAX_SYNC_CALL_WAIT_TIME = 20000
MIN_RAM_REQUIRE = 50
RAM_REQUIRE_1G = 1000
RAM_REQUIRE_2G = 1700
TAG = "SpeechHelper"
URL_PATH = "URL_PATH"
VER_AITALK_5 = 1003
VER_AITALK_5_2 = 1015
VER_AITALK_5_3 = 1022
VER_AITALK_6 = 1100
mRnnVer = ".so"
  1. 。。。。