Android黑科技

Android黑科技走一个

一、Android黑科技,引子:

今天给大家介绍下面的四种Android黑科技。并简单介绍一下端午去珠海、澳门的游玩照片。

  • 引用了别人的aar库,但这货需要权限敏感且多,我们不想在我的App中要求这些权限,同时,咱又没办法修改别人的aar库。怎么办?
  • 每次写布局控件,都要把填充的测试文字删除,最后还要设置为gone,好郁闷,怎么办?
  • 我想给APK瘦身减肥,有没有快速减肥的方法?答案是有,但我先不告诉你。
  • 好不容易发到线上了,万一我的服务器挂了怎么办,有没有办法解决或补救?

二、删除第三方AAR多请求的权限

  • 问题:引了第三方的AAR库要求蓝牙权限,但我APP不需要,我想删除掉,怎么办?
  • 很简单,只要在添加:http://schemas.android.com/tools 这个工具在manifest文件中,然后在相应的权限上增加:tools:node="remove"即可。算是只有你想不到,没有Google做不到吧。只需要加添如下代码,然后就可以把多余的蓝牙权限给干掉啦。代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:installLocation="auto">
<uses-permission android:name="android.permission.BLUETOOTH"
        tools:node="remove"/>
</manifest>        

有没有有一种被黑到的感觉?既然这个工具这么牛逼,那我们就写个Demo研究一下,主要是用在xml节点属性冲突时使用的,可以选择merge replace remove 之类的。

Google 开发者官方网址

我写的GitHub源码地址:TrackDemo 下面选一些会用到的情况:比如开发时想写一些测试文字,或者调布局时,调整显示和隐藏等。

1. 开发设计时期的用法

  • tools: – > android:布局管理器中预览使用,可以用 tools: 替换 所有的 android: 然后只在布局管理器中有效。代码和效果如下:

代码示例

代码示例

  • tools:context 在布局文件中,填上开发时的上下文,代码提示会带上下文。如下提示界面:(这个功能用得不多,只是个提示)

代码示例

  • toos:layout / tools:listitem / tools:listheader / tools:listfooter 开发Fragment或listview的时候,无法预览界面,用上面的工具,就可以在布局中看到界面了噢!界面如下:

代码示例

代码示例

上面的工具,主要是用来提高开发效率,让你少几次打包和编译。

2. 解决APK安装包大小的问题 – 清除无用资源文件

  • 在没有用到getIdentifier获取资源情况下,直接下在的代码就可以搞定了
buildTypes {
        release {
            minifyEnabled false
            // 设置为true,清除掉没有引用资源文件
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
  • 但很多情况,安装包中使用了:getIdentifier后,再这样写就有资源找不到的风险,但这么牛X的工具,因为一个方法不能用?怎么能忍?

  • Demo中,增加了三个通过getIdentifier 获取的图标:ic_0,ic_1,ic_2, 同时,还增加了一个t_remove.jpg, ic*不要清除,t_remove.jpg 要清除。在raw下在建立 keep.xml

  • 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@drawable/ic_*,@drawable/t_all" />

这样达到保护我们的ic_前缀图片不要被清理。

> 启用严格引用检查
正常情况下,资源压缩器可准确判定系统是否使用了资源。不过,如果您的代码调用 Resources.getIdentifier()(或您的任何库进行了这一调用 - AppCompat 库会执行该调用),这就表示您的代码将根据动态生成的字符串查询资源名称。当您执行这一调用时,默认情况下资源压缩器会采取防御性行为,将所有具有匹配名称格式的资源标记为可能已使用,无法移除。

例如,以下代码会使所有带 img_ 前缀的资源标记为已使用。

String name = String.format("img_%1d", angle + 1);
res = getResources().getIdentifier(name, "drawable", getPackageName());
资源压缩器还会浏览代码以及各种 res/raw/ 资源中的所有字符串常量,寻找格式类似于 file:///android_res/drawable//ic_plus_anim_016.png 的资源网址。如果它找到与其类似的字符串,或找到其他看似可用来构建与其类似的网址的字符串,则不会将它们移除。

这些是默认情况下启用的安全压缩模式的示例。但您可以停用这一“有备无患”处理方式,并指定资源压缩器只保留其确定已使用的资源。要执行此操作,请在 keep.xml 文件中将 shrinkMode 设置为 strict,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />
如果您确已启用严格压缩模式,并且代码也引用了包含动态生成字符串的资源(如上所示),则必须利用 tools:keep 属性手动保留这些资源。
  • 下面的图片,通过jadx反编译出来,发现只有t_remove 的 ID,但已经没有实际的内容了,但ic_01内容完整有效。

代码示例

代码示例

三、我们再来说容灾

  • 因为地震、施工、服务不稳定、域名备案、DNS解析等一系列的因素,都可以导致客户端连接不上服务端。
  • 这个时候,客户端要怎么办呢?或者我们有什么解决方案
    • 选好一点的服务器吧、阿里云,AWS 或者独立服务器。
    • 多机房或多地容灾,比如建立 杭州 和 上海 深圳 三个机房,都提供服务,App启动时,先测试哪个服务器最快,就用哪个【游戏公司这样玩】
    • 或者保证一个服务器IP查址服务可用,客户端启动时,请求IP查址服务,决定是请求杭州、上海或深圳【推荐这种,因为客户端未维持一个服务器列表,保证多版本的可用性】

四、最后,刚刚从珠海长隆海洋世界回来,分享几点经历。

  1. 一定要在节假日之前就出去,然后节假日呆在酒店吃吃喝喝、或者回来,不要去人挤人。
  2. 长隆海洋公园,如果要住的话,选择企鹅酒店吧,离得比较近,孩子比较喜欢,我住的是横琴湾酒店、有一点好:退房都不用查房,直接把房卡投到信箱里就可以了。【因为信任、所以简单】这真是个好体验。
  3. 澳门的话,老人和孩子,真心还是不要带了,要不然真的有点折腾。

发表评论

您的电子邮箱地址不会被公开。