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

androidapp插件

發布時間: 2024-09-28 19:30:36

㈠ android 怎麼動態的載入類

android 如何動態的載入類----app插件技術

轉自:http://blog.csdn.net/mingli198611/article/details/8858076
?
前言:
?
? ? ? 在目前的軟硬體環境下,Native App與Web App在用戶體驗上有著明顯的優勢,但在實際項目中有些會因為業務的頻繁變更而頻繁的升級客戶端,造成較差的用戶體驗,而這也恰恰是Web App的優勢。現如今很多項目要求需要採用類似於微信或Q游這樣的插件化開發模式越來越多,本文就是闡述android的動態載入技術來滿足插件化開發模式的文章。
?
1.基本概念
1.1??在Android中可以動態載入,但無法像java中那樣方便動態載入jar。
Android的虛擬機(DalvikVM)是不認識Java打出jar的byte code,需要通過dx工具來優化轉換成Dalvikbyte code才行。這一點在咱們Android項目打包的apk中可以看出:引入其他Jar的內容都被打包進了classes.dex。即android要載入的java類必須dex格式的代碼文件.
1.2??在Android中可以載入基於NDK的so庫。
NDK的執行效率很高,加密性很好,但同時開發入門難度大,一般用於加解密、數學運算等場合。so的載入很簡單,如果APK發布時已經攜帶了so文件,只需要在載入時調用System.loadLibrary(libName)方法即可。由於軟體的安裝目錄中存放so的目錄是沒有寫許可權的,開發者不能更改該目錄的內容,所以如果要動態載入存放在其他地方的so文件,用System.load(pathName)方法即可。
1.3??在Android中支持動態載入dex文件的兩種方式:
DexClassLoader:這個可以載入jar/apk/dex,也可以從SD卡中載入,也是本文的重點
PathClassLoader:只能載入已經安裝到Android系統中的apk文件。也就是 /data/app 目錄下的 apk 文件。其它位置的文件載入的時候都會出現 ClassNotFoundException.因為 PathClassLoader 會去讀取 /data/dalvik-cache 目錄下的經過 Dalvik 優化過的 dex 文件,這個目錄的 dex 文件是在安裝 apk 包的時候由 Dalvik 生成的。
?
2.注意
2.1 採用不用安裝的插件開發模式,只能夠使用?DexClassLoader進行載入.不過動態載入是有一些限制的,比如插件(子apk)包中的Activity、Service類是不能動態載入的,因為缺少聲明;即使你在Manifest文件中進行了聲明,系統默認也是到安裝apk所在的路徑中去尋找類,所以你會遇到一個ClassNotFound的異常。插件里你可以用主apk中先前放入的layout、strings等資源。但是插件中自帶的界面只能用純代碼進行編寫,插件中是不能載入插件(子apk)中的xml作為layout等資源使用的。所以在開發上一些特效會比較困難些,建議預先植入主apk中。
2.2?大家可以看看DexClassLoader的API文檔,裡面不提倡從SD卡載入,不安全
3.如何製作插件
3.1 把工程導出為jar包
3.2 執行SDK安裝目錄android-sdk-windows\platform-tools下的dx命令,把jar包轉換為dex格式

dx?--dex?--output=dex名 jar包名

4.如何做到啟動未安裝的apk中的activity?

採用反射機制,把主apk中的activity的context傳遞到插件的activity中,然後採用反射進行回調插件activity的方法。不足之出就是,插件中的activity並不是真正的activity,它只是運行在主activity中。比如:點擊返回直接退出當前activity而不是回到主activity。實例如下:
?
這是調用的Activity:
?
[java]?view plain ? ?
package?com.beyondsoft.activity;??
??
import?java.lang.reflect.Constructor;??
import?java.lang.reflect.InvocationTargetException;??
import?java.lang.reflect.Method;??
??
import?dalvik.system.DexClassLoader;??
import?android.app.Activity;??
import?android.content.pm.PackageInfo;??
import?android.os.Bundle;??
import?android.util.Log;??
??
public?class?PlugActivity?extends?Activity?{??
??
????private?Class?mActivityClass;??
????private?Object?mActivityInstance;??
????Class?localClass;??
????private?Object?instance;??
??
????@Override??
????protected?void?onCreate(Bundle?savedInstanceState)?{??
????????super.onCreate(savedInstanceState);??
??
????????Bundle?paramBundle?=?new?Bundle();??
????????paramBundle.putBoolean("KEY_START_FROM_OTHER_ACTIVITY",?true);??
????????paramBundle.putString("str",?"PlugActivity");??
????????String?dexpath?=?"/sdcard/FragmentProject.apk";??
????????String?dexoutputpath?=?"/mnt/sdcard/";??
????????LoadAPK(paramBundle,?dexpath,?dexoutputpath);??
????}??
??
????@Override??
????protected?void?onStart()?{??
????????super.onStart();??
????????Method?start;??
????????try?{??
????????????start?=?localClass.getMethod("onStart");??
????????????????start.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onResume()?{??
????????//?TODO?Auto-generated?method?stub??
????????super.onResume();??
????????Method?resume;??
????????try?{??
????????????resume?=?localClass.getMethod("onResume");??
????????????resume.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onPause()?{??
????????super.onPause();??
????????Method?pause;??
????????try?{??
????????????pause?=?localClass.getMethod("onPause");??
????????????pause.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onStop()?{??
????????super.onStop();??
????????try?{??
????????????Method?stop?=?localClass.getMethod("onStop");??
????????????stop.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onDestroy()?{??
????????//?TODO?Auto-generated?method?stub??
????????super.onDestroy();??
????????try?{??
????????????Method?des?=?localClass.getMethod("onDestroy");??
????????????des.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??

㈡ 開發安卓app用什麼軟體

開發安卓應用(Android App)主要使用以下幾種軟體:

Android Studio

Android Studio是谷歌官方推出的集成開發環境(IDE),專為Android應用開發設計。它提供了豐富的功能和工具,如代碼編輯器、編譯器、模擬器、性能分析工具等,能幫助開發者高效編寫、測試和優化應用。此外,Android Studio還集成了Google Play服務,方便開發者集成谷歌的服務和API。

Eclipse with ADT

雖然Android Studio是目前的主流選擇,但Eclipse曾經也是一款非常流行的Android開發工具。Eclipse是一個通用的IDE,而ADT(Android Development Tools)是一個插件,為Eclipse增加了Android開發的支持。然而,隨著Android Studio的推出和不斷完善,Eclipse的使用率已經大幅下降。

IntelliJ IDEA

IntelliJ IDEA是JetBrains公司開發的一款強大的Java IDE,也支持Android開發。與Android Studio相比,IntelliJ IDEA更加靈活和可定製,但它的學習曲線相對較陡,適合有一定經驗的開發者。

Visual Studio Code

Visual Studio Code(VS Code)是微軟開發的一款輕量級但功能強大的代碼編輯器,通過安裝插件也能支持Android開發。VS Code具有跨平台、可定製性強、啟動速度快等特點,受到了越來越多開發者的青睞。

總的來說,Android Studio是目前開發安卓應用的首選軟體,因為它提供了最全面的功能和最便捷的集成開發環境。然而,根據開發者的需求和習慣,Eclipse、IntelliJ IDEA和Visual Studio Code也是可行的選擇。

㈢ 怎樣檢測android應用軟體第三方插件SDK的安全問題

1、愛內測平台的插件評估將為您引用第三方從安全、性能測試、功能、兼容性等方面進行評估,以及集成第三方插件對您的應用是否有影響,包括功能、安裝包大小、性能等方面進行評估。
2、插件測試主要通過黑白名單方式收集近千款常用插件安全漏洞、性能、兼容性測試以及引用後對自身產品的影響,再採用主動檢測方式將插件進行反編譯再對插件從源碼與程度應用安全2大類型進行安全檢測。

㈣ apkplug是什麼

ApkPlug是一款好用的Android平台下的模塊化、插件化開發框架工具。

ApkPlug可以幫你減少apk應用代碼,縮小apk應用體積,同時支撐動態載入、應用內進行更新升級,支持第三方插件接入,為你開發APP減少人力和時間成本。
有以下特點:
完美支持Android原生四大組件。
插件化apk:多個APK在一個APK上運行。而且APK無需改造為插件。
插件異常隔離:再也不會發生因插件奔潰而導致主應用隨之奔潰的情況。
類ip地址傳送數據更方便快捷:新增主應用與插件,插件與插件之間類似ip地址傳輸的數據流管道通訊方式,使其之間的通信更簡單快捷。

開發一般有3個步驟:
1,注冊開發者賬號,獲取應用授權AppAuth。
2,插件應用中導入SDK和配置文檔,之後編譯打包。
3, 主應用中導入SDK和配置文檔。並放置打包好的插件應用APK。之後編譯打包啟動即可。

熱點內容
php中替換字元串 發布:2024-09-28 22:01:48 瀏覽:581
sql資料庫的使用 發布:2024-09-28 22:01:41 瀏覽:626
你們的wifi密碼多少 發布:2024-09-28 21:53:07 瀏覽:376
android訪問伺服器 發布:2024-09-28 21:48:46 瀏覽:733
安卓平板如何實現電腦雙擊 發布:2024-09-28 21:27:11 瀏覽:360
德育php 發布:2024-09-28 21:24:36 瀏覽:17
企業密信如何登錄伺服器ld 發布:2024-09-28 21:22:52 瀏覽:463
通過ip不能訪問網站 發布:2024-09-28 21:21:47 瀏覽:523
c語言取整數部分 發布:2024-09-28 21:17:59 瀏覽:66
進來學編程 發布:2024-09-28 21:01:17 瀏覽:966