Skip to content

sdk接入

xu.jingyu edited this page May 18, 2020 · 51 revisions

Android接入

1. gradle配置如下:

打开build.gradle配置:

android {  
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}  
dependencies {  
    implementation 'androidx.appcompat:appcompat:1.1.0+' //引入包的版本需在1.1.0以上  
    implementation "androidx.recyclerview:recyclerview:1.1.0+" //引入包的版本需在1.1.0以上  
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'

    // 核心库
    implementation "com.immomo.mlncore:core:1.0.1"
    // view、工具桥接库
    implementation "com.immomo.mls:mln:1.0.1"
    // 代码生成库
    annotationProcessor "com.immomo.mls:processor:1.0.0"
    // 热重载,配合IDEA插件使用
    debugImplementation "com.immomo.luanative:hotreload:1.0.1"
    releaseImplementation "com.immomo.luanative:hotreload_empty:1.0.1"
    // 配合热重载使用
    debugImplementation "com.google.protobuf:protobuf-lite:3.0.1"
}

2.Application中初始化Lua Engine:

新建一个全局类继承Application,并在onCreate中初始化Lua Engine,如下:

MLSEngine.init(application, BuildConfig.DEBUG)
                .setLVConfig(new LVConfigBuilder(application)
                        .setSdcardDir(sdcardDir)  //设置sdcard目录
                        .setRootDir(rootDir)    //设置lua根目录
                        .setImageDir(imageDir)  //设置lua图片根目录
                        .setCacheDir(cacheDir)  //设置lua缓存目录
                        .setGlobalResourceDir(gResDir)    //设置资源文件目录
                        .build())
                .setImageProvider(new GlideImageProvider())//lua加载图片工具,不实现的话,图片无法展示
                .build(true);

注意:

  • 需正确配置LVConfig中各目录地址。

  • ImageProvider需自行定义图片加载类。

    可执行命令:git clone https://github.com/momotech/MLN,参考项目中MLN-Android的GlideImageProvider类实现。

  • 记得在AndroidManifest.xml中注册该Application。

3.AndroidManifest.xml配置文件中申请权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />   

注意:

  • 运行app时,需要在手机端手动开启存储和相机权限。

4.在Activity、Fragment或任意view中显示LuaView:

FrameLayout frameLayout = new FrameLayout(this);
setContentView(frameLayout);
instance = new MLSInstance(this, true, true);
instance.setContainer(frameLayout);
InitData initData = new InitData("file://android_asset/demo.lua"); //MLSBundleUtils.parseFromBundle(bundle);MLSBundleUtils.createBundle(url)
instance.setData(initData);
if (!instance.isValid()) {
   //非法url
}
// instance三个生命周期记得调用:

    @Override
    protected void onResume() {
        super.onResume();
        instance.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        instance.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        instance.onDestroy();
    }

注意:

  • instance三个生命周期记得调用
  • 在InitData初始化中传入lua路径,项目run起来即可展示对应lua界面。
  • 屏幕上会多出一个lua标识,此时我们便可以通过热重载进行更加便捷的开发。

5.如果需要支持热重载,并能够通过wifi连接,则增加以下代码:

// 1. 在MLSEngine初始化中设置QrCaptureAdapter,设置后可看到lua悬浮窗多出一个扫码图标
MLSEngine.init(mApplication, BuildConfig.DEBUG)
         .setQrCaptureAdapter(new MLSQrCaptureAdapter() {
              @Override
              public void startQrCapture(Context context) {
              //跳转扫码页面

              }
          })

// 2. 在二维码扫描结果中,设置热重载方式为wifi连接
if (HotReloadHelper.isIPPortString(result)) {
       HotReloadHelper.setUseWifi(result);
}

6.混淆设置

# 注解和被注解类不混淆
-keepattributes *Annotation*
-keepattributes Exceptions
-keep class com.immomo.mls.annotation.* { *; }

-keep @com.immomo.mls.annotation.LuaClass class * {
    @com.immomo.mls.annotation.LuaBridge <methods>;
}
-keep @com.immomo.mls.wrapper.ConstantClass class * {
    @com.immomo.mls.wrapper.Constant <fields>;
}
-keep,allowobfuscation @interface org.luaj.vm2.utils.LuaApiUsed
-keep @com.immomo.mls.annotation.CreatedByApt class * { *; }
-keep @org.luaj.vm2.utils.LuaApiUsed class *
-keep @org.luaj.vm2.utils.LuaApiUsed class * {
    native <methods>;
    @org.luaj.vm2.utils.LuaApiUsed <methods>;
    @org.luaj.vm2.utils.LuaApiUsed <fields>;
}

iOS接入

接入SDK

  1. pod配置:
pod 'MLN','1.0.0.10.beta'
  1. 环境处理配置
// AppDelegate中设置如下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 可根据需要开启预加载
    [MLNKitEnvironment instancePreload];
    // 设置默认的网络Handler
    [MLNKitEnvironment setDefaultHttpHandler:...];
    // 设置默认的ScrollRefreshHandler
    [MLNKitEnvironment setDefaultScrollRefreshHandler:...];
    // 设置默认的图片加载器
    [MLNKitEnvironment setDefaultImageLoader:...];
    // 设置默认的导航跳转工具
    [MLNKitEnvironment setDefaultNavigatorHandler:...];
}
  1. 创建一个MLN Lua页面
//在工程里新建一个.lua文件,命名为demo.lua。键入如下lua代码
label = Label()
label:setGravity(Gravity.CENTER)
label:text("Hello World!")
window:addView(label)

//然后在启动页中加载demo.lua
NSString *entryfile = @"demo.lua";
MLNKitViewController *kvc = [[MLNKitViewController alloc] initWithEntryFilePath:entryfile];
  1. push页面
[self presentViewController:kvc animated:YES completion:nil];
  1. 运行后设备会显示我们如上加载的lua文件

接入热重载

  1. pod配置:
pod 'MLNDevTool' , '0.1.9'
  1. 创建一个支持的HotReload的MLN Lua页面
// 创建一个Lua页面
MLNHotReloadViewController *vc = [[MLNHotReloadViewController alloc] initWithNavigationBarTransparent:YES]  
  1. push页面
[self presentViewController:vc animated:YES completion:nil];
  1. 申请相机权限
    1)找到info.plist文件右键->Open As->Source Code,添加相机权限

    <key>NSCameraUsageDescription</key>  
    <string>我要使用摄像机</string>
    

    2)选中info.plist文件右键->Open As->Property List,查看相机权限是否添加成功

  2. 运行后设备屏幕上会多出一个lua标识,此时我们便可以通过热重载进行更加便捷的开发

注意:

  • Xcode版本或手机系统版本差异可能运行后出现黑屏现象。解决方案:在AppDelegate.h文件中声明UIWindow @property (strong, nonatomic) UIWindow *window; 即可。
  • 如果遇到无法present页面的情况,请检查是否设置了导航控制器
Clone this wiki locally