android動態加載類

摘自 Android中的動態加載機制

>
我主要是想在應用發佈出去之後,根據我後臺的配置讓客戶端動態的加載不同的邏輯代碼,以實現靈活的運營需求

項目需要,主要使用了上述作者的思路之一

開門見山了--


1.實現待會要用的動態代碼部分,項目目錄如下

project img

IDynamic.java

package com.dynamic.interfaces;

public interface IDynamic {
    //隨便寫幾個方法作爲測試用
    void init();
    void printHelloWorld();
    String getString();
    int getInt();

}

Dynamic.java

package com.dynamic.impl;

import com.dynamic.interfaces.IDynamic;

public class Dynamic implements IDynamic {

    @Override
    public void init() {
        // TODO Auto-generated method stub

        System.out.println("Dynamic.class --- init");

    }

    @Override
    public void printHelloWorld() {
        // TODO Auto-generated method stub
        System.out.println("Dynamic.class --- printHelloWorld");
    }

    @Override
    public String getString() {
        // TODO Auto-generated method stub
        System.out.println("Dynamic.class --- getString");
        return "test";
    }

    @Override
    public int getInt() {
        // TODO Auto-generated method stub
        System.out.println("Dynamic.class --- getInt");
        return 888;
    }

}

將IDynamic.java和Dynamic.javaf嗯別打成jar包,如圖 :

這樣就會有了dynamic.jar和dynamic_interface.jar兩個jar包,dynamic_interface.jar是待會在android項目裏調用的接口類,可以這麼理解,在android裏其實調用的是接口方法(其實現我們會將其作爲jar包、dex包或者apk包,我這裏用的是jar包,詳細的可以看博主原文),我們在程序運行時根據自己的業務需求動態的去下載不同jar包去執行,這樣就實現了我上述需求

2.加工下jar包

命令

~/software/android-sdk-macosx/build-tools/22.0.1$ ./dx --dex --output=dynamic_tmp.jar dynamic.jar

這裏解釋下,之所以在這個目錄執行,是因爲要用dx命令,我在自己sdk的這個目錄找到了,所以把dynamic.jar拷貝到這個目錄裏執行,這個根據自己實際dx命令所在目錄即可,這命令的目的是將class轉成dex也就是dalvik能執行的東東,android裏用的只能是dex格式

這裏只是簡單的走一遍流程,再者就是提示下小坑,方便大家快速上手,so 我把dynamic_tmp.jar文件push到了/mnt/sdcard/裏以待android動態加載

3.使用

添加接口jar包,記得add到Library哦


    private IDynamic iDynamic;//還記得這個嗎,之前寫的那個接口類,也就是上面那個jar包裏的類

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (iDynamic != null) {
                    iDynamic.printHelloWorld();//好熟悉吧
                }
            }
        });


        try {
            //動態包文件地址
            String dexPath = "/mnt/sdcard/dynamic_tmp.jar";//手動放的文件,實際上可以動態下載

            //這裏注意下不要寫錯!!!
            //動態包解壓地址
            File dexOutputDir = this.getDir("dex", 0);
            //加載動態
            DexClassLoader dexClassLoader = new DexClassLoader(dexPath, dexOutputDir.getAbsolutePath(), null, getClassLoader());
            Class libProviderClazz = dexClassLoader.loadClass("com.dynamic.impl.Dynamic");
            iDynamic = (IDynamic) libProviderClazz.newInstance();//創建對象了
            if (iDynamic != null) {
                iDynamic.init();//調個方法意思意思
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章