# JSView 小程序本地化

JSViewApp 版本1.3.413.20230831开始支持小程序本地化运行的功能。 如果想无网络时也能运行小程序代码,可以将小程序本地化。
具体步骤如下:

# 本地打包一份小程序代码到 APK 中

  • 在项目根目录的build.gradle文件中添加插件依赖。
buildscript {
    ...
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.3"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

        // 本地化打包插件依赖
        classpath 'com.qcode.jslocalizationplugin:JSLocalizationPlugin:1.0.4'
    }
}

...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • 在 module 的build.gradle中添加 plugin,比如./MyJsViewProject/app/build.gradle
plugins {
    id 'com.android.application'
    // 新增的 plugin
    id 'com.qcode.jslocalizationplugin'
}

...

1
2
3
4
5
6
7
8
  • 运行命令生成代码包
# JS_URL是小程序 js 的地址
sh ./gradlew :app:jsLocalization -PJS_URL=http://localhost:8077/js/main.jsv.5209aedd.mjs -PAPP_NAME=shijiuTv.com/TestDemoCompile
1
2

运行后会在./MyJsViewProject/app/build下生成一个文件夹./MyJsViewProject/app/build/localizationJsAsset/localizationJs,将文件夹localizationJs复制到./MyJsViewProject/app/src/main/asset/下面即可。

  • 打包 Apk 时记得把 core 也打包进去 具体版本号查看 http://localhost:8077/js-info.json(要换成自己实际的地址)
    aar 文件找相关人员获取。
// 打包一份版本为 xxxxx 的 core
implementation(name: "jsview.core-embedded-xxxxx.full", ext: "aar")
1
2

完成以上配置后打包出来的 apk 就自带了一个小程序的代码包。

# Apk运行时获取本地化启动参数

需要 jsview 版本不低于1.3.413.20230831

implementation("com.tvcode.js_view_app:JSViewApp:1.4.448.20231102")
1

获取本地化参数:

/**
 * 获取本地化启动参数。
 * 如果本地没有缓存就会到 asset中去解压。
 */
SyncJSLocalizationUtil.INSTANCE.getParamsFromCache(getApplicationContext(), "shijiuTv.com/TestDemoCompile", new ILocalizationCallback.Stub() {
    /**
     * 成功获取到启动参数
     * @param miniAppParams 启动参数
     */
    @Override
    public void onResult(MiniAppParams miniAppParams) throws RemoteException {
        // 使用loadParams加载小程序
        mMainPageProxy.loadParams(miniAppParams);
    }

    @Override
    public void onJSDownloaded(MiniAppParams miniAppParams) throws RemoteException {
        // 不会回调
    }

    @Override
    public void onJSNothingToUpdate() throws RemoteException {
        // 不会回调
    }

    /**
     * 当出现异常时的回调
     * @param errorCode 错误码:
     *                  {@link com.tvcode.js_view_app.localization.JSLocalizationUtil#ERROR_CODE_CACHE_EMPTY} :本地没有缓存,apk 中也没有 zip 包。
     *                  {@link com.tvcode.js_view_app.localization.JSLocalizationUtil#ERROR_CODE_UNKNOWN} :未知
     * @param msg 异常信息
     */
    @Override
    public void onException(int errorCode, String msg) throws RemoteException {

    }
});
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

getParamsFromCache接口逻辑流程图:

graph TD;
    A[获取本地缓存]--AppName-->B{本地有缓存?};
    B -- Yes -->C[获取本地最高版本];
    C --> END
    B -- No -->C1{Asset有压缩包};
    C1 -- Yes --> C11[解压到本地];
    C1 -- No --> Excep[异常];
    C11 --> C;
    Excep --> END;
1
2
3
4
5
6
7
8
9

# 更新本地化小程序

可以在空闲时去更新下本地的 js 版本。

private void doCheckUpdate(){
    MiniAppParams miniAppParams = new MiniAppParams();
    // 小程序的js地址
    miniAppParams.setUrl("http://192.168.0.27:8077/js/main.jsv.5209aedd.mjs");
    // appName可以不设置
//        miniAppParams.setAppName("shijiuTv.com/TestDemoCompile");

    /**
     * 检查并更新。
     * 当提供的 js 版本比本地缓存的版本要高时会去下载更新本地缓存。
     */
    SyncJSLocalizationUtil.INSTANCE.checkAndUpdateMiniApp(getApplicationContext(), miniAppParams, new ILocalizationCallback.Stub() {
        @Override
        public void onResult(MiniAppParams miniAppParams) throws RemoteException {
            // 不会回调
        }

        /**
         * 本地化更新完成。
         * @param miniAppParams 本地化的启动参数
         */
        @Override
        public void onJSDownloaded(MiniAppParams miniAppParams) throws RemoteException {
            
        }

        /**
         * 本地缓存的版本比提供的 js 版本要高无需更新
         */
        @Override
        public void onJSNothingToUpdate() throws RemoteException {

        }

        /**
         * 当出现异常时的回调
         * @param errorCode 错误码:
         *                  {@link com.tvcode.js_view_app.localization.JSLocalizationUtil#ERROR_CODE_FAIL_APP_NAME} : MiniAppParams 中设置的 appName 与实际的 js 不相符。
         *                  {@link com.tvcode.js_view_app.localization.JSLocalizationUtil#ERROR_CODE_NETWORK_DISCONNECT} : 无网络连接。
         *                  {@link com.tvcode.js_view_app.localization.JSLocalizationUtil#ERROR_CODE_UNKNOWN} :未知
         * @param msg 异常信息
         */
        @Override
        public void onException(int errorCode, String msg) throws RemoteException {

        }
    });
}
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

checkAndUpdateMiniApp接口逻辑流程图:

graph TD;
    START[检查更新本地缓存];
    START --参数:url/appName--> A{有网络?};
    A --No --> Excep[异常];
    A --Yes--> C[读取jsv-info.json,获取版本];
    C --> D{与本地版本对比};
    C --appName不一致--> Excep;
    D --需要更新--> DD[生成cfg文件</br>主要用于记录core版本与主js路径] -->DF[下载engineJs] -->DFF[下载Core] --> F[下载dist.dat解压] --> FF[生成endFlag文件];
    FF --> G[删除dist.dat与本地js版本</br>只保留最新的两个js版本]
    G --> H[获取本地最新的版本]
    D --不需要更新--> END;
    H --> END;
    Excep --> END;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Last Updated: 11/6/2023, 2:16:25 AM