當前位置:首頁 » 安卓系統 » android插件式

android插件式

發布時間: 2022-06-27 06:02:38

⑴ android插件化原理要多久

插件化技術發展到現在其實已經很成熟了,但是相應的問題,如果沒有真正地去實踐過,根本不了解其中有多少問題,會牽涉到多少技術細節,多少被外人膜拜的外表光鮮的技術大牛都被『插件化』這三個字折磨地死去活來,這對於 Android 整個生態的損害也讓人無法忽視。
我們首先要想一下,我們做插件化的目的是什麼?
為了滿足產品隨時上線的需求?
為了修復因為我們對自己要求不嚴格而寫出來的 bug ?
為了向人炫耀自己的技術實力?
很抱歉,如果是為了這些目的,那就真的太對不起自己是『開發者』這個如此高逼格的身份了。
做插件化真正的目的:是為了去適應並行開發,是為了解耦各個模塊,是為了避免模塊之間的交叉依賴,是為了加快編譯速度,從而提高並行開發效率。
明確了這些,我們再來看插件化的結果,每個模塊都支持獨立運行測試,分為穩定的 release 版本和不穩定的 snapshot 版本,每個模塊都高度解耦,沒有交叉依賴,不會出現一個模塊依賴了另一個模塊,其中一個人改了這個模塊的代碼,對另一個模塊造成影響。
按照這個思路,我們再來看看一些其他的細節:
在 Android 里有一個比較爽的一點是,作為 library 的時候,aar 里的引用依賴,在宿主 Application 里也有同樣的引用依賴,並不會打包兩份到宿主 Application 里;
模塊之間的跳轉,除了使用別名的方式,我能想到的還有另外一種方式,同樣是通過 gradle 腳本,將跳轉用到的類打成一個 jar ,作為一個 API 服務提供給其他模塊作為編譯期依賴(provided)引入;
各個 library 在 debug 的時候作為 apk ,要獨立打包運行測試,這時就需要有一個啟動 Activity ,而 library 是不需要的,我的想法是放置兩個 AndroidManifest.xml ,使用 sourceSets 分別在 debug 和 release 的時候載入不同的 AndroidManifest.xml 。

⑵ 什麼是Android插件開發

插件化開發和組件化開發略有不用,插件化開發時將整個app拆分成很多模塊,這些模塊包括一個宿主和多個插件,每個模塊都是一個apk(組件化的每個模塊是個lib),最終打包的時候將宿主apk和插件apk分開或者聯合打包。

開源的插件化框架

  • Qihoo360/DroidPlugin

  • CtripMobile/DynamicAPK

  • mmin18/AndroidDynamicLoader

  • singwhatiwanna/dynamic-load-apk

  • houkx/android-pluginmgr

  • bunnyblue/ACDD

  • wequick/Small

  • ……

  • 目前開源的這幾個框架有宿主和插件分離的也有融合在一起的,每個框架的詳細介紹和demo在github里都可以查看到。插件化demo運行起來比較簡單,但是真正將它用到實際項目中還是要考慮很多小細節的,目前我也正處於研究階段。

⑶ 怎麼將 Android 程序做成插件化的形式

有個框架叫apkplug
就是apk插件式的開發框架
其實原理都一樣,因為android不支持動態的增加jar
因此插件需要做成一個單獨的apk,框架APK去查找系統中的其它插件
然後結合一起調用即可

⑷ 如何編寫自己的android插件

目前plugin-x中定義了4個協議:ProtocolAds, ProtocolAnalytics, ProtocolIAP, ProtocolSocial。編寫自己的插件,不需要寫任何的c++/jni代碼或者javascript綁定代碼。我們已經在plugin-x的核心層實現了這些,開發者所要做的就是:

新建一個android工程。

使用java實現我們定義的介面。

plugin的文件夾結構

請確保你的plugin文件夾結構類似下圖:

build.xml : publish.sh腳本使用它,可以從其他插件工程拷貝過來,注意要修改工程名。

ForManifest.xml : gameDevGuide.sh使用它. 如果你的插件在AndroidManifest.xml開啟了一些額外的許可權,需要把他們添加到這個文件中。

sdk : 把第三方SDK的jar包放在這里。

src : 把你的插件實現代碼放在這里。

編寫java類實現至少一個介面

這個類應該有一個帶有Context參數的構造函數,例如:

package org.cocos2dx.plugin;
public class AnalyticsFlurry implements InterfaceAnalytics {
...
public AnalyticsFlurry(Context context) {
mContext = context;
}
}

你可以覆蓋介面中的方法,或者定義自己的方法,例如:

@Override
public String getSDKVersion() {
return "3.2.1";
}

protected void setUserId(String userId) {
LogD("setUserId invoked!");
final String curUser = userId;
PluginWrapper.runOnMainThread(new Runnable() {
@Override
public void run() {
try {
FlurryAgent.setUserId(curUser);
} catch(Exception e){
LogE("Exception in setUserId", e);
}
}
});
}

目前plugin-x只支持傳遞int, float, boolean, String, JSONObject類型的參數,返回值類型只可以是int, float, boolean, String。

⑸ Android上有哪些好用的插件

好用的Android Studio的插件:
支持直接在AS面板中進行ADB操作,
Uninstall App
Kill App
Start App
Restart App
Clear App Data
Clear App Data and Restart

⑹ Android的apkplug插件開發具體怎麼編譯生成插件 apk 文件

步驟1:注冊ApkPlug官網賬號:

打開Apkplug官網後,點擊右上角的「注冊」,在跳轉頁面填入相關信息,注冊界面如下:

確認後注冊成功,使用你的賬號登錄網站。你就可以用Apkplug開發應用了
END
步驟2:開發插件

Apkplug中的插件也是一個完整的apk,它與普通應用的區別有以下3點:
1, 插件assets目錄下有一個plugin.xml文檔,通過它可判斷一個工程是主應用還是插件。
2, 插件有一個入口類BundleActivator
3, 插件會外部引用一個osgi.jar文件
開發插件的步驟有如下4步:
1,引入osgi.jar庫文件
Apkplug中插件需要導入的庫文件只有一個osgi.jar。
導入osgi.jar庫文件需要注意一下
osgi.jar文件只能引用不能編譯到apk文件中,否則會出現類沖突的情況
異常代碼:had used a different Lorg/osgi/framework/BundleActivator; ring pre-verification。
osgi.jar包導入方法:

這文件在Apkplug SDK中可以找到。

2,編寫插件入口類BundleActivator
插件啟動時首先調用BundleActivator,其功能類似android中的application類。

public class SimpleBundle implements BundleActivator
{
private BundleContext mcontext = null;
public void start(BundleContext context) throws Exception
{
System.err.println("你好我是插件,我將為你展示啟動acitivty我已經啟動了 我的BundleId為:"+context.getBundle().getBundleId());
}
public void stop(BundleContext context)
{
System.err.println("你好我是插件,我被停止了 我的BundleId為:"+context.getBundle().getBundleId());

}

}
3,編寫plugin.xml配置文件
plugin.xml
是一個配置表,它跟AndroidManifest.xml作用類似。 plugin.xml文檔放置在assets中即可 重要屬性說明:
Bundle-Name 插件名稱 Bundle-SymbolicName 插件包名
-與應用packagename可一一對應 Bundle-Version 插件版本 -1.0.0
Bundle-Activator 插件入口 -與Appliction 類似
Bundle-Activity 插件界面 -多個Activity可用 , 分割
Bundle-Service 插件Service -多個Service可用 , 分割
(v2.0.0新增) Bundle-Receiver 插件廣播 -多個廣播類可用 , 分割
(v2.0.0新增)
4, 編譯生成插件apk文件
插件工程中添加的文件目錄結構如下:

最後編譯運行插件工程,生成的apk文件即為插件文件
END
步驟3:開發主應用

Apkplug 主應用開發分兩步集成:
1. 獲取主應用授權AppAuth。
登錄賬號進入Apkplug後台後,切換到「應用授權頁面」,按要求填寫好應用信息,然後確定,你就擁有了一個等待開發的應用授權AppAuth。應用授權界面如下:

進入「授權列表」頁面,點擊「查看詳情」鏈接,進入「應用詳情界面」,就可以看到已申請的AppAuth,點擊其後面的「復制」,即可直接復制AppAuth,如下圖所示

2. 對接Apkplug SDK 導入相關庫文件。
①配置應用許可權
主應用需要幾個基礎的許可權配置,請將以下的幾個許可權加入到主應用的AndroidManifest.xml中。
<!-- 插件平台需要的許可權! -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE">
</uses-permission>

另外將一下加入到<application></application>節點中
<!-- 插件平台需要的配置! -->
<activity
android:name="org.apkplug.app.apkplugActivity"
android:theme="@style/android:Theme.Light"
android:configChanges="orientation|keyboardHidden"
/>
最後將我們從Apkplug管理後台申請到的AppAuth加入到配置文件中。

<meta-data android:name="apkplug-auth" android:value="xxxxxxxx" ></meta-data>
註:由於3.2.2節中我們直接復制了AppAuth,此處直接粘貼到AndroidManifest文檔中。
如下圖:

②導入SDK庫文件
主應用需要導入兩個文件,將其放入libs目錄中即可。
1, libndkfoo.so
2, Bundle2.0.0.jar
如下圖:

這兩個庫文件在Apkplug SDK中可以找到。
然後:
主應用啟動Apkplug最簡只需要一段代碼即可,建議在Application中啟動框架。

FrameworkInstance frame=FrameworkFactory.getInstance().start(List<BundleActivator>,Context);
將上一步驟開發好的插件apk,放置在主應用工程里的assets路徑下。
如下圖:

END
步驟4:啟動主應用

最後啟動主應用即可。簡單的插件化apk的方法就講完了,有興趣的關注我,下次講雲端託管插件實現應用內更新。

⑺ android 插件化和熱修復做什麼用的

針對Android平台,Dexposed支持函數級別的在線熱更新,例如對已經發布在應用市場上的宿主APK,當我們從crash統計平台上發現某個函數調用有bug,導致經常性crash,這時,可以在本地開發一個補丁APK,並發布到伺服器中,宿主APK下載這個補丁APK並集成後,就可以很容易修復這個crash。

Dexposed是基於久負盛名的開源Xposed框架實現的一個Android平台上功能強大的無侵入式運行時AOP框架。

Dexposed的AOP實現是完全非侵入式的,沒有使用任何註解處理器,編織器或者位元組碼重寫器。集成Dexposed框架很簡單,只需要在應用初始化階段載入一個很小的JNI庫就可以,這個載入操作已經封裝在DexposedBridge函數庫裡面的canDexposed函數中,源碼如下所示:

/**
* Check device if can run dexposed, and load libs auto.
*/
public synchronized static boolean canDexposed(Context context) {
if (!DeviceCheck.isDeviceSupport(context)) {
return false;
}
//load xposed lib for hook.
return loadDexposedLib(context);
}

private static boolean loadDexposedLib(Context context) {
// load xposed lib for hook.
try {
if (android.os.Build.VERSION.SDK_INT > 19){
System.loadLibrary("dexposed_l");
} else if (android.os.Build.VERSION.SDK_INT == 10
|| android.os.Build.VERSION.SDK_INT == 9 ||
android.os.Build.VERSION.SDK_INT > 14){
System.loadLibrary("dexposed");
}
return true;
} catch (Throwable e) {
return false;
}
}

Dexposed實現的hooking,不僅可以hook應用中的自定義函數,也可以hook應用中調用的Android框架的函數。Android開發者將從這一點得到很多好處,因為我們嚴重依賴於Android SDK的版本碎片化。

⑻ Android Studio有哪些非常好用的插件

Android Studio軟體免費下載

鏈接:https://pan..com/s/10uOaT5HNyfW9Agfntb9_Lw

提取碼:v3h1

Android Studio 是谷歌推出的一個Android集成開發工具,基於IntelliJ IDEA. 類似EclipseADT,Android Studio 提供了集成的 Android 開發工具用於開發和調試。

⑼ 為什麼我說Android插件化從入門到放棄

首先就是去寫代碼。有一個做Android的哥們升級為架構師,需要了解iOS這門技術,來問我怎麼能迅速精通iOS,我就告訴他,別玩虛的,腳踏實地跟著iOS開發團隊做幾個需求,半年之後再來談這個話題。Android和iOS的很多現金思想可以相互借鑒,我建議做一門技術的同學,也適當學習另一門技術。
咬著牙看開源項目。比如說JSPatch,怎麼看?我有個建議,你看JSPatch的版本提交歷史,從第一次提交看起,這時候的功能應該是最簡單的,也是最容易看懂的,然後看歷史每次提交都修改了哪些東西,你能搞清楚作者的思路是什麼。
Android插件化雖然有被React Native取代的勢頭,但還是要搞清楚插件化所涉及的各種思想和技術。我這一年來的心得是,這是提高自身內功的極好辦法。尤其是涉及到Android系統底層的各種Hook。
寫技術博客吧。每天看文章只能是看過,一個月後能沉澱下來的沒有多少,好記性不如爛筆頭。一開始你可以轉載或羅列精品文章的鏈接,慢慢的開始分享自己的心得,翻譯些技術文章,技術水平提高是一個循序漸進的過程。

⑽ android插件化框架哪個好

首先由於我自己也是個新手,也是在學習各種框架然後給公司項目選定相應自動化框架,研究移動自動化測試框架也就近段時間而已,所以我只能從我自己今天為止的認知角度給各個框架抒發我自己的拙見,你看是否能從中接納一二吧(對於我自己的話還需要再花一段時間去學習各個框架才能確定哪個/些是適合我們項目的了,也許到時我會寫個正式的總結)。

根據你的要求,應該不會考慮MonkeyRunner和Robotium,但我還是想跟你說下其實Robotium還是挺不錯的,如果你沒有考慮跨進程調用其他APP的話。至於MonkeyRunner我就不大推薦了,你可以看下我對金陽光老師的一個評論的回復《MonkenRunner通過HierarchyViewer定位控制項的方法和建議》(文章最後我乾脆也貼出來了)。至於Robotium,你對比下本人博客裡面各個框架編寫的Note的測試示例就可以看出來Robotium相對其他框架會簡介很多,況且發展的比UIAutomator和Appium長久很多,所以也應該會更成熟,和Eclipse集成調試起來也很方便。比起後兩者如果有不足的話我覺得就以下幾點吧:

1. 所有的操作抽象到一個Solo類裡面,缺乏面向對象的編程思想,有時會讓人不適應。如果你熟悉C語言等面向過程的語言思想的話應該沒有問題。
2. 獲取控制項的方法比較缺乏,大概就幾種:通過Text,ID, ClassName,Index。沒有後兩者的多種多樣
3. 跨進程:因為底層使用Instrument框架,測試包和被測應用包打包在一起作為一個進程運行而線程間通過instrumentaiton進行通信,導致了逃不出這個進程設沙箱(sandbox)
4. 做不了模擬鍵盤的測試(但同時這個也是Robotium非常巨大的優點,因為不像後兩者那樣需要調用鍵盤導致輸入的各種各樣的問題),因為Robotium輸入讀出其實是直接對控制項的text屬性進行操作沒有通過鍵盤驅動的,你如果做過UI編程應該就明白我的意思了,因為記住你的測試代碼和目標應用是打包在同一個進程中的,同一個進程中想訪問另外一個線程的某個變數,運用相應的IPC(Interprocess Communication)機制當然是沒有問題的了。

然後到了你問的主題UIAutomator和Appium的對比,我個人是這樣看的:

1. UIAutomator是親爹(google)生的,所以可以保證後續的開發維護力量,除非google倒閉(這里我有點不懂的是為什麼google對Monkeyrunner的態度這么讓人摸不著頭腦,具體請看以上我說的對MonkeyRunner的評論)
2. Appium雖然不是親爹生的,但是乾爹實力雄厚把它武裝的無所不能(android,ios,firefox,browser通殺),單單以android來說,底層用得還是UIAutomator,所以只要它能及時跟上UIAutomator的更新,功能上面我不是很擔心。
3. 但是也這是Appium的這種架構:UIautomator/seledroid<->Appium Server<->Selenium/AppiumDriver<->Test Case (《Appium架構框架圖整理》http://blog.csdn.net/zhutian/article/details/39453505),導致框架有點復雜,當問題出現的時候調試起來比較難以定位,不知道哪個模塊出錯了。但是說道調試,總比UIAutomator好,起碼Appium可以直接集成到eclipse上面進行debug,UiAutomator卻每次都要push到目標機器然後再去執行,怎麼調試呢?到現在為止我知道的只能原始的print了。
4. 向下兼容問題:Appium可以通過底層UIAutomator/Selendroid(不記得是不是這名字了)通殺;UIAutomator只能在API Level
17(包含)以上使用
5.語言支持:appium基本通殺,UIAutomator用java足矣
6.跨平台:如你所說的只是android兩者都沒有問題,如果往後需要擴展到ios,那麼建議appium
7.bug數量:UIAutomator有的問題Appium都會有,UIAutomator沒有的問題Appium也有可能有^_^(不過我還是很看好Appium的)
8. 輸入問題,都有bug,具體請查看我相應blog,特別是中文輸入,這就是為什麼我剛才特意提出Robotum的原因之一
9. WebView支持:UIAutomator據說今年年初已經開始支持,個人沒有這方面要求所以沒研究;Appium的框架用的Selenium本身就是PC上最流行的開源Web測試框架,所以必然支持了。注意這你你要有點android編程知識了,WebView指的不僅是WebView控制項還包含如用sencha+phonegap把webview封裝成一個跨平台app的情況了,具體如果不清楚請google。

其他區別我現在就沒有想到了,希望能幫助到你,從我自己的角度來看,我覺得UIAutomator繼續往前發展是必然的了,但是它不可能最終支持ios。至於Appium我同樣有很大的信心它會繼續往好的方向發展,且考慮到它的跨平台支持,基於node.js(現在非常流行哦),兼容性等,我如果是你的話我會考慮用Appium的(拋開Robotium不說,如果你又要考慮的話就需要你根據我之前說的再總結下了^_^)。

我覺得這個可以類比之前的微軟和Borland的關系,API是Windows,但是IDE是Borland的,各專所長了。可惜(或者慶幸)後來微軟發力一下把Borland打得滿地找牙一蹶不振,不過這是題外話了,略過......

對了,我有可能會對這封郵件整理下發到博客了,也希望其他網友能評點一二給你出主意。今晚本來想看下easy_monkey的知識了,給你寫這個email變成臨時性總結了。^_^

給金陽光老師評論的回復如下(關於MonkeyRunner的個人觀點)
-----------------------------------------------------------------------------------------------------------------
回復haorenmin2008:首先膜拜下,金老師大駕光臨蓬蓽生輝啊!
對於後者,確實如此,UIAutomator需要API Level17(包含)以上。
對於前者,因為還沒有MonkeyRunner的項目經驗,所以是否很強大我就不敢妄加評論了,但是在我近來的tryout過程中,鄙人有以下的一些不成熟的認知:

1. 感覺功能不是很穩定,之前嘗試一個MonkeyDevice的getProperty方法,竟然有時成功有時失敗。
2. 性能不好,特別是當我們要用到hierarchyviewer的功能的時候很明顯。
3. 只能用MonkeyImage的sameAs做截屏的對比,雖然加上hierarchyviewer後可以用它的getText,但還是很有限。
4. 控制項定位方面主要是坐標點和HierarchyViewer提供的根據ID。前這兒在UI布局稍微有調整位置的話就需要跟著變動,沒有像其他控制項類框架那樣做高層抽象除非換控制項不然都不需要怎麼變動;後者的話很多控制項是沒有id或者是有多個控制項id相同的。
5. 可調試性也不強(起碼我摸索了這幾天沒有發現一個很好的調試方法,比如IDE Ecilpse等的集成調試方法)
6. HierarchyViewer的穩定性也讓我擔憂,碰到過幾次取控制項信息的時候報exception的。
7. 資料稀缺,不僅網路,google也一樣
8. Google支持讓人覺得摸不著頭腦,sdk給出的API和官方提供的API竟然不一致,以MonkeyDevice為例子,而sdk多出來的API竟然還不能用,google出來的信息不超過10個page,還要很多都是重復的石沉大海的網友報的問題。
9. 再一個的我真心搞不懂為什麼本身java寫的庫非要搞個jython來調用,首先我不說性能損耗(這點肯定是有的,native庫當然用native語言調用效率最好嘛),我想在eclipse上對以下的"device."做自動補全是做不到的「device = MonkeyRunner.waitForConnection()\n device.",而只有直接調用個構造函數實例化的device = MonkeyDevice(xxx)才能做到,這個我不相信是我配置的問題,換了個jython標准編譯器以調用標准庫問題同樣存在。

熱點內容
三星usb存儲設備在哪 發布:2025-04-23 04:43:31 瀏覽:498
把什麼塗在密碼鎖上能看到密碼 發布:2025-04-23 04:29:40 瀏覽:242
sql2000密碼忘記 發布:2025-04-23 04:22:03 瀏覽:21
安卓手機退出應用怎麼絲滑 發布:2025-04-23 04:17:46 瀏覽:107
小米全盤加密 發布:2025-04-23 04:14:24 瀏覽:741
pac腳本代理伺服器地址 發布:2025-04-23 04:08:44 瀏覽:954
5g編程 發布:2025-04-23 03:59:14 瀏覽:293
kafka源碼分析 發布:2025-04-23 03:57:41 瀏覽:16
企鵝存儲罐 發布:2025-04-23 03:57:00 瀏覽:437
掛機怎樣做腳本 發布:2025-04-23 03:45:33 瀏覽:534