安卓常用问题收集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31340657/article/details/79385648

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

猜你喜欢

转载自blog.csdn.net/qq_31340657/article/details/79385648