1. 代码混淆
2. menifest与第三方包中的menifest内容重复问题,
在当前manifest中加入tools:node=”replace”就会替代三方包里面的内容,从而避免重复问题
<provider
android:name="cn.jpush.android.service.DataProvider"
android:authorities="com.heyikeji.huifengshou.DataProvider"
android:exported="false"
tools:node="replace"
/>
3. dex相关配置说明
dexOptions {
jumboMode true //Jumbo模式,大体积模式,尽量每一个dex的体积都达到最大,避免分出过多的dex
incremental true //开启增量更新,加快编译速度
javaMaxHeapSize "4g" //java最大堆内存4g,正常比较小,速度可能会慢
}
4.gradle配置debug release信息以及多渠道打包
要达到的目的:
1.正式环境与测试环境的域名不同,所以需要配置不同的域名
2.比如用极光im,正式环境和测试环境肯定不能用同一套,否则乱套了
3.manifest里面需要根据不同环境有些不同的标识
4.logutil是否打开需要根据是否是debug版本
5.如果有地图,有时也是需要区分测试版和正式版的,也要配置不同的信息
6.多渠道信息,每个渠道都不同
基于这么多问题,如果每次要打测试包和正式包都手动去改,那就要烦死了,而且这么多东西出错的几率很大,下面就是解决这些问题
1.配置签名
首先在gradle的android标签下面,配置签名信息,因为地图,微信等第三方平台动不动就要配置签名信息,如果用默认签名,多人开发必然是不行的,每个电脑生成的签名都不同,第三方调用必然失败,所以要配置签名
这里的签名配置是测试包的签名,正式包的签名是在打包的时候自己选择路径,然后输入对应的密码即可
signingConfigs {
config {
keyAlias 'huizhongdi'
keyPassword 'huizhongdi'
storeFile file('../sign.jks')
storePassword 'huizhongdi'
}
}
2.配置buildTypes
要在签名配置之后,因为这里面需要签名信息
这个配置也在android标签下面
buildTypes {
release { //正式版需要的配置
minifyEnabled false
manifestPlaceholders = [
"APP_NAME" : "正式包",
"JPUSH_PKGNAME": "com.xxx.xxx",
"JPUSH_APPKEY" : "48045b9c66b7a433353bccc",
"MAP_KEY" : "d786a384e24b0a03467990ae1c9703",
]
buildConfigField 'String', 'URL', '"http://huou.heklji.com/"'
}
debug {
//这种字段是可以在代码中获取的
buildConfigField 'String', 'URL', '"http://hfstest.api.heyi-keji.com/"'
applicationIdSuffix "test"
manifestPlaceholders = [
"APP_NAME" : "测试版",
"JPUSH_PKGNAME": "com.xxx.xxx.test",
"JPUSH_APPKEY" : "63bafac1539087f213",
]
signingConfig signingConfigs.config
}
}
上面就是配置构建类型,两种,一种是release正式版,另一种就是debug,测试版
下面就里面关键代码分析讲解:
manifestPlaceholders就是在manifest里面可以引用的构建变体,引用方法就是${APP_NAME}这样的形式,这里主要不讲这个,不懂得查查吧
applicationIdSuffix "test" 这个比较关键,设置包名的后缀,如果正式包名为com.aaa.bbb,那么在debug标签下配置这个之后,打出的测试包名为com.aaa.bbb.test
buildConfigField 'String', 'URL', '"http://hfstest.api.heyii.com/"' 这个也是比较有用的配置,manifestPlaceholders配置的变量只有在manifest里面才能用,而这样配置的变量是可以在代码中使用的,BuildConfig.URl即可获取当这里配置的值,这里第一个参数是变量类型,第二个参数是变量名(应用时通过这个引用),第三个参数是变量值(需要注意的是变量值外面还有一个单引号,一定不要忘记写了),变量类型支持三种Sting,int,boolean,这个配置在URL.java文件中有大用处,后面会说到
3.配置多渠道信息
渠道信息只是针对正式包的,因为测试包你带不带渠道信息无所谓的,反正自己内部测试,只有在打正式包的时候才会需要你选择渠道的
productFlavors {
xiaomi {}
qh360 {}
baidu {}
wandoujia {}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CHANNEL: name]
}
}
如上,配置了四个渠道,最后定义了一个manifestPlaceholders,名字是CHANNEL,这个是用在manifest中的,如果用友盟统计,他会要求你在manifest中配置如下节点
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL}"/>
每次打正式包时如果你选择多渠道打包,那么这个manifest就会打入之前配置的渠道信息
4.URL.java文件中配置
URL.java文件是我的记录所有的网络访问链接的文件,其中有一个static String ROOT_URL是记录根域名的,那么我这里就可以这样写:
public static String ROOT_URL = BuildConfig.URL;
因为在buildTypes中的debug和release配置中都配置了URL这个变量,而且正式包和测试包的这个变量是不同的,那么在构建阶段就会生成BuildConfig.java文件,我们在代码中就可以直接使用了,以后正式包他就会自动用正式域名,测试包就会自动使用测试域名,免去了配置的烦恼
5.其他配置
manifest中需要引用gradle中配置的manifestPlaceholders变量的地方直接用${}的形式使用,主要是百度地图,微信,机关,等的一些配置信息,这里不赘述了,比较简单
logutil中配置:logutil一般是自己写的,有一个总开关控制是否要打印日志,我们的策略是正式版不打log,测试版打log方便调试,那么这里面有一个开关变量 SWITCH,我们可以这样定义
private static bool SWITCH=BuildConfig.DEGUG;
DEGUG这个变量我们没有用buildConfigField的方式定义,为什么也可以用代码调用?其实gradle在构建是自动生成的,还有版本信息,包名也会自动生成,我们也都可以直接使用
经过上述一句代码,我就就可以达到debug包打印日志,release包不打印日志
6.打包
好了已经走到最后一步了
菜单中build->generate signed apk->
填写对应的签名信息,以及签名的路径
最后一步选择buildtype当然打正式包就选release,测试版就debug,选择flavours,也就是渠道,你要几个就选几个,然后finish,等一会就回给你生成多个渠道的apk,直接拿来用吧
你会惊奇的发现,log,域名,包括第三方需要的一些数据,自动区分测试版和正式版,以后再也不用烦了,要测试的给你测试的,要正式的随便你要什么渠道的2-3分钟统统搞定
5.安卓录音问题aac格式比mp3格式更加普遍
遇到一个奇葩问题,安卓录的音微信小程序播放错误,总是报1004 unknown format
其实这个录音文件本身是没啥问题的,几乎所有的播放软件和设备都可以播放,但是在小程序中就不能识别这个格式,于是我录音直接拖到浏览器中,奇怪的是微信录的音拖进去是可以直接播放的,我录的音拖进去确不能直接播放,说明这个格式确实是经过处理,一般的播放器软件肯定提供了更加强大的解码器,能识别,而浏览器本身主要任务不是做播放器使用的,里面解码器肯定不完善,只能解码最普遍的格式,微信作为一个小程序的承载容器,不支持解码,…..好吧,比较无语,但是问题总是需要解决的
看看自己的录音代码如下:
this.mMediaRecorder.setAudioSamplingRate(8000);//采样率8000
this.mMediaRecorder.setAudioEncodingBitRate(16000);//编码率
this.mMediaRecorder.setAudioChannels(1);
this.mMediaRecorder.setAudioSource(1);
this.mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
this.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
this.mAudioPath = Uri.fromFile(new File(SAVE_PATH, System.currentTimeMillis() + "temp.voice"));
this.mMediaRecorder.setOutputFile(this.mAudioPath.getPath());
this.mMediaRecorder.prepare();
this.mMediaRecorder.start();
然后我把
this.mMediaRecorder.setAudioEncodingBitRate(16000); 这行代码去掉了
this.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);改成了this.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
然后可以了,同时吧setAudioEncodingBitRate去掉也没问题,安卓default默认的编码格式是mp3,而aac是更加普遍的大家都认可的编码方式,音质也能更好地保证,改了之后就可以啦.
6.时间转换问题
https://www.cnblogs.com/suruozhong/p/6085380.html?utm_source=itdadao&utm_medium=referral