• Android 插件化技术窥探


    在Android 插件化技术中(宿主app和插件app设置相同的sharedUserId),动态加载apk有两种方式:

    • 一种是将资源主题包的apk安装到手机上再读取apk内的资源,这种方式的原理是将宿主app和插件app设置相同的sharedUserId,这样两个app将会在同一个进程中运行,并可以相互访问内部资源了。
    • 一种是不用安装资源apk的方式。其原理是通过DexClassLoader类加载器去加载指定路径下的apk、dex或者jar文件,反射出R类中相应的内部类然后根据资源名来获取我们需要的资源id,然后根据资源id得到对应的图片或者xml文件。

    下面介绍几种常见的方法获取资源以及代码的方法。

    • 获取已安装的APK中的资源
      利用Context的createPackageContext方法,可以创建另外一个包的上下文,里面有两个参数packageName包名,flags 标志位(CONTEXT_INCLUDE_CODE、CONTEXT_IGNORE_SECURITY)
      用法如下
    try {  
        context = createPackageContext("com.test.resource", 
                                       Context.CONTEXT_INCLUDE_CODE  
                                      | Context.CONTEXT_IGNORE_SECURITY);  
        textView.setText(context.getResources().getText(R.string.message));  
    } catch (NameNotFoundException e) {  
       e.printStackTrace();  
    }  
    • 获取未安装的APK中的资源

    新建一个获取资源的接口,传入插件APK的路径返回Resources对象

    // 获取插件apk的Resources对象
    public Resources getBundleResource(Context context, String apkPath) {
        AssetManager assetManager = createAssetManager(apkPath);
        return new Resources(assetManager, 
                             context.getResources().getDisplayMetrics(), 
                             context.getResources().getConfiguration());
    }
    
    private AssetManager createAssetManager(String apkPath) {
        try {
            AssetManager assetManager = AssetManager.class.newInstance();
            AssetManager.class.getDeclaredMethod("addAssetPath", String.class)
                              .invoke(assetManager, apkPath);
            return assetManager;
        } catch (Throwable th) {
            th.printStackTrace();
        }
        return null;
    }

    获得了Resource 对象之后,就可以通过函数resources.getDrawable、resources.getString、resources.getLayout 获取图片、字符串、布局文件了。



  • 相关阅读:
    《代码阅读与实践》阅读笔记*part1
    HDFS JAVA API
    《需求工程》阅读笔记*part3
    《需求工程》阅读笔记*part2
    HDFS文件命令
    HOG特征+SVM行人检测
    winchecksec安装踩坑
    加壳:挂起方式创建进程
    内存写入注入
    远程线程注入
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/10401308.html
Copyright © 2020-2023  润新知