Android常用高质量框架

Jetpack(MVVM)

  1. MVVMHabit 于谷歌最新AAC架构,MVVM设计模式的一套快速开发库。
  2. binding-collection-adapter 数据绑定框架将集合绑定到列表视图。
  3. data-binding-recyclerview  Recyclerview数据绑定框架。
  4. FlowBinding 受RxBinding启发, Kotlin Flow 绑定 API 和未捆绑的 UI 小部件。
  5. ViewBindingKTX 最全面的 ViewBinding 工具,支持 Kotlin 和 Java 用法。

网络

  1. Retrofit  适用于Android和Java的类型安全的HTTP客户端(API)。
  2. OkHttp  针对Java和Kotlin精心打造的HTTP客户端(API)。
  3. Volley  Volley是一个HTTP库,可以使Android应用程序的联网更加轻松,它可以更快地联网(文章)。
  4. AsyncHttpClient 该框架已过时(API)。 

图片

  1. Glide  一个快速高效的Android图片加载库(API)。
  2. glide-transformations  一个Android转换库,为Glide提供了各种图像转换。
  3. Picasso  强大的Android图片下载和缓存库。
  4. picasso-transformations  一个Android转换库,为Picasso提供了各种图像转换。
  5. Fresco  一个功能强大的系统,可在Android应用程序中显示图像(API)。
  6. fresco-processors 一个Android图像处理器库,为Fresco提供了各种图像转换。
  7. coil 由 Kotlin 协程支持的 Android 图像加载。
  8. Universal-Image-Loader  该框架已过时。
  9. Android-gif-drawable  Gif 加载框架。
  10. CircleImageView  圆角ImageView。
  11. PhotoView  ImageView的实现,支持通过各种触摸手势进行缩放。
  12. uCrop 一款优雅的图片裁剪框架。
  13. Luban  最接近微信的图片压缩框架。
  14. Compressor  一个轻巧而强大的android图像压缩库。
  15. Android-gpuimage  图像滤镜框架。

视频播放

  1. Ijkplayer  是Bilibili发布的基于 FFplay 的轻量级 Android/iOS 视频播放器。实现了跨平台功能,API 易于集成。
  2. 饺子(节操)视频播放器  节操视频播放器是一个让开发者可以三两行代码就能集成到应用中的视频播放框架。
  3. GSYVideoPlayer  基于IJKPlayer(兼容系统MediaPlayer与EXOPlayer2),实现了多功能的视频播放器。
  4. ExoPlayer  一个开源的,App等级的媒体API。
  5. PLDroidPlayer  七牛推出的一款免费的适用于 Android 平台的播放器 SDK。
  6. MD360Player4Android  这是一个精简库,可为Android渲染360度全景视频。
  7. DanmakuFlameMaster  开源弹幕引擎·烈焰弹幕使 ~。
  8. PreviewSeekBar  适用于显示视频预览的SeekBar。

轮播图。

  1. Banner  一个可以自定义的轮播容器,不侵入UI。
  2. MZBannerView  图片轮播控件,支持多种模式切换:普通ViewPager使用,普通Banner使用,仿魅族Banner使用。
  3. ViewPagerHelper 能够帮你快速实现导航栏轮播图(适配AndroidX)。
  4. BGABanner  引导界面滑动导航 + 大于等于1页时无限轮播 + 各种切换动画轮播效果。
  5. UltraViewPager 是ViewPager扩展,它封装了多个功能,主要是为多页切换方案提供统一的解决方案。
  6. Roll3DImageView  一个实现图片3D翻转的自定义view,包含四种3D翻转的效果以及一种2D平移效果。
  7. MagicViewPager 单页显示3个Item的ViewPager炫酷切换效果,适用于Banner等。
  8. BulletinView  万能的公告栏轮播 View,也可用于商品个性垂直轮播展示。

RecyclerView框架

  1. BRVAH  一个强大的RecyclerAdapter框架(API)。
  2. Recyclerview-animators  允许开发人员轻松创建带有动画的RecyclerView。
  3. Epoxy  用于在RecyclerView中构建复杂的屏幕。
  4. MultiType  使创建多种类型的RecyclerView变得更加容易和灵活。
  5. TreeRecyclerView  基于RecycleView封装的树形列表。
  6. sticky-headers-recyclerview  基于RecycleView的粘性头回收视图。
  7. StickyHeaders 适用于RecyclerView的适配器和LayoutManager,可实现粘性标头定位(支持AndroidX)。
  8. StickyHeaders  轻松将粘性页眉添加到您的RecyclerView(支持AndroidX)。
  9. vlayout  功能强大的LayoutManager扩展。
  10. GravitySnapHelper  将RecyclerView捕捉到边缘。

骨架屏

  1. Skeleton  该库提供了一种简单的方法来显示骨架加载视图。
  2. ShimmerRecyclerView  具有闪烁视图的自定义回收器视图,指示正在加载视图。
  3. Spruce-android  一个轻量级动画库,可帮助编排屏幕上的动画。

动画

  1. Material-Animations  安卓转场动画演示。
  2. AndroidViewAnimations  安卓视图动画合集。
  3. Transitions-Everywhere  一款教你正确使用Transitions API(Android 转场动画API)。

图表库

  1. MPAndroidChart   一款功能强大且易于使用的Android图表库(文章文章)。
  2. hellocharts  Android的图表/图形库,多种图表类型均支持缩放,滚动和动画。
  3. WilliamChart  可在Android应用程序中快速开发有吸引力且有见地的图表。
  4. KChartView  股票k线图。
  5. android-kline  Android版K线图和分时图。
  6. XCL-Charts  国人出品, 图表控件,种类很多。
  7. Android-Charts  国人实现的图表控件。
  8. SmartTable  一款android自动生成表格框架。
  9. AdaptiveTableLayout  可以读取,编辑和写入CSV文件的库。
  10. TableView  用于显示复杂的数据结构并呈现由行,列和单元格组成的表格数据。

RX系列

  1. RxJava  事件驱动的基于异步数据流的编程模式(API)。
  2. RxAndroid  一款Android客户端组件间异步通信的框架(API)。
  3. RxBinding  一款提供UI组件事件响应能力的框架(文章文章)。
  4. RxKotlin Kotlin 的 RxJava 绑定。
  5. Agera  谷歌开发的安卓反应式编程框架。

事件总线

  1. otto  事件总线框架,不推荐使用,而推荐使用RxJava和 RxAndroid
  2. EventBus  适用于Android和Java的发布/订阅事件总线(API)。

图片选择器

  1. PictureSelector  适用于Android或图片选择器的图片选择器库(API)。
  2. EasyPhotos 有拼图/文字贴纸/贴图/图片缩放/水印/图片编辑功能的图片选择器库。
  3. Matisse  知乎开源的图片选择器。
  4. BGAPhotoPicker Android 图片选择、预览、九宫格图片控件、拖拽排序九宫格图片控件。
  5. Android-FilePicker  图片 / 文件选择器。

弹框

  1. material-dialogs  流畅且可扩展的对话框API。
  2. Android-AlertView  仿iOS的AlertViewController。
  3. FlycoDialog  强大的Android对话框库内置常用Dialog。

二维码

  1. Scankit 华为二维码扫描服务(文章)。
  2. BGAQRCode-Android  QRCode 扫描二维码、扫描条形码、支持微博微信 QQ 二维码扫描样式。

热修复、插件化、组件化

  1. Bugly 微信Android热补丁解决方案(官网)。
  2. Sophix 阿里移动热修复(官网)。
  3. Robust 无差别兼容Android2.3-10版本,无需重启补丁实时生效,补丁修补成功率高达99.9%。
  4. RePlugin 灵活、稳定、易用的 Android 插件框架(官网)。
  5. Shadow 零反射全动态Android插件框架。
  6. Qigsaw 是基于Android App Bundles实现的 Android 动态组件化方案,它不需要重新安装实时动态分发插件。
  7. VirtualXposed  在非ROOT环境下运行Xposed模块的实现(支持5.0~10.0)。
  8. Atlas  淘宝推出的组件化开发框架。

选择器

  1. Android-PickerView  一款仿iOS的PickerView控件,有时间选择器和选项选择器(API)。
  2. DropDownMenu  下拉式菜单的筛选器。

权限处理

  1. PermissionX 一个开源的 Android 库,可以非常轻松地处理运行时权限(文章)。
  2. AndPermission Android 平台的权限管理器。
  3. HiPermission 一个简单易用的漂亮权限申请库。
  4. RxPermissions 一款基于RxJava完成权限申请的框架。

TextView框架

  1. SuperTextView  一个强大的TextView框架(文章)。
  2. html-textview  显示简单的HTML。
  3. SlantedTextView  倾斜的标签TextView。
  4. labelview  贴纸效果,如:淘宝商品侧贴折扣。
  5. ExpandableTextView  自定义可以动态展开/收缩显示长文本的TextView(文章)。
  6. Titanic   可以显示水位上升下降的TextView。
  7. TextLayoutBuilder  一个Android库,可让您更轻松地构建文本布局。

数据库框架

  1. Realm 一款移动端数据库框架(文档)。
  2. greenDAO 一款高效、快速的SQLite型数据库(文档)。
  3. sugar 用超级简单的方法处理Android数据库。

WebView框架

  1. VasSonic  专注于提升H5首屏加载速度。
  2. JsBridge  java和javascript桥,灵感来自微信webview jsbridge。
  3. AgentWeb  基于Android WebView的功能强大的库。

字体

  1. Android-Iconics  在应用中使用任何可绘制的图标字体或矢量。
  2. Calligraphy  一款自定义字体框架。
  3. android-typeface-helper  Android字体助手。
  4. FontsManager  字体管理器,方便快速的为应用内所有组件更换字体。

换肤

  1. Android-skin-support  换肤框架。
  2. Skinnable  东方证券Android换肤Project。

刷新加载框架

  1. SmartRefreshLayout  强大的智能下拉刷新框架。

高斯模糊,毛玻璃

  1. Blurry  好用的简易模糊库。
  2. Android-stackblur  可以基于渐变或半径对位图执行模糊效果,并返回结果。
  3. Blurkit-android  一个非常易于使用和高性能的,可在Android中渲染实时模糊效果。
  4. BlurView  类似于Android的基础View的动态iOS样模糊。

 Log框架

  1. Logger  简单,漂亮,强大的Android日志工具。
  2. Timber 一个小的,可扩展的日志工具。

测试框架

  1. mockito  Java编写的Mocking单元测试框架。
  2. robotium  Android UI 测试。
  3. robolectric  Android单元测试框架。

 UI框架

  1. ViewPagerIndicator  指示器小部件。
  2. AndroidSwipeLayout  侧滑删除,功能强大的swipe布局。
  3. FlycoTabLayout  具有3个样式的TabLayout。
  4. FlycoLabelView  一个简单的Android标签控件。
  5. StickyListHeaders 可轻松将吸顶布局集成到ListView。
  6. ShapeOfView  为任何android视图赋予自定义形状。
  7. ArcLayout  圆弧形弧布局,借助Arc Layout探索材料设计的新样式和方法。
  8. MagicMirror  提供多种常用形状,基于蒙版图的任意形状及常用滤镜的自定义ImageView。
  9. ArcLayout  超酷的弧形布局菜单。
  10. EasyFlipView  快速简便的翻转视图,通过它可以创建带有信用卡,扑克牌等两面的视图。
  11. android-flip  可以实现类似Flipboard一样的翻页效果。
  12. AndroidSlidingUpPanel  拖动的View,能在当前Activity上扶起一个可拖动的Panel。
  13. Grav  粒子动画效果,可让您基于点制作多个动画。
  14. Viewbadger  为其他View添加角标等。
  15. FanLayoutManager  风扇扇叶旋转效果列表。
  16. android-viewbadger  能够快速的为Android 视图加入“勋章”能力的框架。
  17. BadgeView  支持自由定制外观、拖拽消除。
  18. InfiniteCycleViewPager  具有双向定位和交互效果,可以水平和垂直滚动。
  19. StickyHeaderListView 打造炫酷列表之-标题渐变、吸附悬浮、筛选分类、动态头部等。
  20. StikkyHeader  可让您将标题粘贴到ListView并轻松对其应用动画。
  21. SwitchButton 一个美观,轻巧,易于定制的Android开关小部件。
  22. SpringIndicator  使用bezier实现粘连效果的页面指示。
  23. NumberProgressBar  个简约性感的数字进度条。
  24. Spotlight  可以点亮教程或演练等的项目,引导。
  25. SwipeStack  自定义且易于使用的可滑动视图堆栈。
  26. CardSwipeLayout  模仿探探卡片滑动效果的布局。
  27. TicketView  圆角和扇贝形角的android中实现TicketView。
  28. CalendarView  个优雅、万能自定义UI、支持周视图、自定义周起始、性能高效的日历控件,支持热插拔实现的UI定制。
  29. SecurityKeyboard 东方证券安全键盘。
  30. orientui  东方证券Android的UI组件库。
  31. MultipleStatusView  一个支持多种状态的自定义View,可以方便的切换到:加载中视图、错误视图、空数据视图、网络异常视图、内容视图。
  32. StatusLayoutManager  切换不同的数据状态布局,包含加载中、空数据和出错状态,可自定义状态布局。
  33. Android-AlertView  仿iOS的AlertViewController。

其他

  1. QMUI  提高 Android UI 开发效率的 UI 库(官网)。
  2. android-ui  精选的Android UI / UX库的精选列表。
  3. ImmersionBar  android 4.4以上沉浸式实现。
  4. StatusBarUtil  设置状态栏的工具库。
  5. Richeditor-android  一个美丽的富文本编辑器。
  6. AndroidAutoSize  今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案。
  7. XhsEmoticonsKeyboard  最良心的开源表情键盘解决方案。
  8. Recovery  崩溃恢复框架。
  9. CustomActivityOnCrash  崩溃处理。
  10. SuperCleanMaster  一键清理 开源版,包括内存加速,缓存清理,自启管理,软件管理等。
  11. FileDownloader  文件下载引擎。
  12. tess-two  Android 图片文字识别。
  13. ExplosionField  爆炸性粉尘效果。
  14. WaveLoading  波浪状加载效果。
  15. ShortcutBadger  Android 应用角库(文章)。
  16. AndroidPdfViewer PDF阅读器。
  17. Logger 一款让log日志优雅显示的框架。
  18. dagger  一款通过依赖注入降低程序间耦合的开发框架。
  19. Apktool  一款反编译apk的工具。
  20. DiskLruCache  一款提供磁盘文件缓存管理能力的框架。
  21. conceal  一款facebook提供的加密本地大文件的框架。
  22. Keyframes 一个用于将基于Adobe AE形状的动画转换为数据格式并在Android和iOS设备上播放的库。
  23. JKeyboardPanelSwitch  Android键盘面板冲突 布局闪动处理方案。
  24. WaveView  显示波效果的视图。
  25. Vorolay  VoronoiView是一个视图(ViewGroup),允许您在Voronoi图区域内添加和显示视图。
  26. TextDrawable  这个轻量级的库提供带有字母/文本的图像。
  27. autofittextview ,它会自动调整文本大小以使其完全适合其边界。
  28. android-ripple-background 适用于您应用的精美波纹动画。
  29. BluetoothSocket  此库可以方便的帮你使用经典蓝牙做socket 通讯。
  30. EasyNavigation  几行代码实现Tab导航(随意定制加号、带红点消息提示、高度定制、支持ViewPager2。
  31. MMKV  微信开发的高效,小型移动键值存储框架。
  32. jadx  Dex到Java反编译器。
  33. Cactus  安卓保活,Cactus 集成双进程前台服务,JobScheduler,一像素,WorkManager,无声音乐。
  34. watermark-android  加文字水印 支持配置文字大小,倾斜角度,多行水印。
  35. soter  腾讯开源, 在Android设备上实现可信的指纹认证。
  36. MusicIndicator  Android音乐指示器。易于使用。
  37. VRPlayer  一个简单但功能强大的本地VR视频播放器。
  38. AndServer  Android平台的Web服务器和Web框架(文章)。
  39. SwipeCaptcha  Android 平台的滑动验证码。
  40. CombineBitmap  仿钉钉、微信 群聊组合头像。
  41. excelPanel  Android的二维RecyclerView。不仅可以加载历史数据,还可以加载将来的数据。
  42. XUpdate 一个轻量级、高可用性的Android版本更新框架。
  43. AndroidPdfViewer  用于显示使用PdfiumAndroid渲染的PDF。
  44. MagicIndicator  强大、可定制、易扩展的 ViewPager 指示器框架。
  45. NineGridView  展示图片的九宫格控件。

开源项目

  1. cocoachina  开发者成长社区。
  2. SeeWeather  是一款遵循 Material Design 风格的只看天气的APP。
  3. EffectiveAndroidUI  一款讲解高效展示UI的教学型App。
  4. u2020  款提供Dagger的高级教学示例的app。
  5. androidmvp  一款展示Android端Mvp设计的demo。
  6. C9MJ  个人练手项目(新闻 + 视频直播): 基于 MVP。
  7. WeChatLuckyMoney  微信抢红包插件。
  8. bilibili-android-client 仿哔哩哔哩客户端。
  9. MVPArms  一个整合了大量主流开源项目高度可配置化的 Android MVP 快速集成框架。
  10. HighPerformanceFriendsCircle  实现高性能微信朋友圈。
  11. AnchorImageView  支持给图片加锚点的 Android 组件。
  12. Isometric  Android 透视三维体效果实现。

学习资源

  1. Android-training  Android学习网址。
  2. Android官网  谷歌中国网站。
  3. AndroidAll  最全的 Android 技术栈。
  4. Android_Data  Android 学习资料收集。
  5. UltimateAndroidReference  Android开发者的道路。

                持续更新中......

使用android studio 运行,下面是一个简单的文档,这个代码是一个demo 一、Activity的使用 1、SNActivity 框架最基本的activity,可调用$(SNManager)进行操作activity,具体用法请参考文档或代码 2、SNNavigationSlidingActivity 包含SNActivity的功能,继承于com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity 支持导航条和左滑视图的Activity 加载导航条: loadNavBar(int height,int background_color_id) loadNavBarResId(int height_id,int background_id) 加载左侧视图: /** * load left view * @param left_id left layout id * @param offset_value offset value * @param shadow_width_value shadow width value * @param shadow_drawable_id shadow drawable style * @param fade fade value */ loadLeft(int left_id, int offset_value, int shadow_width_value, int shadow_drawable_id, float fade) /** * load left view * @param left_id left layout id * @param offset_id offset id * @param shadow_width_id shadow width id * @param shadow_drawable_id shadow drawable id * @param fade fade value */ loadLeftResId(int left_id, int offset_id, int shadow_width_id, int shadow_drawable_id, float fade) 二、SNElement的使用 View的伪装对象,支持所有View的功能,详细功能可参考文档或代码 手动伪装:$.create $.id $.findView 注入伪装:$.setContent(view class or layout id,inject class); 获取原型:elem.toView(); 三、注入 1、视图注入 A、创建注入类,属性名称必须和layout中的id对应,如果不对应请加入标签@SNInjectView class DemoInject{ @SNInjectView(id=R.id.tvTest) public SNElement test; } B、实例化注入对象 DemoInject di=new DemoInject(); C、调用$.inject或者$.setContent注入 $.inject(di); D、注入成功后即可调用对象 String text=di.test.text(); 2、依赖注入 A、需要绑定注入对象,建议写到Application中的onCreate SNBindInjectManager.instance().bind(ITest.class, Test.class); B、与视图注入不同的是属性必须添加标签@SNIOC,注入的对象(Test)必须包含只有一个SNManager参数的构造函数,且必须实现注入者 public class Test implements ITest{ SNManager $; public Test(SNManager _$){ this.$=_$; }; } class DemoInject{ @SNIOC public ITest test; } C、调用$.inject或者$.setContent注入 同视图注入 D、注入成功后即可调用对象 di.test.xxx(); 四、fragment的使用 1、SNFragment 2、SNLazyFragment 五、控件的使用 1、SNFragmentScrollable 2、SNPercentLinearLayout、SNPercentRelativeLayout 3、SNScrollable 4、SNSlipNavigation 5、XList 6、slidingtab
Android-Plugin-Framework 此项目是Android插件框架完整源码以及实例。用来开发Android插件APK,并通过动态加载的方式在宿主程序中运行。 若插件APK是完全独立的APK,那么插件apk也可独立安装运行。 若插件APK不是完全独立的apk,比如和插件宿主程序共用一些依赖库,那么插件apk只能在宿主程序中运行。不可独立运行。 因为此时插件apk的代码是不完整的。 目录结构说明: PluginCore工程是插件库核心工程。用于提供对插件功能的支持。 PluginMain是用来测试的插件宿主程序Demo工程。 PluginShareLib是用来测试的插件宿主程序的依赖库Demo工程 PluginTest是用来测试的插件Demo工程。此工程下有用来编译插件的ant脚本。 宿主程序工程可以通过ant编译或者导入eclipse后直接点击Run菜单进行安装。 插件Demo工程需要通过插件ant脚本编译。编译命令为 “ant clean debug” 原因是Demo中引用了宿主程序的依赖库。需要在编译时对共享库进行排除。 插件编译出来以后,可以将插件复制到sdcard,然后在宿主程序中调用PluginLoader.installPlugin("插件apk绝对路径")进行安装 还有一种简易的安装方式,是使用编译命令为 “ant clean debug install” 直接将插件apk安装到系统中,PluginMain工程会监听系统的应用安装广播,监听到插件apk安装广播后, 再自动调用PluginLoader.installPlugin("/data/app/插件apk文件.apk")进行插件安装。免去复制到sdcard的过程。 (虽然没有用过apkplug、以及另外一个插件框架作者singwhatiwanna写的DL框架,但是看过他们的一些介绍文档,感觉自己的这份实现应该是更简单易用更完善。。。哈哈,是不是有王婆卖瓜的嫌疑。) 已支持的功能: 1、插件apk无需安装,由宿主程序动态加载运行。 2、插件形式支持fragment和activity代理。 这两种形式是插件开发中的两种主要形式。 3、插件支持activity非代理模式,真正实现Activity无需注册,既不用反射,也不用代理,实现Activity完整生命周期。 4、插件库apk可无任何特殊代码。如插件中的fragment,activity等无需继承任何特定基类或接口。完全和普通app代码没有区别. 5、支持插件共用宿主程序依赖库提供的自定义控件 6、支持插件中使用自定义控件 7、支持插件资源和宿主资源混合使用。意即支持如下场景: 插件程序和宿主程序共用依赖库时插件中的布局文件中使用了宿主程序中的自定义控件,而宿主程序中的自定义控件中又使用 了宿主程序中的布局文件。 插件代码中无需做任何特殊处理,即可支持这种布局文件。 8、插件中的各种资源、布局、R、以及宿主程序中的各种资源、布局、R等可随意使用、也无任何特殊代码。 10、支持插件使用宿主程序主题和系统主题 11、解决资源id冲突问题。尝试做过插件开发的同学应该都遇到,插件资源id和宿主程序资源id可能相同,导致获取的资源不是想要的资源。 此问题其实在android提供的编译器aapt中早已提供了支持。 12、需要关注PluginTest工程的ant.properties文件和project.properties文件以及custom_rules.xml文件,插件使用宿主程序共享库,以及共享库R引用,和编译时排除的功能,都在这3个配置文件中体现 暂不支持的功能: 1、暂不支持使用插件中自定义主题, 2、支持在插件中通过R文件使用宿主程序中的资源,暂不支持插件资源文件中直接使用宿主程序中的资源。但是支持间接使用。 例如在上述“已支持的功能”6中描述的,实际就是间接使用。 后续需要解决的问题: 1、使支持插件自定义主题 2、使插件中对activity的支持更稳定。 由于此框架没有实际的项目应用,目前对activity的提供标准API的测试还不够完全,可能在其他开发场景中,activity的部分标准API可能会出现问题。毕竟这里使用了很多反射,会涉及到多机型多系统版本的兼容问题。后续还需要持续测试和完善 上述第2点问题已解决、请看已支持的功能第3条。 3、使支持插件资源文件中直接引用依赖库中的资源。目测可能需要重写android自带的aapt程序。 实现原理简介: 1、插件apk的class 通过构造插件apk的Dexclassloader来加载插件apk中的类。DexClassLoader的parent设置为宿主程序的classloader,即可将主程序和插件程序的class贯通 2、插件apk的资源 通过构造插件apk的AssetManager和Resouce类即可。 本项目最关键一点功能、也是和网上其他插件项目不同的地方之一,在于 通过addAssetsPath方法添加资源的时候,同时添加了插件程序的资源文件和宿主程序的资源。这样就 可以做到插件资源合并。很多资源文件都迎刃而解。 3、插件apk中的资源id 完成上述第二点以后,还有需要解决的难题,是宿主程序资源id和插件程序id重复的问题。 这个问题解决办法也很简单 我们知道,资源id是在编译时生成的,其生成的规则是0xPPTTNNNN PP段,是用来标记apk的,默认情况下系统资源PP是01,应用程序的PP是07 TT段,是用来标记资源类型的,比如图标、布局等,相同的类型TT值相同,但是同一个TT值不代表同一种资源,例如这次编译的时候可能使用03作为layout的TT,那下次编译的时候可能会使用06作为TT的值,具体使用那个值,实际上和当前APP使用的资源类型的个数是相关联的。 NNNN则是某种资源类型的资源id,默认从1开始,依次累加。 那么我们要解决资源id问题,就可从TT的值开始入手,只要将每次编译时的TT值固定,即可是资源id达到分组的效果,从而避免重复。 例如将宿主程序的layout资源的TT固定为03,将插件程序资源的layout的TT值固定为23,即可解决资源id重复的问题了。 固定资源idTT值的版本也非常简单,提供一份public.xml,在public.xml中指定什么资源类型以什么TT值开头即可。 具体public.xml如何编写,可参考PluginMain/res/values/public.xml 以及 PluginTest/res/values/public.xml俩个文件,它们是分别用来固定宿主程序和插件程序资源id的范围的。 4、插件apk的Context 构造一个Context即可,具体的Context实现请参考PluginCore/src/com/plugin/core/PluginContextTheme.java 关键是要重写几个获取资源、主题的方法,以及重写getClassLoader方法 5、插件中的LayoutInfalter 通过第4步构造出来的Context获取LayoutInfater即可 6、如何实现插件代码不依赖任何特殊代码,如继承特定的基类、接口等。 要做到这一点,最主要的是实现上述第4步,构造出插件的Context后,所有问题都可以得到解决。 7、插件中Activity无需注册,拥有完整生命周期是如何实现的。 众所周知、Activity是系统组件,必须在manifest中注册才能被系统唤起并拥有完整生命周期,通过Activity代理和放射的方式实现的 实际是伪生命周期。并非完整生命周期。那么如果才能实现activity免注册,而且拥有完整的生命周期呢,这要从activity的启动流程中 入手。 App安装时,系统会扫描app的Manifest并缓存到一个xml中,activity启动时,系统会现在查找缓存的xml,如果查到了,再通过classLoad去load这个class,并构造一个activity实例。那么我们只需要将classload加载这个class的时候做一个简单的映射,让系统以为加载的是A class,而实际上加载的是B class,达到挂羊头买狗肉的效果,即可将预注册的Aclass替换为未注册的activity,从而实现插件中的Activity 完全被系统接管,而拥有完整生命周期。 在PluginMain和PluginTest已经添加了这种实现方式的测试实例。 8、通过activity代理方式实现加载插件中的activity是如何实现的 要实现这一点,同样是基于上述第4点,构造出插件的Context后,通过attachBaseContext的方式,替换代理Activiyt的context即可。 另外还需要在获得插件Activity对象后,通过反射给Activity的attach()方法中attach的成员变量赋值。 这样可解决另外一个插件框架作者singwhatiwanna实现的代码中所谓this和that的问题。也是可以使插件Activity不需要继承任何特定基类或者接口的原因。 9、activity代理实现后,其他组件,如service等,如法炮制即可。 10、插件编译问题。 如果插件和宿主共享依赖库,那边编译插件的时候不可将共享库编译到插件当中,包括共享库的代码以及R文件,但是需要在编译时添加到classpath中,且插件中如果要使用共享依赖库中的资源,需要使用共享库的R文件来进行引用。这几点在PluginTest示例工程中有体现。 11、插件开发模式 插件UI可通过fragment或者activity来实现 如果是activity实现的插件,则最终会在PluginProxyActivity中运行 如果是fragment实现的插件,又分为两种 1种是fragment运行在任意支持fragment的activity中,这种方式,在开发fragment的时候,fragmeng中凡是要使用context的地方,都需要使用通过PluginLoader.getPluginContext()获取的context,那么这种fragment对其运行容器没有特殊要求 还有1种是,fragment运行在PluginCore提供的PluginSpecDisplayer中,这种方式,由于其运行容器PluginSpecDisplayer的Context已经被PluginLoader.getPluginContext获取的context替换,因此这种fragment的代码和普通非插件开发时开发的fragment的代码没有任何区别。 需要注意的问题 项目插件开发后,特别需要注意的是宿主程序混淆问题。宿主程序混淆后,可能会导致插件程序运行时出现classnotfound 标签:Android
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值