Google Play上架小结
前言
最近我担任的APP总算上架Google成功了,总算有时间来做一次完好的上架小结了!有些内容是之前写的,现在聚合一下,期望对读者有帮助!
注册Google开发者账号
Google账号我是QQ邮箱注册的,现在不知道行不行了,Google开发者账号是还要花25美金的,需求预备一张visa的卡,我用的之前公司的商务卡,弄成功了。进入下面页面,按着要求填就行,没有必要造假,后边还要身份证信息,感觉有点坑,仍是弄了。
play.google.com/console/sig…
这些网上也许多教程,我就不多写了。
打包AAB包
打包能够用Android Studio内部生成bundle来生成AAB包,也能够运用命令,在根目录执行命令:
./gradlew bundle
# AAB位置:
# platforms/android/app/build/outputs/bundle/release
AAB包自测
这儿要下个解包东西,地址如下:
github.com/google/bund…
运用办法:
生成json文件:java -jar bundletool-all-1.8.0.jar get-device-spec --output=./device-spec.json
生成apks文件:java -jar bundletool-all-1.13.1.jar build-apks --bundle=./android.aab --output=./android.apks --overwrite --ks=xxx --ks-pass=pass:xxx --ks-key-alias=xxx --key-pass=pass:xxx --device-spec=./device-spec.json
装置apks文件:java -jar bundletool-all-1.13.1.jar install-apks --apks=./android.apks
密钥的装备自己改一下,注意下jar包的版别号,apks里边实际便是有好多个apk。
Google上架
有了开发者账号,创立一个运用,点进去管理,在信息中心里边第二步会让设置运用,按那个列表设置就行了。有问题随便搜下也能处理。
上传AAB包
在发布测验版别里边能够提交AAB包,这儿卡了我挺久,大致便是下面几个问题。
AAB包过大
这儿Google要求AAB包巨细是150M,可是并不是AAB包的巨细,看了下网上说的应该是把包解压出来里边base文件的巨细,这个不超越150就行了(我这儿便是包比150大,里边没超越150,经过了)。要是包大了,处理下,很奇怪的是我装备的gradle分包,对于AAB不收效,打包APK的时分倒是能够。
android {
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a' //select ABIs to build APKs for
universalApk false //generate an additional APK that contains all the ABIs
}
}
}
密钥强度太低
巨细约束没问题,我这上传发现提示了下面问题:
您的 android app bundle 所运用的上传证书的密钥强度太低。
直接网上搜处理办法,有的说密钥位数太低的,有的说没签名的,最终我发现我的问题便是密钥强度太低,重新生成一个密钥,暗码加上字母、数字、符号、巨细写,再上传就能够了。
这儿还有人引荐了一个签名的东西,我也附带提一下,可能有的人是这儿的问题:
# 下载fair-guard东西:https://www.fair-guard.com/help/list-228.html
# 修改config.ini装备,装备好密钥,上面东西里有文档
java -jar FairGuard3.6.3.jar -optype_sign_jar -inputfile ./android.aab
targetSdkVersion太低
改好了再上传,提示targetSdkVersion太低了,发现是Cordova在config.xml里边写了targetSdkVersion,虽然在gradle里边我已经改了,Cordova写到了manifest里边,仍是被查看出来了,改了config.xml再打包就行了。现在Google要求至少31,有点高了,估量还得适配下。
没有“android:exported”特点设置
果然设置targetSdkVersion为31后,出了适配问题:
# 您上传的 APK 或 Android App Bundle 内含活动、活动别号、服务或播送接收器,这些项目有 intent 过滤器,但没有“android:exported”特点设置。
# 此文件无法在 Android 12 或更高版别上装置。概况请参阅:developer.android.com/about/versions/12/behavior-changes-12#exported
这个说起来好处理,可是也有几点要注意:
-
首要对manifest里带intent-filter的组件增加exported特点,各个module都要查看一遍。也能够直接分析aab包的manifest查看缺失的,经过Android Studio的东西Build -> analyze apk,看看aab里边的manifest,哪个缺了再回到源码里边改,这样不容易漏。
-
还有个问题便是第三方SDK的manifest,aab里边的manifest缺失了exported特点,我们外面改不到SDK manifest,这儿能够在主工程的manifest复写一份,覆盖了就行,最终manifest会组成一份(replace特点也能够用起来)。
REQUEST_INSTALL_PACKAGES
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
Google play禁止了运用REQUEST_INSTALL_PACKAGES这个权限,如果真需求运用的话要自己额外供给材料进行说明。也便是说,运用内自己下载APK进行装置更新是完成不了了,只能乖乖去Google Play更新。处理这个问题的时分记住在manifest删除该权限,并关闭相关装置功用。
AAB加固
这个个人的话好像还挺费事,我找了几个看了下价格,直接劝退,好在公司有和做加密的公司协作,支持AAB加固,也就弄了下,可是不加固也不是不行,当然有安全考虑仍是加固下最好。
运用审核
打包上传什么的都是简单的。。。审核后会出许多问题,然后就得去适配,下面罗列下我碰到的退回邮件:
- TBS SDK(X5内核),下载可执行代码。
- AliPay、极光推送,不符合显着发表准则传输已装置运用程序信息的调集
- SSL Error处理不妥
- 微博、QQ共享SDK问题
总而言之,便是国内的好多第三方SDK都不能在Google运用,包括但不限于: TBS、bugly、微信付出&共享(Android版在一起)、QQ共享、微博共享、AliPay、友盟、极光(有专门的海外版)等。
所以要不就看看这些SDK有没有海外版,要不就能删了找代替计划了。
功用适配
上面提到了targetSdkVersion要提高到31,这就有许多问题了,下面说说我遇到的一些问题。
贮存适配
targetSdkVersion提高了,影响最大的便是贮存适配了,还好我这不是许多。办法便是尽量运用私有目录,重要的东西放到内部私有目录,缓存、文件较大的放到外部私有目录,能够经过FileProvider向外供给Uri(拍照、裁切之类)。
对于要运用公有目录的当地,尽量运用SAF框架和Media经过Uri去拜访,注意Android 9.0及以下要请求权限,9.0以上权限都不必请求,尽量避免运用File直接拜访。其实Uri也不是特别难用吧,拜访文件就像操作数据库相同。我也写了一点文章,可是感觉不怎么样,就不放出来了。
共享功用
由于微信、QQ、微博的共享SDK都用不了,所以只能用体系自带的共享去完成类似的功用,下面我也总结了一篇文章,能够参考下:
运用体系自带共享,共享到微信、朋友圈、微博、QQ,适配Android12
H5适配
我这上架的是要给混合开发的运用,好老了,用的仍是Cordova。由于X5内核不能用了,所以我们这边就只能用体系自带的webveiw了,真就头大了,各种不兼容问题,好在问题不是我处理,提一下。
SSL Error
这个问题主要是WebViewClient里边的onReceivedSslError办法写得不妥:
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// handler.cancel();
handler.proceed();
}
根据被拒邮件提示,大概意思是遇到SSL过错的时分需求提示用户,所以处理方式如下:
AlertDialog.Builder(context).apply {
val errorMsg = when (error?.primaryError) {
SslError.SSL_UNTRUSTED -> "The certificate authority is not trusted."
SslError.SSL_EXPIRED -> "The certificate has expired."
SslError.SSL_IDMISMATCH -> "The certificate Hostname mismatch."
SslError.SSL_NOTYETVALID -> "The certificate is not yet valid."
SslError.SSL_DATE_INVALID -> "The date of the certificate is invalid"
else -> "SSL Certificate error."
}
setMessage("$errorMsg Do you want to continue anyway?")
setPositiveButton("continue") { _, _ ->
handler?.proceed()
}
setNegativeButton("cancel") { _, _ ->
handler?.cancel()
}
}.create().show()
也是网上找的,能用就行。
小结
首要恭喜下自己,这个运用算是蒙混过关了(吐槽下Google的审核也是水),忧虑了好久由于隐私协议问题过不了。其次,其实我这app涉及的东西不多,像是推送、付出、统计什么的都没有,有的话就费事多了哦!最终,期望有需求的朋友,自己的运用也能顺畅上架Google!