2019年11月工作整理

1101

AndrodStudio 生成签名文件的时候报下面的提示

在这里插入图片描述
需要将生成的jks文件迁移到行业标准格式PKCS12,这一步是可选的,可以忽略

keytool -importkeystore -srckeystore chat.jks -destkeystore chat.jks -deststoretype pkcs12

这个时候会在终端里报下名的错误提示
在这里插入图片描述

DerInputStream.getLength(): lengthTag=109, too big.

报错原因还没找到,如果有知道原因的大神麻烦告诉一下,多谢。

1104

AndroidStudio出现部分字母不显示的问题

今天早上打开As,发现项目中部分java代码部分不显示,如下图
在这里插入图片描述

解决办法:Invalidate Caches/Restart就好了。

1105

关于子模块的混淆处理

今天早上,打release包的时候,发现接口返回类型BaseRespone是null,debug发现这个类被混淆了。奇怪的是,这个类位于lib_base模块下,并且在该模块下,已经加入了proguard-rules.pro文件,也在build.grale里配置了,应该是没有起到效果。
查了资料,果然是使用姿势不对

总结如下:主模块的混淆开关配置会直接影响到子模块,也就是说如果你的主模块开启混淆,就算你的子模块关闭混淆开关,最终子模块还是会被混淆的的。

如果想要子模块不被混淆,或者说proguard-rules.pro起效果,那么子模块的混淆文件的指定要通过consumerProguardFiles这个属性指定,而不是proguardFiles,而且我们无需配置其他的选项,只需要配置consumerProguardFiles属性就可以。
在这里插入图片描述

1107

配置编译版本 官方文档解读记录

官方文档-配置编译版本

  • 当您在 Android Studio 中创建新项目时,applicationId 与您在设置期间选择的 Java 样式软件包名称完全一致。除此之外,应用 ID 和软件包名称没有任何关系。
  • 有些 Android API 会在其方法名称和参数名称中使用“package name”一词,但这实际上是您的应用 ID。并不是应用包名。
  • applicationIdSuffix:在默认的应用 ID 上追加一段
  • 如果你没有在build.gradle里设置applicationId,构建工具会将您在AndroidManifest.xml 文件中的软件包名称用作应用 ID
  • AndroidManifest.xml中的package属性中的名称应该始终与项目的基础机构匹配。
  • 拥有大量的 api 依赖项会显著增加编译时间
  • freeImplementation:只想为特定的编译变体源集或测试源集声明依赖项,则必须将配置名称的首字母大写,并在其前面加上编译变体或测试源集的名称作为前缀,例如,要将 implementation 依赖项仅添加到“free”产品特性(使用远程二进制文件依赖项),请使用如下所示的代码
dependencies {
    freeImplementation 'com.google.firebase:firebase-ads:9.8.0'
}
  • 不过,如果您想为将产品特性和版本类型组合在一起的变体添加依赖项,则必须在 configurations 代码块中初始化配置名称。以下示例将 runtimeOnly 依赖项添加到“freeDebug”编译变体(使用本地二进制文件依赖项)
configurations {
    // Initializes a placeholder for the freeDebugRuntimeOnly dependency
    // configuration.
    freeDebugRuntimeOnly {}
}

dependencies {
    freeDebugRuntimeOnly fileTree(dir: 'libs', include: ['*.jar'])
}
    

1108

合并多个清单文件

APK 文件只能包含一个 AndroidManifest.xml 文件,其他module下的最终都会合并一起。

合并优先级

合并工具会根据每个清单文件的优先级按顺序合并,将所有清单文件组合到一个文件中。是按照优先级从低到高的顺序,先将优先级最低的合并到优先级次低的清单中,一层层往上合并到优先级最高的清单中。
在这里插入图片描述

R8的优化

  • R8 会检查和重写代码,来减少DEX文件大小。比如 我们的if/else 如果else里没有做任何操作,R8会移除else{} 分支的代码。
  • 只有在与代码压缩相配合使用时,资源压缩才能发挥作用,因为只有代码压缩器移除所有未使用到的代码之后,资源压缩器才会完全知道哪些资源没有被使用。
  • 如果您的代码只在一个位置调用某个方法,R8 可能会移除该方法而将其内嵌在这一个调用点
  • 如果 R8 确定某个类只有一个唯一的子类且该类本身未实例化(例如,一个抽象基类仅由一个具体实现类使用),那么 R8 可以将这两个类组合在一起并从应用中移除一个类

自定义要保留的资源

我们可以在项目的资源中,例如,保存在 res/raw/keep.xml,创建一个带有 标记的 XML 文件,如keep.xml

<?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:tools="http://schemas.android.com/tools"
        tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
        tools:discard="@layout/unused2" />
  • tools:keep 表示需要保留的资源文件
  • tools:discard 表示需要舍弃的资源文件
  • 这两个属性都接受逗号分隔的资源名称列表。您可以将星号字符用作通配符

编译系统不会将此文件打包到 APK 中

我们为什么还要指定舍弃的文件呢?资源优化完全可以删除掉啊?为什么要多此一举呢?那是因为,我们如果使用了编译变体的话,这就很有用了。

我们项目中往往会利用代码动态应用一些资源文件,比如像这样

String name = String.format("img_%1d", angle + 1);
    res = getResources().getIdentifier(name, "drawable", getPackageName());

资源压缩器如何处理这样的资源呢?遇到这样的情况时,资源压缩器会采取防御式行为,将所有具有匹配名称格式的资源标记为可能已使用,无法移除。比如上面的,所有带img_前缀的资源文件都被标记已使用,无法移除。

这不扯蛋嘛,我其他不是通过动态引用的资源,但是又没有使用过的资源此不是无法删除了?

对于这样的情况,我们可以采用下面的处理方式:

  • 在 keep.xml 文件中将 shrinkMode 设为 strict,这样资源压缩器只保留其确定已使用的资源,不包含动态的资源。
<?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:tools="http://schemas.android.com/tools"
        tools:shrinkMode="strict" />
  • 然后在tools:keep里面手动加上代码动态引用的资源,来保留这些资源。

1112

  • 快应用是采用JavaScript语言开发的。
  • Flutter实现了一个自绘引擎
  • Flutter不支持动态下发代码

1113

CoordinatorLayout+RecyclerView,最后一项显示不全

在做触及主播排行榜的时候,出现最后一个item显示不全,或者不能滑动的情况,百度之后是CoordinatorLayout+RecyclerView组合使用出现的问题。(CollapsingToolbarLayout包裹RecyclerView)
解决方案:

  • 设置CoordinatorLayout的最小高度:android:minHeight="?actionBarSize” 可以直接设置
  • recyclerview高度设置为0dp
  • 并且recyclerview 里面app:layout_constraintBottom_toBottomOf=“parent”

1114

String resource id #0x0的

上架测试时,QQ登录失败,报上面的错误。

allowBackup

AndroidManifest 里面application节点的属性。allowBackup默认时true,当allowBackup设置为true时,是允许用户通过adb backp和adb restore进行备份和恢复数据的。存在一定的安全漏洞,正常需要设置为false

1118

android设置TextView中drawableTop图片大小

我们在为TextView利用drawableTop等属性添加图片的时候,经常会发现图片太大,如果我们固定TextView的宽高,这个时候图片就会被切掉,不能自适应,XML里没有属性可以控制,这个时候,我们只能利用代码来控制,如下:

Drawable drawableBoy=getResources().getDrawable(R.drawable.ic_boy);
drawableBoy.setBounds(0,0, (int) ScreenUtils.dp2px(mContext, 84),(int) ScreenUtils.dp2px(mContext, 84));
binding.tvBoy.setCompoundDrawables(null,drawableBoy,null,null);

1119

安卓SimpleDraweeView通过代码设置圆角

RoundingParams roundingParams = new RoundingParams();
roundingParams.setCornersRadius(20);//这里是设置你希望的圆角的值
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources());
GenericDraweeHierarchy hierarchy = builder.build();
GenericDraweeHierarchy hierarchy.setRoundingParams(roundingParams);
simpleDraweeView.setHierarchy(hierarchy);//一定要先设置Hierarchy,再去加载图片,否则会加载不出来图片
simpleDraweeView.setImageURI("http://ex55-public-test.oss-cn-hongkong.aliyuncs.com/sso/identification/20181214/0185c2de84b24b65abbfc8c35b92ed89.jpeg");//这里传入你的服务器提供的图片地址

1120

radiobutton

  • RadioButton 的文字颜色也可以使用选择器
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:color="@color/color_666666" android:state_checked="false"></item>
    <item android:color="@color/white"></item>

</selector>

1121

关于Fragment界面重叠的问题

当我们的app处于后台的时候,由于内存不够用,fragment所在的Activity被销毁,会调用onSaveInstanceState()方法,保存fragment,当再次回到app的时候,通过onCreate中的参数savedInstanceState恢复之前的fragment的时候,就会出现重叠。解决办法,MainActivity的onCreate里加上如下判断代码:

if (savedInstanceState != null) {
            Intent i = getBaseContext().getPackageManager()
                    .getLaunchIntentForPackage(getBaseContext().getPackageName());
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
            finish();
        }

流式布局

使用FlexboxLayoutManager来实现流式布局,使用方式

1122

RadioButton 没有联动的问题

项目中发现,当RadioGroup中包含两个RadioButton的时候,如果在XML中没有给radioButton设置id就会失去联动效果,就是点击另一个不会自动选择。设置了id就好了。

1125

Android Fresco 图片框架加载图片解决不能warp_content的问题

项目中想要实现宽度固定,高度自适应加载图片的时候,遇到SimpleDraweeView设置高度wrap_content无效果的问题,实际只有一条线。


Drawees 不支持 wrap_content 属性。所下载的图像可能和占位图尺寸不一致,如果设置出错图或者重试图的话,这些图的尺寸也可能和所下载的图尺寸不一致。如果大小不一致,假设使用的是 wrap_content,图像下载完之后,View将会重新layout,改变大小和位置。这将会导致界面跳跃。
解决方法:可以利用ControllerListener ,然后会在onFinalImageSet()方法里面返回一个ImageInfo的东东,这个就是一个图像信息的一个类(先比作这么一个类),这里面就 可以 拿到 height 和width。然后在得要宽高的基础上去重新设置我们的ImageView 即可:

final ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
        ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
            @Override
            public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) {
                if (imageInfo == null) {
                    return;
                }
                int height = imageInfo.getHeight();
                int width = imageInfo.getWidth();
                layoutParams.width = imageWidth;
                layoutParams.height = (int) ((float) (imageWidth * height) / (float) width);
                imageView.setLayoutParams(layoutParams);
            }
            @Override
            public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
                Log.d("TAG", "Intermediate image received");
            }
            @Override
            public void onFailure(String id, Throwable throwable) {
                throwable.printStackTrace();
            }
        };
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setControllerListener(controllerListener)
                .setUri(Uri.parse(url))
                .build();
        imageView.setController(controller);

Didn’t find class “org.apache.http.conn.scheme.SchemeRegistry”

Apache HTTP 客户端弃用
在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。

要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml的application节点下 添加以下内容:

<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

1127

NestedScrollView内嵌套RecyclerView不置顶的问题

在NestedScrollView下第一个布局文件中加入

android:focusable="true"
android:focusableInTouchMode="true"

关于微信登录和分享回调

我们在接收微信分享或微信登录回调的时候,需要注意,返回的baseResp的类型不一样

  • 微信登录返回的是:SendAuth.Resp
  • 微信分享返回的是:SendMessageToWX.Resq
// logo信息
handleIntent fail, ex = com.tencent.mm.opensdk.modelmsg.SendMessageToWX$Resp cannot be cast to com.t

1128

关于QQ分享拿不到回调的问题

项目集成了原生的QQ/QQ空间分享,但是根据官方文档发现拿不到分享后的回调。(官网的文档已经很久没有更新了)。


解决办法:重载onActivityResult 参考文档

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 这个一定要加,不然拿不到回调,官方文档没这句代码
        Tencent.onActivityResultData(requestCode,resultCode,data,new ShareQQUiListener());
        if (requestCode == Constants.REQUEST_API) {
            if (resultCode == Constants.REQUEST_QQ_SHARE ||
                    resultCode == Constants.REQUEST_QZONE_SHARE ||
                    resultCode == Constants.REQUEST_OLD_SHARE) {
                Tencent.handleResultData(data, new ShareQQUiListener());
            }
        }
    }

利用富文本给TextView设置点击事件失效的问题

项目中需要给TextView的某个关键字添加点击事件,利用富文本(ClickableSpan)实现,发现没有点击事件。


解决办法:需要给TextView设置setMovementMethod(LinkMovementMethod.getInstance())让超链接起作用

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltym2014

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值