美文网首页程序员Android知识Android技术知识
360插件化方案RePlugin学习笔记-外置插件

360插件化方案RePlugin学习笔记-外置插件

作者: 皮卡搜 | 来源:发表于2018-03-01 09:06 被阅读0次

    本文介绍一下RePlugin外置插件使用方式,使用的是官方demo2中的模拟配置。

    步骤一:把需要作为外置插件的项目打包生成demo1.apk

    步骤二:把apk拷贝到宿主项目assets/xxx/下,xxx命名随意,保持一致即可

    这里是跟官方demo一样,结构如图:

    宿主项目结构.png
    步骤三:在触发下载外置插件的地方调用代码
        //判断是否已安装demo1插件,如未安装就下载安装,如已安装跳转页面
        if (RePlugin.isPluginInstalled("com.test.qby.myapplication")) {
                RePlugin.startActivity(this, RePlugin.createIntent("com.test.qby.myapplication", "com.test.qby.myapplication.plugin.PluginActivity"))
        } else {
                Toast.makeText(this@MainActivity, "正在下载插件,请在下载完成后重新尝试!", Toast.LENGTH_SHORT).show()
                val pd = ProgressDialog.show(this@MainActivity, "Installing...", "Please wait...", true, true)
                Thread {
                    downApk()
                    pd.dismiss()
                }.start()
        }
    
        /**
         * 模拟安装或升级(覆盖安装)外置插件
         * 为方便演示,外置插件临时放置到Host的assets/external目录下
         */
        private fun downApk() {
            val demo1Apk = "demo1.apk"
            val demo1apkPath = "external" + File.separator + demo1Apk
    
            // 文件是否已经存在?直接删除重来
            val pluginFilePath = filesDir.absolutePath + File.separator + demo1Apk
            val pluginFile = File(pluginFilePath)
            if (pluginFile.exists()) {
                FileUtils.deleteQuietly(pluginFile)
            }
    
            // 开始复制
            copyAssetsFileToAppFiles(demo1apkPath, demo1Apk)
            var info: PluginInfo? = null
            if (pluginFile.exists()) {
                info = RePlugin.install(pluginFilePath)
            }
    
            runOnUiThread({
                if (info != null) {
                    Toast.makeText(this@MainActivity, "install success!", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(this@MainActivity, "install external plugin failed", Toast.LENGTH_SHORT).show()
                }
            })
        }
    
        /**
         * 从assets目录中复制某文件内容
         * @param  assetFileName assets目录下的Apk源文件路径
         * @param  newFileName 复制到/data/data/package_name/files/目录下文件名
         */
        private fun copyAssetsFileToAppFiles(assetFileName: String, newFileName: String) {
            var ins: InputStream? = null
            var fos: FileOutputStream? = null
            val buffsize = 1024
            try {
                ins = this.assets.open(assetFileName)
                val allLength = ins!!.available()
                fos = this.openFileOutput(newFileName, Context.MODE_PRIVATE)
                var byteCount = 0
                var length = 0
                val buffer = ByteArray(buffsize)
                while (byteCount != -1) {
                    fos!!.write(buffer, 0, byteCount)
                    byteCount = ins!!.read(buffer)
                    length += byteCount
                    //下载进度
                    Log.e("MainActivity","总长度="+ Formatter.formatFileSize(this,allLength.toLong())+"下载进度="+Formatter.formatFileSize(this,length.toLong()))
                }
                fos!!.flush()
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                try {
                    ins!!.close()
                    fos!!.close()
                } catch (e: Exception) {
                    e.printStackTrace()
                }
    
            }
        }
        }
    

    这样就已经完成了外置插件的下载和页面的跳转,实际应用中应当是从服务器下载。

    注意:此时,只能使用插件的包名com.test.qby.myapplication来进行页面跳转。

    RePlugin还提供了另外一种方式来进行跳转:【别名】

    1.在插件清单文件中配置插件别名、插件版本

    <meta-data
                android:name="com.qihoo360.plugin.name"
                android:value="plugin1"/>
    
     <meta-data
                android:name="com.qihoo360.plugin.version.var"
                android:value="100"/>
    

    修改其中的value值,即可修改插件别名,插件版本,版本号自行定义。

    官方提示:

    关于别名.png 关于版本.png

    详细参考 【插件的信息】

    2.重复步骤一、步骤二

    3.宿主跳转代码

    RePlugin.startActivity(this, RePlugin.createIntent("plugin1", "com.test.qby.myapplication.plugin.PluginActivity"))
    

    当然,你依然使用包名进行跳转也是可以的。

    以上仅个人学习记录,如有疏漏或谬误,欢迎留言交流!

    相关文章

      网友评论

        本文标题:360插件化方案RePlugin学习笔记-外置插件

        本文链接:https://www.haomeiwen.com/subject/lorixftx.html