华为认领应用

我们有一款应用由于对推送到达率要求较高,由于在华为部分机型上面,杀死进程后熄屏后三方推送很难送达信息,所以我们被要求集成华为推送.在华为开发者联盟的管理中心当中,创建应用的时候被提醒包名重复 该APK包包名'xxx'与在架应用包名相同,该APK包将不能被上传
应用包名重复提醒

原因是因为我们的APP被产品在360市场上线了一个版本,由于各大应用市场之间都会相互之间进行抓包,导致我们的APP被华为应用市场也拿到了,需要进行应用认领.

点击应用认领之后,会发现需要我们下载一个空白包,我们这下载的名叫HWHS.apk,然后让我们对该空白包利用给被重复的包打包的Keystore 或者 jks 进行签名,然后上传给华为,由于华为他们的这个文档以及命令参数的注释不是很全面,并且有些参数都写错了,故在此记录一下.
下载空白包

命令格式:jarsigner -verbose -keystore[keystorePath] -signedjar [apkOut][apkIn][alias]

示例:jarsigner -verbose -keystore E:\yunanda\app\yunanda.jks -signedjar D:\Personal\Desktop\HWNS_Signed.apk D:\Personal\Desktop\HWNS.apk yunanda

-verbose 输出详细信息,记录输出签名后的信息成功与否
-keystore[keystorePath] APK签名的密钥在本地存放的具体路径
[apkOut] 签名后的空白包的存放具体位置
[apkIn] 签名前的空白包的存放具体位置
[alias] APK签名的密钥的别名

成功签名

成功之后将打包后的空白包上传就好,然后等华为认领通知

注意事项

  • 这里的[alias]要注意一下,是当初自己项目创建用于生成签名包的签名文件的Alias. 创建签名钥

  • 我们一般置于app的Module的build.gradle创建签名钥

  • 输入签名密码时候,命令行上面是没有任何反应的,输入完成后按下回车即可输入密钥密码

Android打包上线自检流程

1.混淆检查

1.1 项目混淆配置是否开启

在App所在Module的build.gradle文件中,如下图所示的minifyEnabled 开关,因此如果需要混淆代码,需将false改为true,然后在文件proguard-rules.pro添加具体混淆规则。
混淆配置

由于如果不开启混淆的话,APP很容易被反编译,影响安全

1.2 ProGuard.cfg文件检查

主要重点检查以下几个点是否被保留(-keep),不然release包会因为找不到具体的类或方法各种报错

1.2.1 实体类及其成员

实体类由于涉及到与服务端的交互,各种gson的交互如此等等,是要保留的.为了方便,我们只需要-keep 所有实体类所在的package就可以(这需要我们平时写代码时候需要将实体类都放在统一的包下面),如:

1
-keep class me.game.mvparms.m5173.mvp.model.entity** {*;}

1.2.2 内部类

内部类如果不注意很容易被混淆,这会导致调用的时候会找不到该类引起空指针异常.还可以直接在使用过的类中全部保留,比如说MainActivity使用了,那么:

1
2
3
-keepclasseswithmembers class me.game.mvparms.m5173.mvp.ui.activity.MainActivity$* {
*;
}

1.2.3 三方包

一般的三方框架或者模组都会在其官方的接入文档当中告知如何加入混淆,只需复制粘贴就好了,注意下是否存在重复.如接入的汇付支付:

1
2
3
4
5
#---- 汇付支付 start----#
-libraryjars libs/HeepayPlugin_v3.0.jar
-dontwarn com.heepay.plugin.**
-keep class com.heepay.plugin.** { *; }
#---- 汇付支付 end----#

1.2.4 WebView

如果项目中用到了WebView的复杂操作,需要加入以下代码

1
2
3
4
5
6
7
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String);
}

1.2.5 JavaScript

与js互调的类,一般做如下的处理

1
-keep class 你的类所在的包.** { *; }

如果是内部类的话

1
-keepclasseswithmembers class 你的类所在的包.父类$子类 { <methods>; }

1.2.6 反射相关

与反射相关的类,一般做如下处理

1
-keep class 你的类所在的包.** { *; }

3.检查项目是否可以上线

3.1 检查项目的项目环境

3.1.1 将URL切至线上环境

对于主站App,配置在DefaultConstant类中,将URL切至线上环境"http://routeapi.5173.com"

3.1.2 将项目类部分接口配置切至线上环境

上线前请确认本次更新中的各个模块的项目开发人员,是否存在线下配置和线上配置,需要在上线前进行切换

例如在主站App的手游项目,手游商品列表页GoodsListOfMobileGameActivity类中的mBizOfferTypeId字段,需切换至DefaultConstant.CATE_ID_MOBILE_ONLINE_GAME线上版本

3.2 清除开发测试代码

检查并且清除或注释掉新版本的各个模块当中是否存在测试代码,例如System.out.print()或者Log.i()等日志记录代码,以防上线版本的App将内部的日志暴露出去

3.3 检查是否友盟埋点

各个新模块开发人员或者负责友盟埋点的人员注意一下是否已经加入友盟埋点,并且检查一下友盟统计后台对于新增埋点是否做了配置
友盟埋点后台配置

4.版本号更改

AndroidManifest中的android:versionCode改为当前日期加00的形式2017090700
AndroidManifest中的android:versionName改为上线的版本号,如2.6.1

由于5173主站版本的手游端游的列表配置是根据versionCode的大小来动态更新的,所以新版本上线务必更新versionCode为上线当天日期+00的格式

5.Git新建改版本分支

上述检查确认无误之后并且确认无问题无新需求之后,在git上面新建一个当前版本号的分支,使用release/前缀,并将最新代码提交上去,此次更新的日志描述写在提交分支的消息上,以便以后检查维护
release/2.6.0.

6.打包

上述流程确认无误后可以进行打包分发工作了