Android SDK研发解决方案宝典

news2024/11/24 19:37:18

Android SDK研发很难整,非常烧脑,与app研发有很多不同。
遇到的问题有很多,各种崩溃,各种空指针,各种冲突需要解决。
所以开发前一定要提前规划好,做好规范。我把我这边一些问题做了记录和分享。
问题1:
Caused by: android.view.InflateException: Binary XML file line #47 in cn.qianlan.my11111:layout/fragment_option_deposit: Error inflating class <unknown> Caused by: java.lang.reflect.InvocationTargetException
解决方向:
1,layout中涉及到?attr/bg_color等该种引用主题的方式引起。
2,style="@style/wrap_style"方式也有可能影响
3,还有就是在activity中setTheme(R.style.OptionAppTheme);与宿主app冲突。
去掉关于主题一切引用,和主题的设置。
sdk不能进行黑白主题切换,会对宿主app有影响。

问题2:context.getPackeName的时候报空指针
解决方向:最好使用application的上下文去取,而不是getContext

问题3:资源问题
sdk资源名与宿主app资源名称重复了,导致优先会去拿宿主app的资源名称,导致显示不对。即使配置gradle的资源前缀也不好使。比如color等。最好是在资源前面加前缀。做好sdk开发规范。
如:java.lang.RuntimeException: Unable to start activity ComponentInfo{io.transi.im.wallet/cn.xm.optionsdk.view.HomeActivity}: java.lang.NullPointerException:Attempt to invoke virtual method 'void com.flyco.tablayout.CommonTabLayout.setTabData(java.util.ArrayList)' on a null object reference
就是资源问题,使用了他们同名的资源。

问题4:那就三方库的冲突问题。
解决方法:
1,扒源码,直接去github拿源码是不错的方式,可以避免很多问题。
2,使用插件,将源码打成包,打到SDK中去。但是宿主app如果有引用相同的包,依然会冲突。

classpath 'com.github.kezong:fat-aar:1.3.8' //工程gradle引入

apply plugin: 'com.kezong.fat-aar'//moudle的gradle引入插件
//图片加载,打包前
embed 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

3,那就是如果宿主app有相同的三方库,那就同步版本号,只要版本号同步,sdk也可以使用。如果版本号无法同步,那就让宿主app引入三方库。

问题5:混淆问题
解决方向:要注意,要对外暴露接口和类方法是不能进行混淆的,对方会找不到。

问题6:定制接口的问题
解决方向:接口问题最好是有很好的规范和协商,一切从简。

问题7:有的三方库需要V4或V7包
解决方向:在gradle.properties中引入android.enableJetifier=true即可支持v4或v7

问题8:打包问题
解决方向:
一般打成aar的包,只要如图
在这里插入图片描述
但是最好的还是要去上传到maven,这样别人也方便去使用
maven仓库最好是找个找后端的开发大佬去要一个,自己搭建很麻烦。
比如给了一个地址:

NEXUS_REPOSITORY_URL=http://XXXXXXXXXXXXXX

建一个叫aar_upload.gradle的文件放到工程目录上内容如下,可以直接复制去使用:

apply plugin: 'maven'
def getRepositoryUserName() {
    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}
def getRepositoryPassword() {
    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: NEXUS_REPOSITORY_URL) {
                authentication(userName: getRepositoryUserName(), password: getRepositoryPassword())
            }
            pom.project {
                name POM_NAME
                version POM_VERSION
                artifactId  POM_ARTIFACTID
                groupId  POM_GROUPID
                packaging  POM_PACKAGING
                description  POM_DESCRIPTION

                scm {
                    url POM_SCM_URL
                    connection POM_SCM_CONNECTION
                    developerConnection POM_SCM_DEV_CONNECTION
                }
                licenses {
                    license {
                        name POM_LICENCE_NAME
                        url POM_LICENCE_URL
                        distribution POM_LICENCE_DIST
                    }
                }
                developers {
                    developer {
                        id POM_DEVELOPER_ID
                        name POM_DEVELOPER_NAME
                    }
                }
            }
        }
    }
}

然后在需要打包的moudle中的gradle.properties添加如下配置:

#??maven??
POM_NAME=optsdk
POM_VERSION=1.0.51-SNAPSHOT
POM_ARTIFACTID=option
POM_GROUPID=cn.aa.optsdk
POM_PACKAGING=aar
POM_DESCRIPTION=optionsdk_lib_one
#licence??
POM_LICENCE_NAME=The Apache License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
#???
POM_SCM_URL=https://github.com/
POM_SCM_CONNECTION=""
POM_SCM_DEV_CONNECTION=""
#?????
POM_DEVELOPER_ID=sf
POM_DEVELOPER_NAME=shenfei
#??? maven仓的用户 密码 以及 maven地址
NEXUS_USERNAME=admin    
NEXUS_PASSWORD=admin123
NEXUS_REPOSITORY_URL=http://XXXXXXXXXX/

使用方式:工程gradle的repositories 下添加

repositories {
maven {
            allowInsecureProtocol(true)
            url 'http://XXXXXXXX'
        }
        }

然后再gradle中引入

api 'cn.aa.optsdk:option:1.0.51-SNAPSHOT' 

注意点:要携带SNAPSHOT标志,有兴趣的可以google查一查。
有点maven地址需要携带,有的不要携带,不然无法上传到仓库的,需要检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/558807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

获取订单API接口系列,可接入erp系统场景

抖音和拼多多是目前国内最为火爆的社交和电商平台&#xff0c;为了让更多的开发者能够轻松利用其庞大的用户基础和活跃度&#xff0c;我们提供了相关的订单接口&#xff0c;可帮助开发者快速便捷地完成订单的创建、查询、调整等操作&#xff0c;从而更好地促进业务的发展。以下…

React项目搭建

一、项目搭建&#xff08;不采用vite方式&#xff09; 使用create-react-app生成项目 npx create-react-app pc 进入根目录 cd pc 启动项目 npm start 调整项目目录结构 /src/assets 项目资源文件&#xff0c;比如&#xff0c;图片 等/components 通用组件/pag…

分布式事务解决方案探讨

分布式事务解决方案 一、什么是事务&#xff1f;二、什么是分布式事务&#xff1f;三、分布式事务的理论模型3.1 X/Open 分布式事务模型3.1.1 X/Open事务执行流程3.1.2 XA 协议 3.2 两阶段提交协议3.3 三阶段提交协议 四、分布式事务场景解决方案4.1 TCC补偿方案4.2 基于可靠性…

密码学基本原理和发展——近代密码学

目录 1 密码机通信模型 2 Enigma密码机构造 3 Enigma密码机加解密过程 3.1 加密过程 3.2 解密过程 4 Enigma密码机的安全性 5 Enigma密码机破解 5.1 波兰雷耶夫斯基破解 5.2 图灵破解 近代密码一般指20世纪初&#xff5e;20世纪70年代期间的密码技术。20世纪初电报的出…

快速上手项目1:基于FaceNet的人脸识别项目

快速上手项目1&#xff1a;基于FaceNet的人脸识别项目 说明 ​ 本来想自己复现一下facenet的&#xff0c;但是发现facenet已经被做成了python的第三方库&#xff0c;于是自己用了用&#xff0c;发现挺简单的&#xff0c;然后又看了看源码&#xff0c;感觉模型架构实现部分很简单…

说说 HWND_TOP 和 HWND_TOPMOST 的区别

初看上去&#xff0c;HWND_TOP 和 HWND_TOPMOST 有点类似&#xff0c;但是实际上在调用 DeferWindowPos 或者 SetWindowPos时&#xff0c;它们之间的差别还挺大。 在同级窗口的维护机制中&#xff0c;有一个概念叫做 Z 序 (Z-order) 。出于此讨论的目的&#xff0c;顶级窗口也…

音容笑貌,两臻佳妙,人工智能AI换脸(deepfake)技术复刻《卡萨布兰卡》名场面(Python3.10)

影史经典《卡萨布兰卡》是大家耳熟能详的传世名作&#xff0c;那一首壮怀激烈&#xff0c;激奋昂扬的马赛曲&#xff0c;应当是通片最为激动人心的经典桥段了&#xff0c;本次我们基于faceswap和so-vits库让AI川普复刻美国演员保罗亨雷德高唱《马赛曲》的名场面。 配置人脸替换…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 8 Advertising on the Web

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 8 Advertising on the Web There are several factors that must be considered in evaluating ads: The position of the ad in a list has great influence on whether or not it is clicked.…

Linkage Mapper 之 Barrier Mapper 功能解析(含实际案例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 大草原松鸡"(Greater Sage Grouse)的Lek Kernals(即HCAs),以及连接、连接障碍和恢复机会效果图: 图片

python+Django音乐播放器网站系统0tr3w

音乐网站系统的后台开发目标是以信息管理系统的管理和开发方法&#xff0c;用目前现有的新技术进行系统开发&#xff0c;提供后台管理员高度友好的界面操作以及迅捷的信息处理。而前台的开发目标是以用户的需求作为主导&#xff0c;提供对用户而言非常友好的界面操作环境以及完…

实时频谱-1.1基本概念

RF信号 RF&#xff08;射频&#xff09;是Radio Frequency的缩写&#xff0c;表示可以辐射到空间的电磁频率&#xff0c;频率范围从300KHz&#xff5e;30GHz之间。 中频 IF(intermediate frequency)&#xff0c;用来在中频衡量AM或FM调谐器抑制外来干扰的能力&#xff0c;数…

基于springboot在线外卖系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;…

You Only Look Once: 革命性目标检测算法论文解析

You Only Look Once 全论文完整翻译 You Only Look Once: Unified, Real-Time Object Detection 摘要 我们介绍了一种名为YOLO的新型目标检测方法。在目标检测的先前工作中&#xff0c;人们将分类器重新应用于执行检测任务。相反&#xff0c;我们将目标检测视为一个回归问题&a…

ChatGPT 的议论文究竟写的怎么样?111 位高中教师告诉你答案

夕小瑶科技说 原创 作者 | 小戏、Python 在 OpenAI GPT-4 发布时发布的《GPT-4 Technical Report》中&#xff0c;其中很吸引人眼球的一部分是 GPT-4 应用于教育领域的出色表现&#xff0c;通过让 GPT-4 去完成美国的 AP 课程及考试&#xff0c;来评估 GPT-4 在多个学科中的性…

WIN提权补丁提权,at,sc,psexes提权

win提权分为web和本地提权 web提权就是getshell后&#xff0c;权限是网站权限&#xff0c;要进行提权 本地提权是本地用户进行提权 本地用户的权限大于网站权限&#xff0c;所以本地提权成功概率比web提权概率大 因为我们做渗透测试&#xff0c;一般都是从网站入侵。所以大…

OpenAI最新iOS版ChatGPT下载使用手册:三步快速下载,支持语音输入和历史聊天记录重新对话(免费、比网页端响应快、亲测可用)

目录 前言ChatGPT移动端与网页端相比的优势步骤一&#xff1a;注册美区Apple id账号步骤二&#xff1a;苹果手机切换appstore id步骤三&#xff1a;下载ChatGPT IOS移动版APP畅玩ChatGPT APP体验总结其它资料下载 &#xff01; 前言 北京时间5月19日凌晨&#xff0c;OpenAI重…

散点图(Scatter Plot)

目录 1、散点图 2、随机数据分布 1、散点图 散点图是数据集中的每个值都由点表示的图 Matplotlib 模块有一种绘制散点图的方法&#xff0c;它需要两个长度相同的数组&#xff0c;一个数组用于 x 轴的值&#xff0c;另一个数组用于 y 轴的值 x [5,7,8,7,2,17,2,9,4,11,12,9…

2023最新网络安全面试题大全

2023年快过去一半了&#xff0c;不知道小伙伴们有没有找到自己心仪的工作呀【doge】&#xff0c;本文总结了常见的安全岗位面试题&#xff0c;方便各位复习。祝各位事业顺利&#xff0c;财运亨通。在网络安全的道路上越走越远&#xff01; 所有的资料都整理成了PDF&#xff0c…

Netty实战(七)

EventLoop和线程模型 一、什么是线程模型二、EventLoop 接口2.14 Netty 4 中的 I/O 和事件处理 三、任务调度3.1 JDK 的任务调度 API3.2 使用 EventLoop 调度任务 四、实现细节4.1 线程管理4.2 EventLoop/线程的分配4.2.1 异步传输4.2.2 &#xff0e;阻塞传输 一、什么是线程模…

Java基础学习---3、堆、GC

1、堆 1.1 概述 1.1.1 堆空间结构 1.1.2 堆空间工作机制 新创建的对象会放在Eden区当Eden区中已使用的空间达到一定比例&#xff0c;会触发Minor GC每一次在Minor GC中没有被清理掉的对象就成了幸存者。幸存者对象会被转移到幸存者区幸存者区分成from区和to区from区快满的时…