zoukankan      html  css  js  c++  java
  • Android动态加载jar/dex

    http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html

    加载jar

    boolean bool = new File("/sdcard/test.jar").exists();
    		
    		DexClassLoader cl = new DexClassLoader(
    				"/sdcard/test.jar", this.getCacheDir()
    						.getAbsolutePath(), null, this.getClassLoader());
    		try {
    			Class<?> c  =  cl.loadClass("HelloWorld");
    			
    			Object obj = c.newInstance();
    			
    			Method method = c.getMethod("getHelloWord", null);
    			
    			String s = (String) method.invoke(obj, null);
    			
    			TextView tv = (TextView)findViewById(R.id.tv);
    			
    			tv.setText(s);
    			
    		} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    

      

    不要忘记:

    将jar优化时应该重新成jar(jar->dex->jar),如果如下命令:

          dx --dex --output=test.jar dynamic.jar

    加载未安装APK中的类

    public class MainActivity extends ActionBarActivity {
    
    	@SuppressLint("NewApi")
    	@SuppressWarnings("unused")
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		boolean bool = new File("/sdcard/test.apk").exists();
    		
    		DexClassLoader cl = new DexClassLoader(
    				"/sdcard/test.apk", this.getCacheDir()
    						.getAbsolutePath(), null, this.getClassLoader());
    		try {
    			Class<?> c  =  cl.loadClass("com.example.testdexclassloaderloadapk.MainActivity");
    			
    			Object obj = c.newInstance();
    			
    			Method method = c.getMethod("getHelloWord", null);
    			
    			String s = (String) method.invoke(obj, null);
    			
    			TextView tv = (TextView)findViewById(R.id.tv);
    			
    			tv.setText(s);
    			
    		} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    }
    

      注意:

    1.由于是使用反射,无法取得Context,也就是TestBActivity与普通的类毫无区别,没有生命周期。

    2.做实验是出现了: Class ref in pre-verified class resolved to unexpected implementation 错误

    查看:http://blog.csdn.net/berber78/article/details/41721877

    原因是 两个工程引用了同样的 appcompat_v7 工程

     大神之作  dl 动态加载架构:

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

  • 相关阅读:
    使用docker部署zabbix
    如何用好 IDEA ,Java 撸码效率至少提升 5 倍?
    getpass模块
    linux下利用nohup后台运行jar文件包程序
    Spring Cloud 与 Dubbo 区别
    git 打标签并推送tag到托管服务器
    git-stash用法小结
    git推送本地分支到远程分支
    Git dev分支合并到master分支完美实战
    IntelliJ远程调试教程
  • 原文地址:https://www.cnblogs.com/wjw334/p/4372676.html
Copyright © 2011-2022 走看看