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

这个说起来好处理,可是也有几点要注意:

  1. 首要对manifest里带intent-filter的组件增加exported特点,各个module都要查看一遍。也能够直接分析aab包的manifest查看缺失的,经过Android Studio的东西Build -> analyze apk,看看aab里边的manifest,哪个缺了再回到源码里边改,这样不容易漏。

  2. 还有个问题便是第三方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加固,也就弄了下,可是不加固也不是不行,当然有安全考虑仍是加固下最好。

运用审核

打包上传什么的都是简单的。。。审核后会出许多问题,然后就得去适配,下面罗列下我碰到的退回邮件:

  1. TBS SDK(X5内核),下载可执行代码。
  2. AliPay、极光推送,不符合显着发表准则传输已装置运用程序信息的调集
  3. SSL Error处理不妥
  4. 微博、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!