Android 使用動態載入架構DL進行外掛程式化開發

來源:互聯網
上載者:User

標籤:

如有轉載,請聲明出處: 時之沙: http://blog.csdn.net/t12x3456    (來自時之沙的csdn部落格)

概述:

        隨著應用的不斷迭代。應用的體積不斷增大,項目越來越臃腫,冗餘添加.項目新功能的加入,無法確定與使用者匹配性,發生嚴重異常往往牽一髮而動全身,僅僅能緊急公布補丁版本號碼。強制使用者進行更新.結果頻繁的更新,反而容易減少使用者使用黏性.或者是公司業務的不斷髮展,同系的應用越來越多,傳統方式須要通過使用者量最大的主專案進行引導下載並安裝.

       怎麼辦?

參考瀏覽器-外掛程式開發模式:

         一. 來能夠將自己的應用分拆。某些功能能夠在外掛程式中實現,用到時再進行下載,並且不用安裝.  假設有新功能的加入,不須要更新應用,僅僅要預留外掛程式管理,我們就能夠通過加入外掛程式的方式。動態更新自己的應用,該功能須要改進或擴充,更新外掛程式就可以,無需頻繁安裝或卸載(容易造成使用者反感).

        二. 相應同系應用,正常的引流方式僅僅能引導使用者進行新應用的下載和安裝,假設使用外掛程式化開發,則無需安裝應用,關閉外掛程式功能也十分方便,省去應用安裝和卸載的過程,能夠實現無縫引流.

    這裡要向大家推薦一個開源的動態載入架構DL, 該項目由singwhatiwanna發起,眼下一共同擁有三個人開發。我有幸成為了當中的contributor.

     假設你對DL動態載入架構還不熟悉。建議先看一下這篇文章:

    APK動態載入架構DL解析 http://blog.csdn.net/singwhatiwanna/article/details/39937639

假設你看過之後還會不太清晰,請看下DL外掛程式化架構的全景,例如以下


這裡我主要向大家介紹一下利用DL架構進行開發的詳細步驟:

1. 首先我們須要從github上擷取項目代碼:

   https://github.com/singwhatiwanna/dynamic-load-apk

   這裡我們能夠看到下載後的檔案夾例如以下

 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdDEyeDM0NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

 

        lib檔案夾就是我們的公用外掛程式庫

        sample檔案夾是相應的demo,  詳細的project能夠參照上面的DL全景中的三種模式:

        由於一般項目中。代碼管理和Team Dev相對獨立,  一般外掛程式project的團隊是非常難接觸主專案團隊的代碼.因此,這裡主要以第一種,也是我們最為推薦的方式進行, 採用外掛程式不依賴宿主的方式進行開發. 不須要兩個團隊過多的互動,開發效率相對較高.


2 匯入libproject,例如以下所看到的:


 


能夠看到bin檔案夾下的dl-lib.jar, 假設我們須要對libproject進行改動。又一次build擷取相應的dl-lib.jar就可以


3. 外掛程式project的開發, 匯入demo中的main-pluginproject

  

    首先還是要強調外掛程式開發的注意事項,以免出現不必要的錯誤

    外掛程式也須要引用DL的jar包。可是不能放入到外掛程式project的libs檔案夾以下,換句話說,就是外掛程式編譯的時候依賴jar包可是打包成apk的時候不要把jar包打進去,這是由於,dl-lib.jar已經在宿主project中存在了,假設外掛程式中也有這個jar包,就會發生類連結錯誤。原因非常easy。記憶體中有兩份一樣的類。反覆了。至於support-v4也是相同的道理。

對於eclipse非常easy。僅僅須要在外掛程式project中建立一個檔案夾。比方external-jars,然後把dl-lib.jar和support-v4.jar放進去。同一時候在.classpath中追加例如以下兩句就可以: 

<classpathentry kind="lib" path="external-jars/dl-lib.jar"/><classpathentry kind="lib" path="external-jars/android-support-v4.jar"/>
   然後是外掛程式開發中的詳細步驟

 (1) 假設原有的為Activity,這裡須要改為繼承DLBasePluginActivity,假設原來為FragmentActivity,那麼須要繼承DLBasePluginFragmentActivity, for example:

  

public class MainActivity extends DLBasePluginActivity 
TestFragmentActivity extends DLBasePluginFragmentActivity

 (2) 假設須要外掛程式獨立安裝執行, 僅僅要將jar放到libs以下就可以,若支援動態載入。仍需按上述注意事項加入 exteral-jars中

 (3)外掛程式所須要許可權須要在宿主project中聲明

       假設是實際開發,一般為從server擷取外掛程式,這裡我們方便自己調試示範,將執行產生相應的外掛程式apk,放入sd卡上的DynamicLoadHost檔案夾中


4. 宿主project中將上述產生的dl-lib.jar加入libs就可以,例如以下所看到的為demo中提供的宿主project

  

  

    在宿主project中,首先我們須要擷取要調用的外掛程式apk相應的MainActivity,DL的demo中外掛程式路徑為 sd卡上的DynamicLoadHost檔案夾,沒有的話須要建立。或者依據自己需求進行改動.


        String pluginFolder = Environment.getExternalStorageDirectory() + "/DynamicLoadHost";        File file = new File(pluginFolder);        File[] plugins = file.listFiles();        if (plugins == null || plugins.length == 0) {            mNoPluginTextView.setVisibility(View.VISIBLE);            return;        }        for (File plugin : plugins) {            PluginItem item = new PluginItem();            item.pluginPath = plugin.getAbsolutePath();            item.packageInfo = DLUtils.getPackageInfo(this, item.pluginPath);            if (item.packageInfo.activities != null && item.packageInfo.activities.length > 0) {                item.launcherActivityName = item.packageInfo.activities[0].name;            }            mPluginItems.add(item);        }

接著是調起響應的apk,這時須要使用dl-lib.jar:

  (1)通過Class.forName的方式擷取我們須要調用的外掛程式apk中MainActivity的class對象

  (2) 就上面提到的,我們須要推斷該對象繼承自DLBasePluginActivity還是DLBasePluginFragmentActivity,得到相應的代理class對象

  (3)使用相應的代理class對象調起外掛程式apk

 PluginItem item = mPluginItems.get(position);        Class<?

> proxyCls = null; try { Class<?

> cls = Class.forName(item.launcherActivityName, false, DLClassLoader.getClassLoader(item.pluginPath, getApplicationContext(), getClassLoader())); if (cls.asSubclass(DLBasePluginActivity.class) != null) { proxyCls = DLProxyActivity.class; } } catch (ClassNotFoundException e) { e.printStackTrace(); Toast.makeText(this, "load plugin apk failed, load class " + item.launcherActivityName + " failed.", Toast.LENGTH_SHORT).show(); } catch (ClassCastException e) { // ignored } finally { if (proxyCls == null) { proxyCls = DLProxyFragmentActivity.class; } Intent intent = new Intent(this, proxyCls); intent.putExtra(DLConstants.EXTRA_DEX_PATH, mPluginItems.get(position).pluginPath); startActivity(intent); }


       最後執行宿主projectmain-host,就能夠看到終於的效果:

    



       相信大家經過如上步驟,能夠對DL動態載入架構進行開發有了一定瞭解.眼下DL架構仍在不斷擴充中。歡迎對我們的項目進行star,fork。或者提出寶貴的建議.,如有問題請及時反饋,我們會在興許版本號碼中進行修複或者改進:

    https://github.com/singwhatiwanna/dynamic-load-apk


Android 使用動態載入架構DL進行外掛程式化開發

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.