360外掛化方案RePlugin學習筆記-外接外掛

weixin_34194087發表於2018-03-01

本文介紹一下RePlugin外接外掛使用方式,使用的是官方demo2中的模擬配置。

步驟一:把需要作為外接外掛的專案打包生成demo1.apk

步驟二:把apk拷貝到宿主專案assets/xxx/下,xxx命名隨意,保持一致即可

這裡是跟官方demo一樣,結構如圖:

7951411-a903f0a015a6fc95.png
宿主專案結構.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值,即可修改外掛別名,外掛版本,版本號自行定義。

官方提示:

7951411-847762baa67964f7.png
關於別名.png
7951411-f8829b37791f52c7.png
關於版本.png

詳細參考 【外掛的資訊】

2.重複步驟一、步驟二

3.宿主跳轉程式碼

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

當然,你依然使用包名進行跳轉也是可以的。

以上僅個人學習記錄,如有疏漏或謬誤,歡迎留言交流!

相關文章