singwhatiwanna / dynamic-load-apk Goto Github PK
View Code? Open in Web Editor NEWDL : dynamic load framework in android
Home Page: http://blog.csdn.net/singwhatiwanna/article/details/40283117
License: Other
DL : dynamic load framework in android
Home Page: http://blog.csdn.net/singwhatiwanna/article/details/40283117
License: Other
lab中的DLIntent会报错:
04-10 21:24:55.057: E/AndroidRuntime(28032): FATAL EXCEPTION: main
04-10 21:24:55.057: E/AndroidRuntime(28032): java.lang.IllegalArgumentException: Unknown URI type: -1
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.os.Parcel.readException(Parcel.java:1429)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.os.Parcel.readException(Parcel.java:1379)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1761)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1411)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.app.Activity.startActivityFromChild(Activity.java:3805)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.app.Activity.startActivityFromChild(Activity.java:3781)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.app.Activity.startActivityForResult(Activity.java:3382)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.app.Activity.startActivityForResult(Activity.java:3318)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.app.Activity.startActivity(Activity.java:3528)
04-10 21:24:55.057: E/AndroidRuntime(28032): at android.app.Activity.startActivity(Activity.java:3496)
其实错误原因应该是由于 Parcelable.Creator CREATOR = new Parcelable.Creator();引起来的,如果把DLIntent再转化成Intent使用就不会报错。
(在DLPluginManager中的startPluginActivityForResult方法中又new了一个Intent来使用,然后把DLIntent的相应参数再赋值一次,不知道是不是转化DLIntent的意思)
但是如果每次使用DLIntent的地方都要转化一下变成Intent,感觉好麻烦。所以请教怎么修改既可以使用DLIntent 也不需要再转化成Intent呢?
我们使你的框架时,发现我们引入的so,分不清是x86还是arm的so 我仔细查看你的文档时,也没有对方面的说明
10-30 10:08:55.089: E/Parcel(14355): Class not found when unmarshalling: xx.model.Video
10-30 10:08:55.089: E/Parcel(14355): java.lang.ClassNotFoundException: xx.Video
10-30 10:08:55.089: E/Parcel(14355): at java.lang.Class.classForName(Native Method)
10-30 10:08:55.089: E/Parcel(14355): at java.lang.Class.forName(Class.java:305)
10-30 10:08:55.089: E/Parcel(14355): at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
10-30 10:08:55.089: E/Parcel(14355): at android.os.Parcel.readParcelable(Parcel.java:2097)
10-30 10:08:55.089: E/Parcel(14355): at android.os.Parcel.readValue(Parcel.java:2013)
10-30 10:08:55.089: E/Parcel(14355): at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
10-30 10:08:55.089: E/Parcel(14355): at android.os.Bundle.unparcel(Bundle.java:249)
10-30 10:08:55.089: E/Parcel(14355): at android.os.Bundle.getString(Bundle.java:1118)
10-30 10:08:55.089: E/Parcel(14355): at android.content.Intent.getStringExtra(Intent.java:4624)
10-30 10:08:55.089: E/Parcel(14355): at com.ryg.dynamicload.DLProxyFragmentActivity.onCreate(DLProxyFragmentActivity.java:95)
10-30 10:08:55.089: E/Parcel(14355): at android.app.Activity.performCreate(Activity.java:5231)
10-30 10:08:55.089: E/Parcel(14355): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-30 10:08:55.089: E/Parcel(14355): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
10-30 10:08:55.089: E/Parcel(14355): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
10-30 10:08:55.089: E/Parcel(14355): at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-30 10:08:55.089: E/Parcel(14355): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-30 10:08:55.089: E/Parcel(14355): at android.os.Handler.dispatchMessage(Handler.java:102)
10-30 10:08:55.089: E/Parcel(14355): at android.os.Looper.loop(Looper.java:136)
10-30 10:08:55.089: E/Parcel(14355): at android.app.ActivityThread.main(ActivityThread.java:5001)
10-30 10:08:55.089: E/Parcel(14355): at java.lang.reflect.Method.invoke(Native Method)
10-30 10:08:55.089: E/Parcel(14355): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-30 10:08:55.089: E/Parcel(14355): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-30 10:08:55.089: E/Parcel(14355): Caused by: java.lang.ClassNotFoundException: Didn't find class "xx.Video" on path: DexPathList[[zip file "/data/app/xx-1.apk"],nativeLibraryDirectories=[/data/app-lib/xx-1, /vendor/lib, /system/lib]]
10-30 10:08:55.089: E/Parcel(14355): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
插件apk中我已经注册了广播
that.registerReceiver(mAlarmReceiver, alarmFilter);
that.registerReceiver(mPhoneStateReceiver, mPhoneStatefilter);
ondestroy调用
that.unregisterReceiver(mAlarmReceiver);
that.unregisterReceiver(mPhoneStateReceiver);
报错
12-04 15:15:46.199: E/AndroidRuntime(27075): Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.easy.numberlockactivity.MainActivity$1@42bcb278
12-04 15:15:46.199: E/AndroidRuntime(27075): at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:667)
12-04 15:15:46.199: E/AndroidRuntime(27075): at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1743)
12-04 15:15:46.199: E/AndroidRuntime(27075): at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:475)
12-04 15:15:46.199: E/AndroidRuntime(27075): at com.easy.numberlockactivity.MainActivity.onDestroy(MainActivity.java:170)
12-04 15:15:46.199: E/AndroidRuntime(27075): at com.ryg.dynamicload.DLProxyActivity.onDestroy(DLProxyActivity.java:112)
12-04 15:15:46.199: E/AndroidRuntime(27075): at android.app.Activity.performDestroy(Activity.java:5543)
12-04 15:15:46.199: E/AndroidRuntime(27075): at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1134)
12-04 15:15:46.199: E/AndroidRuntime(27075): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3619)
11-03 16:21:25.359: E/AndroidRuntime(26382): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xx.airplan/com.ryg.dynamicload.DLProxyFragmentActivity}: java.lang.NullPointerException: Attempt to read from field 'android.content.res.AssetManager com.ryg.dynamicload.internal.DLPluginPackage.assetManager' on a null object reference
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.app.ActivityThread.access$800(ActivityThread.java:135)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.os.Handler.dispatchMessage(Handler.java:102)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.os.Looper.loop(Looper.java:136)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.app.ActivityThread.main(ActivityThread.java:5001)
11-03 16:21:25.359: E/AndroidRuntime(26382): at java.lang.reflect.Method.invoke(Native Method)
11-03 16:21:25.359: E/AndroidRuntime(26382): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
11-03 16:21:25.359: E/AndroidRuntime(26382): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
11-03 16:21:25.359: E/AndroidRuntime(26382): Caused by: java.lang.NullPointerException: Attempt to read from field 'android.content.res.AssetManager com.ryg.dynamicload.internal.DLPluginPackage.assetManager' on a null object reference
11-03 16:21:25.359: E/AndroidRuntime(26382): at com.ryg.dynamicload.internal.DLProxyImpl.onCreate(DLProxyImpl.java:92)
11-03 16:21:25.359: E/AndroidRuntime(26382): at com.ryg.dynamicload.DLProxyFragmentActivity.onCreate(DLProxyFragmentActivity.java:45)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.app.Activity.performCreate(Activity.java:5231)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
11-03 16:21:25.359: E/AndroidRuntime(26382): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
11-03 16:21:25.359: E/AndroidRuntime(26382): ... 9 more
在mainhost 里打开插件activity后,startTestactivity 全屏会出现卡顿,这个是什么原因?
现在DL支持启动服务嘛,但是我的一个服务启动起来了,如何停止了?应该用什么对象俩调用stopService方法呢?求高手指教啊?
插件对DialogActivity的透明背景不太支持,都是黑的背景
工程导入eclipse后,main-plugin-a编译不通过,
另外能否写一个sample的使用说明。谢谢
安卓5.0系统 宿主跳转插件dl传值不支持
插件升级(插件版本更新)需要改进的地方:
在com.mwan.dynamicload.internal
public DLPluginPackage loadApk(String dexPath){
...
mPackagesHolder.get(packageInfo.packageName);
...
}
插件加载是根据包名加载, 若插件文件从版本1升级到版本2, 在没有结束整个进程时,
loadApk(plugin2)得到的DLPluginPackage跟loadApk(plugin1)一致,插件升级后运行的还是版本1,
只有进程重启才会运行版本2.
mPackagesHolder.get(packageInfo.packageName); 最好加个版本判断~
如何限定横竖屏,现在只有DLProxyFragmentActivity上的才生效,但是这样全部的都被限制了,我想对指定页面限制
你好,运行master分支上面hots,点击插件工程,运行到loadPluginClass找不到类,求解
目前的代码是启动一个界面的activity,然后用代理的activity做为context给插件使用的。
那么现在遇到不能出现界面的插件,应该传递什么context给插件使用?
尝试想过创建一个看不见的activity,但是这样有多个无界面的插件要启动,那么无谓多出来N多个activity浪费系统资源,而且这个activity一旦关闭了,context就失效了,但是又不能传递getApplicationContext给插件用,这样插件里面的context没法获取对应的resource。
尝试想过传递服务的context给插件用,但是无法支持多个插件,因为重复启动服务,它的context都是同一个。
请问如何支持多个无界面的插件使用context来工作呢?
根据目前现有的代码,代理activity重复启动是会有多个不同地址的对象,但是service重复启动还只是一个,无法支持多个服务动态加载。
ava.lang.RuntimeException: Unable to start activity ComponentInfo{com.dike.sharetravel/com.ryg.dynamicload.DLProxyFragmentActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.ryg.dynamicload.internal.c.a(Unknown Source)
at com.ryg.dynamicload.DLProxyFragmentActivity.onCreate(Unknown Source)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
... 11 more
运行Demo测试so库加载,crash,异常:
03-06 21:58:26.802: E/dalvikvm(27280): dlopen("/data/data/com.ryg.dynamicload.sample.mainhost/app_pluginlib/libtest.so") failed: dlopen failed: "/data/data/com.ryg.dynamicload.sample.mainhost/app_pluginlib/libtest.so" is too small to be an ELF executable
手机型号:Nexus 5
你好,我用的是mac上的Androidstudio,编译生成的lib.jar和doi-common.jar有25G大,每个jar文件大约12.5G,这个太夸张了吧。
Hi @singwhatiwanna , 有遇到过三星手机里动态加载的apk不能读到宿主的xml之类的资源这样的问题?如果有,你们是怎么解决的?
Process: com.ryg.dynamicload.sample.mainhost, PID: 22376
java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
at dalvik.system.DexFile.defineClassNative(Native Method)
at dalvik.system.DexFile.defineClass(DexFile.java:222)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:215)
at dalvik.system.DexPathList.findClass(DexPathList.java:322)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at com.ryg.dynamicload.internal.DLPluginManager.startPluginActivityForResult(DLPluginManager.java:185)
at com.ryg.dynamicload.internal.DLPluginManager.startPluginActivity(DLPluginManager.java:150)
at com.ryg.dynamicload.sample.mainhost.MainActivity.onItemClick(MainActivity.java:164)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
at android.widget.AbsListView$3.run(AbsListView.java:3638)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5151)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691)
at dalvik.system.NativeStart.main(Native Method)
开发工具:Android studio
有人说是两个相同类的但是由不同的类加载器加载造成的错误,求解
是否放弃jar lib形式?采用android aar lib格式
主程和插件同时依赖一个含有资源的第三方库工程如何处理?
宿主和插件之间怎么样能够项目调用对象呢????小白 跪求
请问要怎么独立安装运行?方便调试呢?
使用Intent不能使用
DLIntent intent = new DLIntent(that.getPackageName(),LoginAnimationActivity.class);
that.startActivity(intent);
android.content.ActivityNotFoundException: No Activity found to handle Intent { }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1632)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1424)
at android.app.Activity.startActivityForResult(Activity.java:3433)
at android.app.Activity.startActivityForResult(Activity.java:3394)
at android.app.Activity.startActivity(Activity.java:3636)
at android.app.Activity.startActivity(Activity.java:3604)
我修改了DL 的部分代码,可以使 主工程支持 roboGuice , 但是 由于插件的启动方式,是通过反射创建出来,由代理Activity 启动管理生命周期,和资源,所以 依赖注入在 插件中就失效了。 不知道 插件支持Ioc 这样的模式 是否可行。
发现资源文件ID,宿主不能获取。报错
安卓5.0系统 宿主跳转插件dl传值不支持
如题
DL插件如何独立运行调试?直接运行的话一运行就崩溃
微博默认会回调回跳转过去的页面,但是插件的页面地址是aa.aa.aa/.bb.bb.xxactivity
aa.aa.aa是宿主的包名,bb.bb.xxactivity是插件的activity地址,这样就会直接崩溃。
前一个版本正常,最新版本会导致webview网络加载的html5无法自适应屏幕分辨率,webview是在fragment里面加载
ps:独立运行正常
若在application标签下放置android:theme则会引发java.lang.RuntimeException: Binary XML file line #31: You must supply a layout_height attribute.这个错误
若去掉application下的android:theme则正常
出问题的文件1 AndroidManifest.xml
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
没问题的文件2 AndroidManifest.xml
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
错误日志
11-26 13:56:50.531 29391-29391/com.abc.soft D/DLPluginManager﹕ launch com.ryg.dynamicload.sample.mainplugin.MainActivity
11-26 13:56:50.581 29391-29391/com.abc.soft D/DLProxyImpl﹕ mClass=com.ryg.dynamicload.sample.mainplugin.MainActivity mPackageName=com.ryg.dynamicload.sample.mainplugina
11-26 13:56:50.581 29391-29391/com.abc.soft D/DLProxyImpl﹕ handleActivityInfo, theme=16973836
11-26 13:56:50.586 29391-29391/com.abc.soft D/DLProxyImpl﹕ instance = com.ryg.dynamicload.sample.mainplugin.MainActivity@4250c3c8
11-26 13:56:50.586 29391-29391/com.abc.soft D/DLBasePluginActivity﹕ attach: proxyActivity= com.ryg.dynamicload.DLProxyActivity@42508be8
11-26 13:56:50.586 29391-29391/com.abc.soft D/DLBasePluginActivity﹕ onCreate: from= FROM_EXTERNAL
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ java.lang.RuntimeException: Binary XML file line #31: You must supply a layout_height attribute.
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:492)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:6187)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.view.ViewGroup$MarginLayoutParams.(ViewGroup.java:6355)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.widget.LinearLayout$LayoutParams.(LinearLayout.java:1837)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:1749)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:58)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.view.LayoutInflater.rInflate(LayoutInflater.java:768)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:3296)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:3359)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:381)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:375)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at android.app.Activity.setContentView(Activity.java:2053)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at com.ryg.dynamicload.sample.mainplugin.MainActivity.initView(MainActivity.java:31)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at com.ryg.dynamicload.sample.mainplugin.MainActivity.onCreate(MainActivity.java:27)
11-26 13:56:50.591 29391-29391/com.abc.soft W/System.err﹕ at com.ryg.dynamicload.internal.DLProxyImpl.launchTargetActivity(DLProxyImpl.java:114)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at com.ryg.dynamicload.internal.DLProxyImpl.onCreate(DLProxyImpl.java:97)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at com.ryg.dynamicload.DLProxyActivity.onCreate(DLProxyActivity.java:45)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.app.Activity.performCreate(Activity.java:5453)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.app.ActivityThread.access$900(ActivityThread.java:175)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.os.Looper.loop(Looper.java:146)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5602)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
11-26 13:56:50.596 29391-29391/com.abc.soft W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
通过在DLBasePluginActivity的attach方法里面增加 attachBaseContext(mProxyActivity.getBaseContext());
可以解决this变量引起的大部分空指针问题。
但是后面碰到一个问题,调用LayoutInflater去inflate一个layout的时候,对于layout里面的控件的属性,无法读出资源引用,报错:
08-05 12:03:52.610: E/java.lang.Thread(10286): Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x1/d=0x7f0202d2 a=-1 r=0x7f0202d2}
08-05 12:03:52.610: E/java.lang.Thread(10286): at android.content.res.Resources.loadDrawable(Resources.java:2192)
08-05 12:03:52.610: E/java.lang.Thread(10286): at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
08-05 12:03:52.610: E/java.lang.Thread(10286): at android.view.View.(View.java:3555)
08-05 12:03:52.610: E/java.lang.Thread(10286): at android.widget.ImageView.(ImageView.java:140)
08-05 12:03:52.610: E/java.lang.Thread(10286): at android.widget.ImageView.(ImageView.java:136)
layout的加载方式如下:
LayoutInflater inflater = (LayoutInflater) mPluginActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
XmlResourceParser parser =mPluginActivity.getResources().getLayout(resId);
try {
content = newInflater.inflate(parser, null, false);
} finally {
parser.close();
}
有什么好的建议么?
在bin目录下build的apk使用没有问题。但是打包出来的apk 在main host中 Class.forName这个方法会有异常。提示找不到这个class 请问大家有遇到么??
I have a question. With library of 'dynamic-load-apk' imported, I can prepare a host app by Activity or DLBasePluginActivity included in this lib. Then, If I want some plugin apps plugged in, I need to prepare plugin app by this lib. So, whether could I interface with other plugin apps from the current one? And if I only want to update part of one of my plugin apps, how could I do it?
//全屏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//导航条透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
比如我在主包写了这样的属性后,主包就会全屏了,但是插件包写了会报错,但是不加,一旦跳转到插件包就没法全屏了
11-07 10:49:38.935: W/System.err(16700): java.lang.RuntimeException: Binary XML file line #31: You must supply a layout_height attribute.
11-07 10:49:38.935: W/System.err(16700): at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:492)
11-07 10:49:38.935: W/System.err(16700): at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:6176)
11-07 10:49:38.935: W/System.err(16700): at android.view.ViewGroup$MarginLayoutParams.(ViewGroup.java:6344)
11-07 10:49:38.935: W/System.err(16700): at android.widget.LinearLayout$LayoutParams.(LinearLayout.java:1837)
11-07 10:49:38.935: W/System.err(16700): at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:1749)
11-07 10:49:38.935: W/System.err(16700): at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:58)
11-07 10:49:38.935: W/System.err(16700): at android.view.LayoutInflater.rInflate(LayoutInflater.java:768)
11-07 10:49:38.935: W/System.err(16700): at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
11-07 10:49:38.935: W/System.err(16700): at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
11-07 10:49:38.935: W/System.err(16700): at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
11-07 10:49:38.935: W/System.err(16700): at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:3253)
11-07 10:49:38.935: W/System.err(16700): at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:3327)
11-07 10:49:38.935: W/System.err(16700): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:336)
11-07 10:49:38.935: W/System.err(16700): at android.app.Activity.setContentView(Activity.java:1973)
11-07 10:49:38.935: W/System.err(16700): at com.xx.MainActivity.onCreate(MainActivity.java:148)
11-07 10:49:38.940: W/System.err(16700): at com.ryg.dynamicload.internal.DLProxyImpl.launchTargetActivity(DLProxyImpl.java:114)
11-07 10:49:38.940: W/System.err(16700): at com.ryg.dynamicload.internal.DLProxyImpl.onCreate(DLProxyImpl.java:97)
11-07 10:49:38.940: W/System.err(16700): at com.ryg.dynamicload.DLProxyFragmentActivity.onCreate(DLProxyFragmentActivity.java:45)
11-07 10:49:38.940: W/System.err(16700): at android.app.Activity.performCreate(Activity.java:5389)
11-07 10:49:38.940: W/System.err(16700): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
11-07 10:49:38.940: W/System.err(16700): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246)
11-07 10:49:38.940: W/System.err(16700): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340)
11-07 10:49:38.940: W/System.err(16700): at android.app.ActivityThread.access$800(ActivityThread.java:157)
11-07 10:49:38.940: W/System.err(16700): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
11-07 10:49:38.940: W/System.err(16700): at android.os.Handler.dispatchMessage(Handler.java:102)
11-07 10:49:38.940: W/System.err(16700): at android.os.Looper.loop(Looper.java:157)
11-07 10:49:38.940: W/System.err(16700): at android.app.ActivityThread.main(ActivityThread.java:5293)
11-07 10:49:38.940: W/System.err(16700): at java.lang.reflect.Method.invokeNative(Native Method)
11-07 10:49:38.940: W/System.err(16700): at java.lang.reflect.Method.invoke(Method.java:515)
运行doi-host项目回报以下异常
11-03 01:49:05.137: E/AndroidRuntime(1125): java.lang.NullPointerException: disallow null packageName.
11-03 01:49:05.137: E/AndroidRuntime(1125): at com.ryg.dynamicload.internal.DLPluginManager.startPluginActivityForResult(DLPluginManager.java:170)
11-03 01:49:05.137: E/AndroidRuntime(1125): at com.ryg.dynamicload.internal.DLPluginManager.startPluginActivity(DLPluginManager.java:150)
11-03 01:49:05.137: E/AndroidRuntime(1125): at com.ryg.dynamicload.sample.doihost.MainActivity.onItemClick(MainActivity.java:165)
android:theme="@android:style/Theme.Translucent",这个系统主题在插件中没效果,有bug
在生成 plugin apk 时遇到问题了,我不会用 gradle 生成不包含 lib.jar 的 plugin apk.
OS:Yosemite
gradle 2.2.1
未修改build.gradle
trace
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':tasks'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:305)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80)
at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51)
at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:171)
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237)
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
at org.gradle.launcher.Main.doAction(Main.java:33)
at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
Caused by: org.gradle.api.GradleException: Could not determine the dependencies of task ':buildLib'.
at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.resolve(CachingTaskDependencyResolveContext.java:65)
at org.gradle.api.internal.tasks.AbstractTaskDependency.getDependencies(AbstractTaskDependency.java:27)
at org.gradle.api.internal.tasks.DefaultTaskContainer$1.getNodeValues(DefaultTaskContainer.java:178)
at org.gradle.api.internal.tasks.DefaultTaskContainer$1.getNodeValues(DefaultTaskContainer.java:176)
at org.gradle.internal.graph.CachingDirectedGraphWalker$GraphWithEmpyEdges.getNodeValues(CachingDirectedGraphWalker.java:200)
at org.gradle.internal.graph.CachingDirectedGraphWalker.doSearch(CachingDirectedGraphWalker.java:112)
at org.gradle.internal.graph.CachingDirectedGraphWalker.findValues(CachingDirectedGraphWalker.java:64)
at org.gradle.api.internal.tasks.DefaultTaskContainer.actualize(DefaultTaskContainer.java:176)
at org.gradle.api.internal.project.DefaultProjectTaskLister.listProjectTasks(DefaultProjectTaskLister.java:29)
at org.gradle.api.tasks.diagnostics.TaskReportTask.generate(TaskReportTask.java:61)
at org.gradle.api.tasks.diagnostics.AbstractReportTask.generate(AbstractReportTask.java:73)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
... 44 more
Caused by: org.gradle.api.UnknownTaskException: Task with path 'compileReleaseJava' not found in root project 'DynamicLoadApk'.
at org.gradle.api.internal.tasks.DefaultTaskContainer.getByPath(DefaultTaskContainer.java:150)
at org.gradle.api.internal.tasks.DefaultTaskContainer.resolveTask(DefaultTaskContainer.java:144)
at org.gradle.api.internal.tasks.DefaultTaskDependency.resolve(DefaultTaskDependency.java:80)
at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext$TaskGraphImpl.getNodeValues(CachingTaskDependencyResolveContext.java:86)
at org.gradle.internal.graph.CachingDirectedGraphWalker$GraphWithEmpyEdges.getNodeValues(CachingDirectedGraphWalker.java:200)
at org.gradle.internal.graph.CachingDirectedGraphWalker.doSearch(CachingDirectedGraphWalker.java:112)
at org.gradle.internal.graph.CachingDirectedGraphWalker.findValues(CachingDirectedGraphWalker.java:64)
at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.doResolve(CachingTaskDependencyResolveContext.java:74)
at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.resolve(CachingTaskDependencyResolveContext.java:63)
... 62 more
我看了一下加载的方式,现有的方式好像是放在sd上进行模块化加载。有没有把插件化的模块放在宿主的 Assets文件夹下加载的方式吗?
我提这个问题是因为,我是做游戏开发的,游戏开发中在后期接入很多第三方sdk后也会导致函数过多,无法编译,所以就考虑了动态加载,但如果放到sd下的话对游戏来说并不是很好的解决方法,如果能放在宿主的assets文件夹下去加载的话,这会是一个很好的解决方法。
项目会增加gradle的支持么
这样方便很多
Class resolved by unexpected DEX: Lcom/ryg/dynamicload/sample/mainpluginb/MainActivityBB;(0x4252a8c8):0x663e9000 ref [Lcom/ryg/dynamicload/DLBasePluginActivity;] Lcom/ryg/dynamicload/DLBasePluginActivity;(0x424aff60):0x65d66000
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/dalvikvm﹕ (Lcom/ryg/dynamicload/sample/mainpluginb/MainActivityBB; had used a different Lcom/ryg/dynamicload/DLBasePluginActivity; during pre-verification)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/dalvikvm﹕ Unable to resolve superclass of Lcom/ryg/dynamicload/sample/mainpluginb/MainActivityBB; (51)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/dalvikvm﹕ Link of class 'Lcom/ryg/dynamicload/sample/mainpluginb/MainActivityBB;' failed
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ java.lang.ClassNotFoundException: com.ryg.dynamicload.sample.mainpluginb.MainActivityBB
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at java.lang.Class.classForName(Native Method)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at java.lang.Class.forName(Class.java:217)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at com.ryg.dynamicload.internal.DLPluginManager.loadPluginClass(DLPluginManager.java:397)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at com.ryg.dynamicload.internal.DLPluginManager.startPluginActivityForResult(DLPluginManager.java:246)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at com.ryg.dynamicload.internal.DLPluginManager.startPluginActivity(DLPluginManager.java:216)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at com.ryg.dynamicload.sample.mainhost.MainActivity.onItemClick(MainActivity.java:173)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at android.widget.AdapterView.performItemClick(AdapterView.java:298)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at android.widget.AbsListView.performItemClick(AbsListView.java:1244)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at android.widget.AbsListView$PerformClick.run(AbsListView.java:3013)
08-21 14:01:05.195 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at android.widget.AbsListView$1.run(AbsListView.java:3718)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:615)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4914)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ Caused by: java.lang.NoClassDefFoundError: com/ryg/dynamicload/sample/mainpluginb/MainActivityBB
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ ... 19 more
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at dalvik.system.DexFile.defineClass(Native Method)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:211)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at dalvik.system.DexPathList.findClass(DexPathList.java:315)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
08-21 14:01:05.205 15001-15001/com.ryg.dynamicload.sample.mainhost W/System.err﹕ ... 19 more
Binary XML file line #31:You must supply a layout_height attribute.
测试华为手机等,没出现这个问题,三星手机会加载不了layout
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.