一直以來,在Android項目中引用第三方SDK都是將其複製到lib目錄下,根據開發環境的不同進行配置(在Android studio中需要使用工具進行添加File dependency到gradle中),便可直接調用內部方法進行實現。
現因公司的需求所以更改了引用Jar包的方式,對,那就是動態加載Jar包
前提:Jar包爲公司內部SDK
公司需求:爲實現在提供給用戶後,防止SDK被篡改,需使用SM3算法對其加密,並在非首次調用的時候進行驗證,如果與首次生成的SM3值不同則爲SDK已被篡改(首次生成的SM3值會保存,以供對比)
實現方式:
1:將Jar包放入sdk-build-tools目錄下的某版本中,運行dx --dex --output=xxx_dex.jar xxx.jar 命令,將此jar包轉換爲dex包並放到工程目錄的assets中
2:將工程目錄中的dex包複製到真機私有目錄下,使用DexClassLoader類加載器加載dex包(jar包)中的類名並得到類對象,相關代碼:
DexClassLoader dcl = new DexClassLoader(dex.jar包的路徑,加載後dex文件存放位置 , null, context.getClassLoader()); 類加載器
Class sotp = dcl.loadClass("com.zryf.sotp.SotpClient"); 加載類
Log.i("sotpClient --> ", "=" + sotp.getName());
Method method = sotp.getMethod("getInstance", Context.class); 參1:查找SDK中初始化方法 參2:參數類型
Object sotpClient = method.invoke(null, context); 反射得到類對象
Method sotpAppInfoMethod = sotp.getMethod("downLoadInit", String.class);
String val = (String) sotpAppInfoMethod.invoke(sotpClient, "333"); 反射類對象中的方法並得到返回值
通過以上方法即實現了動態加載jar包