当前分类 / Android / 总共117篇

Android 查看内存指令

问题

最近在项目中遇到一个 Low on memory 内存过高导致应用退出问题,其中使用了一些内存查看命令,这里做一个记录,错误日志如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
I/ActivityManagerService(  443): Low on memory:
I/ActivityManagerService(  443):   ntv   N     4118 kB: zygote (pid 161) native
I/ActivityManagerService(  443):   ntv   N     2814 kB: surfaceflinger (pid 142) native
I/ActivityManagerService(  443):   ntv   N     1986 kB: logd (pid 136) native
I/ActivityManagerService(  443):   ntv   N     1925 kB: mediaserver (pid 157) native
I/ActivityManagerService(  443):   ntv   N     2749 kB: (Other native)
I/ActivityManagerService(  443):   sys   P    24827 kB: system (pid 443) fixed
I/ActivityManagerService(  443):   pers  P    37707 kB: com.android.systemui (pid 612) fixed
I/ActivityManagerService(  443):   pers  P    13423 kB: com.android.phone (pid 819) fixed
I/ActivityManagerService(  443):   pers  P     8760 kB: com.android.inputmethod.latin (pid 706) fixed
I/ActivityManagerService(  443):   pers  P     5996 kB: android.process.media (pid 575) fixed
I/ActivityManagerService(  443):   pers  P     3577 kB: com.cghs.stresstest (pid 796) fixed
I/ActivityManagerService(  443):   fore  T   153394 kB: com.dlc.huishouxiang (pid 24324) top-activity
I/ActivityManagerService(  443):             261276 kB: TOTAL
I/ActivityManagerService(  443):   MemInfo: 25032 kB slab, 140 kB shmem, 379704 kB vm alloc, 7532 kB page el stack
I/ActivityManagerService(  443):            132 kB buffers, 86556 kB cached, 42500 kB mapped, 180476 kB free
I/ActivityManagerService(  443):   ZRAM: 5652 kB RAM, 520908 kB swap total, 503928 kB swap free
I/ActivityManagerService(  443):   Free RAM: 224664 kB
I/ActivityManagerService(  443):   Used RAM: 677980 kB
I/ActivityManagerService(  443):   Lost RAM: 1158732 kB
I/ActivityManagerService(  443): Start proc 3350:com.android.smspush/u0a43 for service com.android.smspush/.WapPushManager

从日志上 18 ~ 20 行看 Lost RAM 占用太大了,而 Used RAM 占用并不大。

Free RAM:为剩余内存。

Used RAM:为用户态使用总内存。

Lost RAM:为内核态使用内存,比如 OpenGL 纹理内存、GPU 占用内存、图形显示 ION buffer 都包含在 Lost RAM 里,从字面意思是理解它是丢失的内存,也就是说它是操作系统无法解释和正常利用的内存。

其中 Lost RAM = TotalRAM - FreeRAM - UsedRAM 也可以理解为其他内存。

阅读更多

Adplayer 图片音视频广告混播

项目介绍

项目地址:https://github.com/licheedev/AdPlayer

简单的广告混播实现,没有类似 ViewPager 那样的切换滚动效果。

支持加载 url、本地文件、drawable 和 mipmap(仅图片)、raw 资源、asset 文件。

可以自定义图片加载器。

可以配置图片和视频的缩放模式。

添加依赖

app 的 build.gradle 中添加:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
        implementation 'com.github.licheedev:AdPlayer:1.0.3'
        implementation 'com.github.bumptech.glide:glide:4.9.0'
}

阅读更多

关于视频播放 VideoView 的一个 GC 问题

这段时间在一个项目中用到了视频和图片轮播的广告,一开始我使用了 ExoPlayer 视频播放库,结果出现了一个奇葩的问题 ANR on player release #4352,我的设备系统是 Android 5.1.1 于是我尝试工程更新到 AndroidX 将 ExoPlayer 更新到最新版本,结果还是会出问题,貌似在 Android 7.0 中这个问题得到了修复。迫于这个问题的困扰,于是我放弃了 ExoPlayer 而选择系统默认的视频播放库,结果遇到了另一个令人不爽的 bug bug 详细描述

这个问题在更高的 Android 系统中已经被修复 Fix context leak

最后变相解决 VideoView 在 Activity 中内存泄漏的方法:

创建 AudioServiceActivityLeak.java 类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * Fixes a leak caused by AudioManager using an Activity context. 
 * Tracked at https://android-review.googlesource.com/#/c/140481/1 and
 * https://github.com/square/leakcanary/issues/205
 */
public class AudioServiceActivityLeak extends ContextWrapper {

  AudioServiceActivityLeak(Context base) {
    super(base);
  }

  public static ContextWrapper preventLeakOf(Context base) {
    return new AudioServiceActivityLeak(base);
  }

  @Override public Object getSystemService(String name) {
    if (Context.AUDIO_SERVICE.equals(name)) {
      return getApplicationContext().getSystemService(name);
    }
    return super.getSystemService(name);
  }
}

在使用 VideoView 的 Activity 中重写 attachBaseContext

1
2
3
4
5
6
public class ActivityUsingVideoView extends Activity {
  
  @Override protected void attachBaseContext(Context base) {
    super.attachBaseContext(AudioServiceActivityLeak.preventLeakOf(base));
  }
}

阅读更多

Debug 判断不再用 BuildConfig

本文转载自:https://www.trinea.cn/android/android-whether-debug-mode-why-buildconfig-debug-always-false/

Android 开发中一般会通过 BuildConfig.DEBUG 判断是否是 Debug 模式,从而做一些在 Debug 模式才开启的特殊操作,比如打印日志。这样好处是不用在发布前去主动修改,因为这个值在 Debug 模式下为 true,Release 模式下为 false。

问题

如果应用只有一个 Module 没有问题,Debug 模式下 BuildConfig.DEBUG 会始终为 true。如果现在有两个 Module,分别为 App 和 Lib,且 App 依赖 Lib,在 Lib 内有工具类 LogUtils,代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package cn.trinea.android.lib.util;
 
import android.util.Log;
import cn.trinea.android.lib.util.BuildConfig;
 
public class LogUtils {
 
    public static void d(String log) {
        if (BuildConfig.DEBUG) {
            Log.d("trinea-debug", log);
        }
    }
    //……
}

当我们在 App Module 内调用 LogUtils 时我们会发现始终无法打印日志,因为上面的 BuildConfig.DEBUG 会始终为 false。为什么呢?

阅读更多

Android 因 Certification 错误造成的构建问题

不知从那天起突然发现构建 Android 工程下载依赖库的时候会发生一个错误:

PKIX:unable to find valid certification path to requested target

这个问题我查找了网上相关资料,最后总算是解决了,在这里记录一下。

阅读更多

Android 中水平自动滚动列表实现

水平滚动的思路借鉴于 Android RecyclerView打造自动循环效果,但是这个不能实现循环左右移动,所以我进行了一个小修改,添加了方向这个概念,并在滚动到最顶端的时候自动改变了方向。

水平自动滚动广告效果演示 水平自动滚动广告效果演示

1
2
3
4
5
if(recyclerView.canScrollHorizontally(scrollDirection)){
    recyclerView.scrollBy(2 * scrollDirection, 2 * scrollDirection);
}else{  //改变方向
    scrollDirection = -scrollDirection;
}

首先我们考虑到水平列表可以使用 RecycleView 实现:

1
2
mRecycleView.setLayoutManager(new LinearLayoutManager(this.getContext(),
        LinearLayoutManager.HORIZONTAL, false));

然后我们重写一下 RecycleView 继承并使用 scrollBy() 方法来实现自动滚动。

阅读更多

Android 虹软人脸识别 NV21 和 RGB24 转换问题

当我们使用活体检测检测完毕后,需要上传图片给后台进行人脸识别,在 Android 里面默认的 Camera 获取的图片格式是 NV21.

怎么知道这个默认格式呢?

1
2
Camera.Parameters parameters = camera.getParameters();
parameters.getPreviewFormat();

这个格式的图片本身虹软是支持的,但是有个条件限制:SDK 对图形尺寸做了限制,宽高需要大于 0,宽度为 4 的倍数, YUYV/I420/NV21/NV12 格式的图片高度为 2 的倍数, RGB24 格式的图片高度不限制。如果你的图片是 NV21 格式不符合这个条件就需要进行转换。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private static final int VALUE_FOR_4_ALIGN = 0b11;
private static final int VALUE_FOR_2_ALIGN = 0b01;

/**
    * 确保传给引擎的NV21数据宽度为4的倍数,高为2的倍数
    *
    * @param bitmap 传入的bitmap
    * @return 调整后的bitmap
    */
public static Bitmap alignBitmapForNv21(Bitmap bitmap) {
    if (bitmap == null || bitmap.getWidth() < 4 || bitmap.getHeight() < 2) {
        return null;
    }
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    boolean needAdjust = false;
    //保证宽度是4的倍数
    if ((width & VALUE_FOR_4_ALIGN) != 0) {
        width &= ~VALUE_FOR_4_ALIGN;
        needAdjust = true;
    }

    //保证高度是2的倍数
    if ((height & VALUE_FOR_2_ALIGN) != 0) {
        height--;
        needAdjust = true;
    }

    if (needAdjust) {
        bitmap = imageCrop(bitmap, new Rect(0, 0, width, height));
    }
    return bitmap;
}

阅读更多

Android 对接虹软活体检测

虹软的人脸识别算法因为免费,所有被很多开发者采用,今天来大致介绍一下如何使用,方便你接入的时候更加省时省力。因为人脸识别一般都放在服务器端,除非做离线识别,所有接下来就针对活体检测 sdk 来说明一下。

活体检测 SDK 下载:https://ai.arcsoft.com.cn/product/liveness_detection.html

1
2
3
4
5
6
ArcSoft_Liveness_Android_V1.0
├─doc
├─libs
│  └─armeabi-v7a 
└─samplecode
    └─LivenessDemo

阅读更多

Android 优秀开源项目整理

下面这些是我整理的一些常用的开源框架,在你的项目中使用它们可以起到事半功倍的效果,有的项目已经不再维护,有的项目即将停止,我只能感叹技术的发展是如此之快,在你还没有完全搞懂一个新框架之前可能这个框架已经被淘汰,我相信这些框架中的大部分会在不久被淘汰,也可能会被全部淘汰。但是这并不影响我们去学习和使用它们,因为其中的设计思维是可以长久的被我们所利用的。

多媒体编程

图片加载库

Picasso

  • 项目地址:https://github.com/square/picasso
  • 项目概要:Github大神推荐的强大的图片下载和缓存库。
  • 项目详情:Square 开源的项目,主导者是 JakeWharton.

阅读更多

Android 使用 WIFI 无线调试

最近项目中的需要,安卓设备需要安装到设备中后可能需要调试,这个时候去插线调试就不是很方便了,这个时候我想到了 WIFI 无线调试,其实这个在很早之前我就用过,很久没用了,今天索性就记录一下,方便大家参考。

首先,你的 Android 设备需要是 Root 的,而且拥有无线 WIFI 模块。

长按 WIFI 网络图标,然后在弹出的连接对话框中选择 高级选项 然后点击 IP设置 并选择 静态(如下图所示)。

WIFI 连接设置对话框 WIFI 连接设置对话框

注意上面的设置弹框界面要输入与你路由器相匹配的网关和网段IP地址,你路由器的网关你可以通过 PC 上面的 ipconfig 或者 ifconfig 命令来查看:

PC 连接同一个路由器 PC 连接同一个路由器

阅读更多

10 个最好的 Android 游戏模板「转」

引言

如果您熟悉 Android SDK,您可能知道使用它从头创建一个新游戏是不容易的。选择合适的游戏引擎,支持多种屏幕尺寸和 DPIs,实现无错误的游戏玩法,管理玩家数据,这些都是需要花费几天甚至几周才能完成的任务。

值得庆幸的是,CodeCanyon 是一个在线市场,它提供了许多经过深思熟虑的游戏模板。通过使用一个或多个这样的模板,你可以跳过游戏开发中大多数繁琐的部分,而只关注游戏中独一无二的部分。

在这篇文章中,我将向你介绍一些在 CodeCanyon 上可用的功能最丰富和最棒的 Android 游戏模板。

阅读更多