APK动态加载的问题

zlc_168 2016-07-26 05:25:52
根据网上的这篇文章http://blog.csdn.net/singwhatiwanna/article/details/39937639,我想从a.apk中动态加载b.apk中的一个Fragment,在a.apk中的Activity中已经重写了这三个方法
@Override
public AssetManager getAssets() {
if(mCurrentPackage == null ||
!mResources.containsKey(mCurrentPackage))
return super.getAssets();
else {
return mResources.get(mCurrentPackage).getAssetManager();
}
}

@Override
public Resources getResources() {
if(mCurrentPackage == null ||
!mResources.containsKey(mCurrentPackage))
return super.getResources();
else {
ResourceWarp wrapResourceWarp = mResources.get(mCurrentPackage);
return wrapResourceWarp.getResources();
}

}

@Override
public Theme getTheme() {
if(mCurrentPackage == null ||
!mResources.containsKey(mCurrentPackage))
return super.getTheme();
else {
ResourceWarp wrapResourceWarp = mResources.get(mCurrentPackage);
return wrapResourceWarp.getTheme();
}
根据当前需加载的包名,自动返回资源,但是在b.apk中的Fragment的方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle saveInstanceState) {
super.onCreateView(inflater, container, saveInstanceState);
View view = inflater.inflate(R.layout.test_appbase, container, false);
ImageView imgView = (ImageView)getView().findViewById(R.id.imageView1);
return view;
}
运行到ImageView imgView = (ImageView)getView().findViewById(R.id.imageView1);处会出错,无法找到R.id.imageView1,但是View view = inflater.inflate(R.layout.test_appbase, container, false);
这句代码又能通过
...全文
190 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlc_168 2016-07-28
  • 打赏
  • 举报
回复
问题已经解决,构造DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent)的时候,parent传入当前应用的classLoader就可以了
adfldk 2016-07-27
  • 打赏
  • 举报
回复
无法找到? 确定布局文件里有没有
网易云捕 2016-07-27
  • 打赏
  • 举报
回复
引用 2 楼 zlc_168 的回复:
上面的问题解决了,现在是无法确定对象的类型。比如我在a项目中定义了基类appBase,然后再b项目中定义了testBase extends appBase,通过反射从b.apk中加载出对象testBase,然后用 testBase的实例对象 instanceof appBase,都返回false,不知道是什么原因
虽然它们的类名称一样,查是他们的classloader不一样。理解这个需要对classloader有一定理解,下面这篇文章有讲到你这种情况,你可以看下。 http://www.alloyteam.com/2014/04/android-cha-jian-yuan-li-pou-xi/
yayayaiii 2016-07-27
  • 打赏
  • 举报
回复
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState) { super.onCreateView(inflater, container, saveInstanceState); View view = inflater.inflate(R.layout.test_appbase, container, false); ImageView imgView = (ImageView) view.findViewById(R.id.imageView1); return view; } ImageView imgView = (ImageView) view.findViewById(R.id.imageView1); 这里要用view.findViewById();
zlc_168 2016-07-27
  • 打赏
  • 举报
回复
上面的问题解决了,现在是无法确定对象的类型。比如我在a项目中定义了基类appBase,然后再b项目中定义了testBase extends appBase,通过反射从b.apk中加载出对象testBase,然后用 testBase的实例对象 instanceof appBase,都返回false,不知道是什么原因

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧