|
本帖最后由 宇智波·佐助 于 2021-4-8 18:49 编辑
E4A 魔改版V1.5 支持java1.8更新多dex打包,优化原编译器体验
版本V1.5
优化插件编译流程无需两次编译才能成功
优化编译体验不弹出插件做到无声编译具体可以在E4A\build.ini文件中配置即参考说明
支持分包dex,在方法数超过65536后会可以自动打包多个dex,E4A\multidex-config.txt为主dex中保留的类,注意数量不能超过64k,不懂请勿动。
可以选择是否编译发布版dex,E4A\build.ini,发布版dex编译时会优化掉堆栈轨迹和记录异常时会用到的一些信息,可能会找不到错误地方,建议调试时编译调试版dex而不是发布版,具体可查看配置文件注释。
优化编译器逻辑如发生错误会直接输出错误日志,可简单得了的看到具体的错误原因。
此版本无需手动打开编译插件,也不用手动打开插件,编译器内部会自行调用。
优化不是E4A的安装目录无法使用的问题
此次主要是优化了1.4版本的许多问题,算一个正式版,建议立即更新此版本。
还望大家多多支持,赞助可以获得,绿色版绿色版编译器,编译插件都没有群号广告,更可以获得V1+V2签名的功能可以显著提升android7.0以上设备的app安装速度,以及apk安全性还可以获得技术支持,可直接添加我为好友进行赞助。
注意事项:
安装需要先安装原版6.8E4A然后替换原版的所有文件才行。
版本V1.4
主要更新内容:
jdk 1.7=>jdk1.8
sdk 23(android6.0)=>30(android11)
签名V1=>V1+V2
编译器dx=>d8
E4A的jdk和sdk版本相信大家都知道,使用java1.7,目前有大量java1.8的SDK支持库无法使用,SDK更是只有23(android6.0)导致大量的新api新无法使用,比如无障碍的手势操作,添加后将会导致无法成功编译R.java文件,无法调用androidx等新的Android支持库,此次更新将JDK更新到java1.8.0.181版本,sdk直达30(android11)处理好资源冲突等问题可以使用最新版的原生SDK,这将带来巨大的可扩展性支持,签名算法目前采用java的Signature工具进行v1签名,导致打包出来的apk安装速度慢,更新了v2签名后将显著提升新版安卓中apk的安装速度及apk安全性。
Android 7.0中引入了APK Signature Scheme v2,v1是jar Signature来自JDK。
V1:应该是通过ZIP条目进行验证,这样APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。
V2:验证压缩文件的所有字节,而不是单个 ZIP 条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证),从而加快应用安装速度。
注意事项:
1.更新java1.8后编译的类库都会自动基于java1.8,无法给使用java1.7的e4a使用,如必须用建议保留两个版本的e4a。
2.之前我的的动态权限工具在新版中可能会出现闪退的情况,可以找我拿新版。
3.清明查错工具无法用于新版,新的查错工具请等待后续版本发布。
4.关于无法找到R资源,编译器会自动唤醒插件中的编译插件,再次点击编译即可,也可以使用取资源索引方法。
版本V1.3
重写了e4a的事件管理者EventDispatcher在不影响原本事件正常流程的情况下配合超级事件监听器可以实现监听任意组件的任意事件,而不是像官方自带那样只能监听固定的几个
E4A的事件监听器相信大家应该都用过只是有一个很致命的问题,只能监听固定的那几个e4a官方自己带的组件的事件,其他第三方的一些类库都不能成功监听到。这样的话就很大的制约了e4a开发的自由度,经过对 e4a事件管理者EventDispatcher 的分析,对齐进行了修改后做出此魔改版+类库,经过仔细测试不会对原本e4a的事件派发产生影响。
下面分享一下我对e4a EventDispatcher 流程和实现原理的分析
EventDispatcher 一共有两个方法一个内部类,在可视页面添加一个控件或者写一个全局变量,那么e4a会自动生成代码对这个组件进行注册 调用这个方法registerEvent 它一共有三个参数Object object, String dataMemberName, String eventName 注册方法中 使用传入的这三个参数创建EventDispatcher.EventHandlerClosure 并添加到 private static Map<String, List<EventDispatcher.EventHandlerClosure>> registry = new HashMap();中在调用dispatchEvent派发事件方法后根据添加的eventName从 private static Map<String, List<EventDispatcher.EventHandlerClosure>> registry = new HashMap();查询事件名对应的List<EventDispatcher.EventHandlerClosure>
遍历List数据使用EventHandlerClosure的getDataMemberObject()通过反射获取到注册位置的变量,进行判断如果相等那么就调用相等对象invokeEvent对事件进行派发,EventHandlerClosure的构造方法中会先通过注册时传入的对象使用反射获取到class,判断该类中是否有对应的方法,如果有才会去给getDataMemberObject()中用到的对象赋值,否则也不会使用反射进行派发。
下载地址: https://share.weiyun.com/CqCp9c2w |
评分
-
查看全部评分
|