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地址需要携带,有的不要携带,不然无法上传到仓库的,需要检查。