1. 程式人生 > >Android動態載入jar檔案

Android動態載入jar檔案

這裡用個例子來演示,具體流程是用Android Studio建一個Android專案並編寫相應程式碼,然後用Eclipse編寫一個java程式碼並打成jar包,再轉換成Android能識別的dexjar包,最後先安裝好APP,然後把jar包放到APP目錄下,app通過反射呼叫jar包中的方法。

步驟

1.定義介面檔案

在Eclipse中建立一個介面檔案,這個介面檔案也要複製一份到安卓專案中,並且包名要相同。

package com.fu.test;

/**
 * 
 * Create by Fu 
 * 2017年10月16日 下午6:19:24
 * 
 * 通用介面檔案,Android專案中也需要這個檔案
 * 並且包名要一致
 */
public interface ILoader { public String hellow(); //計算a+b public int calculate(int a, int b); }

複製一份到Android專案中同樣的目錄下
這裡寫圖片描述

2.實現介面檔案並生成jar包

在Eclipse中新建一個java類並實現介面,Android專案中不需要。然後通過Eclipse打成jar包,再通過Android SDK的dx工具把Eclipse生成的jar包轉成Android能識別的jar包。

package com.fu.test;

/**
 * 
 * Create by Fu 
 * 2017年10月16日 下午6:30:59
 * 介面的實現類
 */
public class JarLoader implements ILoader { @Override public String hellow() { // TODO Auto-generated method stub return "我是後來儲存的jar包"; } @Override public int calculate(int a, int b) { // TODO Auto-generated method stub return a + b; } }

在Eclipse中,右鍵工程—>Export—>Java—>JAR file
這裡寫圖片描述

然後把生成出來的jar包複製到SDK目錄下\build-tools\26.0.0中,在這裡我們把jar包轉成Android能識別的jar包。
在這個目錄下開啟cmd,或者開啟cmd進入到這個目錄。
執行

dx --dex --output=myloader_dex.jar myloader.jar  

生成出來的myloader_dex.jar就是我們最終要放到儲存目錄中的jar包。

3.通過反射載入jar檔案

//拿到jar檔案
File path = new File(getFilesDir() + File.separator + "myloader_dex.jar");
DexClassLoader cl = new DexClassLoader(path.getAbsolutePath(), getFilesDir().getAbsolutePath(),
        getFilesDir().getAbsolutePath(), getClassLoader());
Class myClass = null;
try {
    // 載入JarLoader類, 並且通過反射構建JarLoader物件, 然後呼叫sayHi方法
    myClass = cl.loadClass("com.fu.test.JarLoader");  //這裡要用類的完整名稱
    ILoader loader = (ILoader) myClass.newInstance();
    //因為我們這裡也有介面檔案,所有就能直接點出方法來
    String hellow = loader.hellow();
    int result = loader.calculate(3, 5);
    Toast.makeText(MainActivity.this, hellow + ",計算結果=" + result, Toast.LENGTH_SHORT).show();
} catch (Exception exception) {
    exception.printStackTrace();
}

4.執行APP並把jar包放入到儲存空間進行測試

直接用Android Device Monitor放入jar包
放到/data/data/應用包名/files中,因為好像從安卓那個版本開始,通過反射載入dex檔案不能從外部儲存目錄了,也就是SD卡,所以我就放到這裡了,這個資料夾呼叫一下getFilesDir()就會自己生成。
這裡寫圖片描述

效果圖
這裡寫圖片描述

這樣我們就能實現不用重新安裝APP,僅改變jar包中的方法,然後重新生成jar包,放到儲存空間中,就會呼叫新的邏輯,當然如果改變介面檔案的話就需要編譯打包Android專案了。

相關推薦

Android動態載入jar檔案

這裡用個例子來演示,具體流程是用Android Studio建一個Android專案並編寫相應程式碼,然後用Eclipse編寫一個java程式碼並打成jar包,再轉換成Android能識別的dexjar包,最後先安裝好APP,然後把jar包放到APP目錄下,ap

Android動態載入Jar

定義介面, 把實現介面的部分打包成jar 在 將打包好的jar拷貝到SDK安裝目錄android-sdk-windows\platform-tools下,DOS進入這個目錄,執行命名: dx --dex --output=test.jar update.jar 核心載入

Android 動態載入佈局檔案

本文轉自:原文地址 Android的基本UI介面一般都是在xml檔案中定義好,然後通過activity的setContentView來顯示在介面上,這是Android UI的最簡單的構建方式。其實,為了實現更加複雜和更加靈活的UI介面,往往需要動態生成UI介面,甚至根

深入淺出Android動態載入jar包技術

在實際專案中,由於某些業務頻繁變更而導致頻繁升級客戶端的弊病會造成較差的使用者體驗,而這也恰是Web App的優勢,於是便衍生了一種思路,將核心的易於變更的業務封裝在jar包裡然後通過網路下載下來,再由android動態載入執行的方案,以改善頻繁升級的毛病   --前言

通過URLClassLoader實現動態載入jar檔案

Java程式碼   package t;   import java.net.URL;   import java.net.URLClassLoader;   import java.sql.Connection;   import java.sql.DatabaseMetaData;   imp

Android動態載入jar、apk的實現

        前段時間到阿里巴巴參加支付寶技術分享沙龍,看到支付寶在Android使用外掛化的技術,挺好奇的。正好這幾天看到了農民伯伯的相關文章,因此簡單整理了下,有什麼錯誤希望大神指正。       核心類      1.1      DexClassLoader類   

動態載入jar檔案

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">對於做客戶端,最煩惱的事情就是。今天升級以後,明天客戶反響了一大堆的問題

Android動態載入—so檔案

簡介 前幾天做一個視訊播放的功能,用到了bilibili開源ijkplayer播放器的(整合ijkplayer),功能確實強大,但就是用到的ffmpeg解碼庫太大,不得已只能只能將so檔案拿出來,通過動態的方式來載入。 什麼是動態載入? 就是講so檔案

Android動態載入Jar包並實現Native方法

一直以來,在Android專案中引用第三方SDK都是將其複製到lib目錄下,根據開發環境的不同進行配置(在Android studio中需要使用工具進行新增File dependency到gradle中),便可直接呼叫內部方法進行實現。 現因公司的需求所以更改了引用Jar包

android 動態載入sd卡的jar檔案

下面以一個例子列出Android程式執行時動態載入sd卡jar包的步驟: 1. 首先要準備好jar包。 本例中要對com.test.dynamic包進行打包,com.test.dynamic包下面有一個MyClass類.程式碼如下: package com.test.dynamic;   impo

Android應用安全之外部動態載入DEX檔案風險

1. 外部動態載入DEX檔案風險描述 Android 系統提供了一種類載入器DexClassLoader,其可以在執行時動態載入並解釋執行包含在JAR或APK檔案內的DEX檔案。外部動態載入DEX檔案的安全風險源於:Anroid4.1之前的系統版本容許Android應用將動態載入的DEX檔案儲存

android Activity.this.getLayoutInflater()::動態載入佈局檔案,實現彈窗效

activity類的拓展方法1:getLayoutInflater():將layout的xml佈局檔案例項化為View類物件,實現動態載入佈局 MainActivity.java package com.example.dynamiclayout; import and

關於apk加殼之動態載入dex檔案

由於自己之前做了一個關於手機令牌的APK軟體,在實現的過程中儘管使用了native so進行一定的邏輯演算法保護,但是在自己逆向破解的過程中發現我的手機令牌關鍵資料能夠“輕易地”暴露出來,所以我就想進一步的對其進行加固。於是,我使用的網上常用的梆梆加固、愛加密和阿里的聚安全應用來對我的apk進行一個

Untiy動態載入.dll檔案

這裡先說一下反射     System.Reflection名稱空間      (1) AppDomain:應用程式域,可以將其理解為一組程式集的邏輯容器        

Android Studio 載入arr檔案.arr檔案

第一步:吧字尾   .arr檔案複製到  libs包裡面 第二步:進入build.gradle檔案 //意思是他他回去libs裡面載入一些arr包 repositories { flatDir{ dir

Android 動態載入sd卡里面so庫

有些so檔案太大,可以從手機記憶體或者sd卡里面拷貝到執行的應用程式裡面。介面都是之前打包在裡面了。還可以做so更新,就是把之前拷貝進行刪除,然後進行不重新打包apk,進行重新拷貝進去。 1,封裝好的類 package com.rtcmdemo.until; impor

Android動態載入基礎 ClassLoader工作機制

基本資訊 類載入器ClassLoader 早期使用過Eclipse等Java編寫的軟體的同學可能比較熟悉,Eclipse可以載入許多第三方的外掛(或者叫擴充套件),這就是動態載入。這些外掛大多是一些Jar包,而使用外掛其實就是動態載入Jar包裡的Class進行工作。這其實

Android動態載入輪播圖BannerView

輪播圖在每個app中扮演著一個點綴的角色,在獨立做了三款app後都有這個需求,所以我決定把它單獨抽出來。以後只需copy,然後再根據需求改一下即可。 /** * 載入網路輪播圖 *@author jiangrongtao * *csdn

Android動態載入Activity原理

activity的啟動流程 載入一個Activity肯定不會像載入一般的類那樣,因為activity作為系統的元件有自己的生命週期,有系統的很多回調控制,所以自定義一個DexClassLoader類載入器來載入外掛中的Activity肯定是不可以的。 首先不得不瞭解一下ac

log4j和log4j2怎麼動態載入配置檔案

應用場景與問題 當專案在執行時,我們如果需要修改log4j 1.X或者log4j2的配置檔案,一般來說我們是不能直接將專案停止執行再來修改檔案重新部署的。於是就有這樣一個問題:如何在不停止當前專案的執行的情況下,讓系統能夠自動地監控配置檔案的修改狀況,從而實現動態載入配置檔案的功能?