Android内存如何优化?阿里技术员工整理亲授,建议收藏

2023-11-17

作者:山鱿鱼说
链接:https://juejin.cn/post/7106289745499521054

基础知识

内存概念

  • VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
  • RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
  • PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  • USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存

虚拟内存

虚拟地址空间大小

影响大小的3个因素

页大小/地址长度/页表级数,大的在前小的在后 L3~L0

Android默认的页面大小配置为CONFIG_ARM64_4K_PAGES,即4KB,如果使用48位的地址空间需要4级页表来支持。

Android 默认的虚拟地址的长度配置为CONFIG_ARM64_VA_BITS=39

同时使用3级页表CONFIG_PGTABLE_LEVELS=3进行管理,

故Android的64位应用可使用的地址空间一般为2^39=512GB

进程空间分布

  • 代码段:存放用户进程代码,以及部分常量;
  • 数据段:存放用户进程初始化全局变量和静态变量;
  • BSS段:存放用户进程未初始化全局变量和静态变量;
  • 堆:存放用户进程动态申请的数据,堆是从低地址向高地址生长;
  • 内存映射区:用户动态链接库的加载、文件的映射,起始地存储在mm结构体中的mmap_base变量;
  • 栈:存放环境变量、参数字符串、局部变量、函数栈帧。栈首地址为STACK_TOP,一般默认开启栈随机化,因此实际的起始地址是STACK_TOP减去一个随机值。

Java堆

堆配置

dalvik.vm.heapgrowthlimit: [256m] (每个应用程序一般情况下堆最大内存可分配到内存)
dalvik.vm.heapsize: [512m] (每个应用程序最大堆内存可分配到内存,largeHeap=true的情况)
dalvik.vm.heapmaxfree: [8m] (堆最大空闲内存)
dalvik.vm.heapminfree: [6M] (堆最小空闲内存)
dalvik.vm.heapstartsize: [8m] (表示应用程序启动后为其分配的初始大小)
dalvik.vm.heaptargetutilization]: [0.75] (堆的目标利用率)

堆内存分布

Graphic

  • EGL mtrack: gralloc分配的内存,主要是窗口系统,SurfaceView/TextureView和其他的由gralloc分配的GraphicBuffer总和

  • GL mtrack: 驱动上报的GL内存使用情况。 主要是GL texture大小,GL command buffer,固定的全局驱动程序RAM开销等的总和

查看内存命令/工具

procrank (only for Android)

它从/proc/pid/maps中读取信息来进行统计。源码位于:/system/extras/procrank

内存耗用:VSS/RSS/PSS/USS

  • VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
  • RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
  • PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  • USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

cat /proc/pid/status

VmPeak 虚拟内存使用量的峰值,取mm->total_vm和mm->hiwater_vm的大值。

VmSize:当前虚拟内存的实际使用量。

VmLck:PG_mlocked属性的页面总量,常被mlock()置位。

VmPin:不可被移动的Pined Memory内存大小。

VmHWM:HWM是High Water Mark的意思,表示rss的峰值。

VmRSS:应用程序实际占用的物理内存大小,这里和VmSize有区别。VmRss要小于等于VmSize。

RssAnon:匿名RSS内存大小。

RssFile:文件RSS内存大小。

RssShmem:共享内存RSS内存大小。

VmData:程序数据段的所占虚拟内存大小,存放了初始化了的数据。

VmStk:进程在用户态的栈大小。

VmExe:进程主程序代码段内存使用量,即text段大小。

VmLib:进程共享库内存使用量。

VmPTE:进程页表项Page Table Entries内存使用量。

VmPMD:进程PMD内存使用量。

VmSwap:进程swap使用量。
Name:   com.xxx.xxx

Umask:  0077

State:  S (sleeping)

Tgid:   16962

Ngid:   0

Pid:    16962

PPid:   629

TracerPid:      0

Uid:    10215   10215   10215   10215

Gid:    10215   10215   10215   10215

FDSize: 1024

Groups: 3001 3002 3003 9997 20215 50215 

VmPeak:  3854080 kB

VmSize:  3072956 kB

VmLck:         0 kB

VmPin:         0 kB

VmHWM:    750696 kB

VmRSS:    371612 kB

RssAnon:          229320 kB

RssFile:          141892 kB

RssShmem:            400 kB

VmData:  2078184 kB

VmStk:      8192 kB

VmExe:        24 kB

VmLib:    304248 kB

VmPTE:      3612 kB

VmPMD:        16 kB

VmSwap:    11652 kB

Threads:        275

SigQ:   0/21576

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000001204

SigIgn: 0000000000000001

SigCgt: 00000006400084f8

CapInh: 0000000000000000

CapPrm: 0000000000000000

CapEff: 0000000000000000

CapBnd: 0000000000000000

CapAmb: 0000000000000000

Seccomp:        2

Speculation_Store_Bypass:       unknown

Cpus_allowed:   ff

Cpus_allowed_list:      0-7

Mems_allowed:   1

Mems_allowed_list:      0

voluntary_ctxt_switches:        670221

nonvoluntary_ctxt_switches:     198816

maps文件读取

只能被自己读取,其他用户没权限

adb shell run-as com.xxx.xxx showmap 23308

adb shell run-as com.xxx.xxx cat /proc/16962/smaps

adb shell run-as com.xxx.xxx pmap xx

linux proc maps文件分析_jiazheng.li的CSDN博客-CSDN博客_maps文件

eac52000-eac8a000 rw-p 00000000 00:00 0 [anon:dalvik-threa local mark ]

[anon:dalvik-threa local mark ]

对有名来说,是映射的文件名。对匿名映射来说,是此段虚拟内存在进程中的角色。[stack]表示在进程中作为栈使用,[heap]表示堆。其余情况则无显示

adb shell dumpsys meminfo

adb shell dumpsys meminfo

Applications Memory Usage (in Kilobytes):

Uptime: 289354670 Realtime: 348478673



** MEMINFO in pid 16962 [com.xxxx] **

                   Pss  Private  Private  SwapPss     Heap     Heap     Heap

                 Total    Dirty    Clean    Dirty     Size    Alloc     Free

                ------   ------   ------   ------   ------   ------   ------

  Native Heap   200662   200532        0      918   245504   222307    23196

  Dalvik Heap    69943    69860        0       74    50813    26237    24576

 Dalvik Other    18671    18668        0        0                           

        Stack      108      108        0        0                           

       Ashmem      242        4        0        0                           

      Gfx dev    23460    23276      184        0                           

    Other dev      131        4      124        0                           

     .so mmap    29702     2232    21904       24                           

    .jar mmap        6        0        4        0                           

    .apk mmap    28506    11156     6704        0                           

    .ttf mmap      247        0       36        0                           

    .dex mmap    64055    55240     4752        0                           

    .oat mmap     3793        0      612        0                           

    .art mmap     8124     5644      768        2                           

   Other mmap     3260       32     2076        1                           

   EGL mtrack    35136    35136        0        0                           

    GL mtrack   104280   104280        0        0                           

      Unknown     6002     5976        0       14                           

        TOTAL   597361   532148    37164     1033   296317   248544    47772

 

 App Summary

                       Pss(KB)

                        ------

           Java Heap:    76272

         Native Heap:   200532

                Code:   102640

               Stack:      108

            Graphics:   162876

       Private Other:    26884

              System:    28049

 

               TOTAL:   597361       TOTAL SWAP PSS:     1033

 

 Objects

               Views:     1605         ViewRootImpl:        1

         AppContexts:       11           Activities:        2

              Assets:       13        AssetManagers:        0

       Local Binders:      306        Proxy Binders:       56

       Parcel memory:       52         Parcel count:      208

    Death Recipients:        5      OpenSSL Sockets:        6

            WebViews:       20

 

 SQL

         MEMORY_USED:     7370

  PAGECACHE_OVERFLOW:     5553          MALLOC_SIZE:      215

 

 DATABASES

      pgsz     dbsz   Lookaside(b)          cache  Dbname

         4      308            103      765/61/25  /data/user/0/com.xxx.xxx/databases/mbridge.msdk.db

         4       24             34         7/25/4  /data/user/0/com.xxx.xxx/databases/omDB.db

         4      128            109      293/39/22  /data/user/0/com.xxx.xxx/databases/vungle_db

         4      108             85      416/82/25  /data/user/0/com.xxx.xxx/databases/google_app_measurement.db

         4       40             33         1/24/2  /data/user/0/com.xxx.xxx/databases/com.google.android.datatransport.events

         4       40             70       315/23/6  /data/user/0/com.xxx.xxx/databases/dt_event.db

         4      304             49       77/130/4  /data/user/0/com.xxx.xxx/databases/db_we_show

         4        8                         0/0/0    (attached) temp

         4      304             44        29/17/2  /data/user/0/com.xxx.xxx/databases/db_we_show (2)

         4       20             64         1/19/2  /data/user/0/com.xxx.xxx/databases/godap_download.db

         4    18244             54      2058/20/5  /data/user/0/com.xxx.xxx/no_backup/androidx.work.workdb (2)

                                   13877622/11861/25  /data/user/0/com.xxx.xxx/no_backup/androidx.work.workdb

 

 Asset Allocations

    : 155K

    : 157K

    : 160K

    : 1494K

    : 5873K

EGL mtrack/GL mtrack

EGL mtrack: gralloc分配的内存,主要是窗口系统,SurfaceView/TextureView和其他的由gralloc分配的GraphicBuffer总和

GL mtrack: 驱动上报的GL内存使用情况。 主要是GL texture大小,GL command buffer,固定的全局驱动程序RAM开销等的总和

android Profiler

内存信息

  • Java:从 Java 或 Kotlin 代码分配的对象的内存。
  • Native:从 C 或 C++ 代码分配的对象的内存。

即使您的应用中不使用 C++,您也可能会看到此处使用了一些原生内存,因为即使您编写的代码采用 Java 或 Kotlin 语言,Android 框架仍使用原生内存代表您处理各种任务,如处理图像资源和其他图形。

  • Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。(请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)
  • Stack:您的应用中的原生堆栈和 Java 堆栈使用的内存。这通常与您的应用运行多少线程有关。
  • Code:您的应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存。
  • Others:您的应用使用的系统不确定如何分类的内存。
  • Allocated:您的应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象

内存指标采集

内存

1.通过 ActivityManager 的 getProcessMemoryInfo => Debug.MemoryInfo 获取内存信息数据。

2.通过 Debug.MemoryInfo 的 getMemoryStats() 方法(os v23 及以上)可以获得 Memory Profiler 中的多项数据,进而获得 细分内存的使用情况。

3.接着,通过 Runtime 获取 DalvikHeap信息

4.最后,通过 Debug.getNativeHeapAllocatedSize 获取 NativeHeap

虚拟内存

读取/proc/self/status文件

读取/proc/self/smap文件

内存监测

OOM类型

1.pthread_create问题

2.文件描述符超限问题

3.堆内存超限

堆内存超限原因

1.单次配过大

2.累计使用过大

如何发现问题

提供场景信息

activity 事件信息

fragment 事件信息

WebView/SurfaceView/TextView attach/detach事件信息

场景进入退出信息

监测水位触顶

方法

1.通过 ActivityManager 的 getProcessMemoryInfo => Debug.MemoryInfo 获取内存信息数据。

2.通过 hook Debug.MemoryInfo 的 getMemoryStat 方法(os v23 及以上)可以获得 Memory Profiler 中的多项数据,进而获得 细分内存的使用情况。

3.接着,通过 Runtime 获取 DalvikHeap。

4.最后,通过 Debug.getNativeHeapAllocatedSize 获取 NativeHeap

阀值

1.堆内存超过最大值的85%的限制,GC 会变得更加频发,容易造成 OOM 和 卡顿。

2.32位机器虚拟内存超过3.7G会大概率挂

监测泄漏

1.Activity/Fragment/Service/Provider组件

Application.ActivityLifecycleCallbacks;

FragmentManager.FragmentLifecycleCallbacks;

需要注册三个包之下

android.app.Fragment

androidx.fragment.app.Fragment

android.support.v4.app.Fragment

2.大对象主动监测

播放对象/大的缓存对象等在业务结束的时候加入监控

监测大图

AOP插桩方式

1.监测 ImageVIew的setImageResource/setImageDrawable/setImageBitmap,判断图片大小是否大于View的宽高

2.监测Bitmap的createBitmap()/createScaledBitmap,记录大小超过阀值的图片信息,堆栈,

3.监测BitmapFactory.decodeFile()/decodeResuorce/decodeStream,记录大小超过阀值的图片信息,堆栈

Java hook方式

使用epic 同样直接hook以上方法

监测GC事件

1.Cleaner机制 ART虚拟机 | Finalize的替代者Cleaner - 掘金

2.bhook __android_log_write 接口获取GC日志信息

3.从 API 级别 30 开始,可通过调用 __android_set_log_writer 更改日志记录函数

developer.android.com/studio/comm…

4.参考ActivityThread.attach()中的方法,使用WeakReference持有覆盖finalize()方法的对象,在finalize()再重新生成WeakReference,参考

BinderInternal.addGcWatcher(new Runnable() {

                @Override public void run() {

                    if (!mSomeActivitiesChanged) {

                        return;

                    }

                    Runtime runtime = Runtime.getRuntime();

                    long dalvikMax = runtime.maxMemory();

                    long dalvikUsed = runtime.totalMemory() - runtime.freeMemory();

                    if (dalvikUsed > ((3*dalvikMax)/4)) {

                        if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024)

                                + " total=" + (runtime.totalMemory()/1024)

                                + " used=" + (dalvikUsed/1024));

                        mSomeActivitiesChanged = false;

                        try {

                            mgr.releaseSomeActivities(mAppThread);

                        } catch (RemoteException e) {

                        }

                    }

                }

            });

监测内存分配

JVMTI功能

Android JVMTI实现应用内存动态检测

利用Android9.0虚拟机的JVMTI技术实现一些黑科技_z1032689332的博客-CSDN博客_安卓9虚拟机

1.类加载事件
2.GC启动和结束事件
3.内存分配事件

堆栈聚合

基于对象聚合

基于业务聚合

内存归因

ClassLoader

StatisticLogger

ImageLoader

ALog

监控线程创建

1.使用epic hook thread的start方法

2.记录线程创建的堆栈和信息

3.定时dump所有线程信息

分析heap时分析大对象的 RetainedSize/小对象的引用链路

1.加载全部对话信息

2.增加多层缓存,内存->磁盘缓存

3.缓存失效和清理

实际例子

1.Feed流中,LoadMore每次都加载新的视频数据,缓存数据可能一直增大

2.可以使用多级缓存,内存缓存超过一定大小,写到磁盘中

开源工具

Java hook

Epic

github.com/tiann/epic/…

PLT/GOT hook

bhook

github.com/bytedance/b…

JavaHeapDump

hprof的格式是什么

Hprof文件解析

工具

KOOM
Tailor
西瓜稳定建设Tailor

androidperformance.com/2015/04/11/… 内存优化之二 - MAT使用进阶](androidperformance.com/2015/04/11/…)

github.com/bytedance/t…

还原hprof文件

python3 ~/Desktop/work/opesource/tailor/library/src/main/python/decode.py -i ~/Desktop /mini.hprof -o ~/Desktop/target.hprof

hprof-conv转换

/Users/cy/Library/Android/sdk/platform-tools/hprof-conv /Users/cy/Desktop/target.hprof ~/Desktop/mat.hprof

Native内存

西瓜稳定建设 native

Raphel

python3 ~/Desktop/work/opesource/memory-leak-detector/library/src/main/python/raphael.py -r /Users/cy/Desktop/oom/report -o /Users/cy/Desktop/oom/leak.txt

python3 ~/Desktop/work/opesource/memory-leak-detector/library/src/main/python/mmap.py -m /Users/cy/Desktop/oom/maps

adb shell am broadcast -a com.apm.ACTION_DUMP_ALL

adb shell am broadcast -a com.apm.ACTION_NATIVE_DUMP

优化

泄漏问题

1.activity/fragment/service/provider泄漏问题

2.view泄漏问题

主动释放泄漏的 Activity 持有的 主动回收View和View使用的资源

3.activity可以调用setContentView(null)

4.遍历view释放ViewTree 的背景图和 ImageView 中的图

图片合理性

1.图片大小的合理性

资源图片:

资源图片放错目录会放大

资源图片直接把留白和核心内容切了一整张大图,可以只切核心内容部分

能有drawable写,比如规则渐变色等直接使用代码写

其他图片:

其他图片加载需要考虑显示区域大小

2.缓存的图片不要过多

1.RecycleView item回收的时候,要清空使用状态

2.控制图片框架加载的 Cache 大小一般不超过2屏大小

3.Android O以上可以使用硬件位图

4.质量要求不要情况下,inPreferConfig可以降低到565配置

3.复用

1.底图或者框架图,可以使用全局实例

4.内存吃紧的情况下主动释放图片缓存。

onLowMemory/onTrimMemory中调用Glide.clearMemoryCache()

系统资源限制

1.文件描述符限制,O 以下设置为1k,新的一般设置为32k

2.线程个数限制,pthread_create问题

3.收敛线程

EL/EGL 内存

1.Window的个数不要太多

2.GPU显存使用问题,硬件加速中图片是先上传到纹理中的

3.SurfaceView和TextureView问题

Native内存

线程收敛、监控

线程栈泄漏自动修复

FD 泄漏监控

虚拟内存监控、优化

64 位专项

保障体系建设

1.提供哪些数据能分析得到准确的问题场景和原因

2.如何防止劣化

开发阶段

测试阶段

灰度阶段

上线阶段

案例

1. CursorWindow from Parcel due to error -12, process fd count=707

android.database.CursorWindowAllocationException: Could not create CursorWindow from Parcel due to error -12, process fd count=707

        at android.database.CursorWindow.nativeCreateFromParcel(Native Method)

        at android.database.CursorWindow.<init>(CursorWindow.java:167)

        at android.database.CursorWindow.<init>(CursorWindow.java:45)

        at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:716)

        at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:714)

        at android.database.BulkCursorDescriptor.readFromParcel(BulkCursorDescriptor.java:75)

        at android.database.BulkCursorDescriptor$1.createFromParcel(BulkCursorDescriptor.java:34)

        at android.database.BulkCursorDescriptor$1.createFromParcel(BulkCursorDescriptor.java:30)

        at android.content.ContentProviderProxy.query(ContentProviderNative.java:426)

        at android.content.ContentResolver.query(ContentResolver.java:946)

        at android.content.ContentResolver.query(ContentResolver.java:881)

        at androidx.core.content.ContentResolverCompat.query(SourceFile:81)

        at androidx.loader.content.CursorLoader.loadInBackground(SourceFile:63)

        at androidx.loader.content.CursorLoader.loadInBackground(SourceFile:41)

        at androidx.loader.content.AsyncTaskLoader.onLoadInBackground(SourceFile:307)

        at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(SourceFile:60)

        at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(SourceFile:48)

        at androidx.loader.content.ModernAsyncTask$2.call(SourceFile:141)

        at java.util.concurrent.FutureTask.run(FutureTask.java:266)

        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)

        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)

        at java.lang.Thread.run(Thread.java:919)

2.pthread_create (1040KB stack) failed

java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again**

    at java.lang.Thread.nativeCreate(Native Method)

    at java.lang.Thread.start(Thread.java:883)

    at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:975)

    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1382)

    at androidx.arch.core.executor.DefaultTaskExecutor.executeOnDiskIO(SourceFile:59)

    at androidx.arch.core.executor.ArchTaskExecutor.executeOnDiskIO(SourceFile:96)

    at androidx.arch.core.executor.ArchTaskExecutor$2.execute(SourceFile:53)

    at androidx.room.InvalidationTracker.refreshVersionsAsync(SourceFile:442)

    at androidx.room.RoomDatabase.endTransaction(SourceFile:368)

    at me.vd.lib.file.manager.db.dao.PrivateFileDao_Impl.insertPrivateFiles(SourceFile:204)

    at me.vd.lib.file.manager.manager.PrivateFolderManager.getPrivateFiles(SourceFile:597)

    at me.vd.lib.file.manager.manager.PrivateFolderManager$getPrivateFiles$1.invokeSuspend(Unknown Source:11)

    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(SourceFile:33)

    at kotlinx.coroutines.DispatchedTask.run(SourceFile:56)

    at kotlinx.coroutines.scheduling.CoroutineScheduler.a(SourceFile:571)

    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(SourceFile:2738)

3.graphic内存暴涨

4.在Native层,Crash是vss超了3.7G后,随机出现某个场景

5.HandlerThread泄漏

6.EventBus泄漏

7.Feed流页面

首页推荐列表的每一次 Loadmore 操作,都不会清理之前缓存起来的视频对象,导致用户长时间停留在推荐 Feed 时,存起来的视频对象过多会导致内存方面的压力

最后

简单的使用流程就是这样,后续会继续记录。相信大家现在对Android内存优化的问题已经有了比较深入的理解了。

这里我就分享一份资料,包含:Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。
在这里插入图片描述

如果你有需要的话,可以扫描下方二维码,免费获取Android学习PDF+架构视频+面试文档+源码笔记领取方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android内存如何优化?阿里技术员工整理亲授,建议收藏 的相关文章

  • 未为模块“Example-Example”指定 APK 路径

    我是 Android 应用程序开发领域的新手 我正在创建一个项目示例安卓工作室 我有我的午餐列表 java文件输入src main java apt tutorial lunchlist 直到昨天一切都工作正常 但是当我今天打开 andro
  • android widget 和 localservice 绑定

    我编写播放器 它的主要活动是运行本地服务 我找不到如何将本地服务绑定到小部件 当我尝试像在活动中一样绑定它时 它失败了 请帮助我 添加 1 何时可以联系后台服务 http www developer com ws data article
  • 如何让Service即使被系统杀死也无法删除?

    我正在创建一个蓝光过滤器应用程序 因此 我想显示所有应用程序的视图 我通过以下服务做到了 public class OverlayService extends Service public OverlayService View mVie
  • 使用选项卡式活动中的捆绑包将值从活动传递到片段

    我是一个java文盲 但仍在尝试开发一个供我个人使用的应用程序 我从 android studio 的 Tabbed Activity 开始 除了 MainActivity 中的一个片段和一个包之外 大部分没有改变 这是我的代码 主要活动
  • Android 构建签名 APK 时出错:找不到用于签名配置“externalOverride”的 keystore.jks

    当我尝试构建签名 APK 时出现此错误 我最近升级到 API 23 但之后成功生成了 APK s 我很困惑 寻求帮助并建议如何解决这个问题 这是错误 FAILURE Build failed with an exception What w
  • 如何处理应用程序对 3d party 的依赖

    我当前正在开发的应用程序依赖于第三方应用程序 OIFileManager 我的问题是处理这些依赖关系的一般方法是什么 告诉用户解决它 嵌入 3d party apk 如果其许可证允许 自动解决 也许Android市场有相应的系统 没有自动的
  • 安卓市场。 Google Checkout 和银行帐户

    请原谅 这不是一个编程问题 但它仍然与软件开发有关 所以我希望它没问题 为付费应用创建 Android 开发者帐户意味着注册一个 GoogleCheckout 帐户 这又意味着将其链接到来自这 31 个符合条件的国家 地区之一的银行帐户 有
  • 在应用程序启动期间更改主题的最快方法

    目前 我确实在我的应用程序中根据用户最后的选择提供了 2 个主题 深色主题和浅色主题 在主要活动启动期间 我将执行以下操作 public class MyFragmentActivity extends FragmentActivity O
  • Android BLE - 如何分块读取大特征值(使用偏移量)?

    我正在使用 Android SDKandroid 蓝牙 and android 蓝牙 le APIs 我想实现一个应用程序 发挥核心作用 并连接到 BLE 外设以读取特征值和描述符 应用程序需要读取的特征值较大 因此需要分块连续读取 我对如
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 拦截来自外部应用程序的意图

    假设我想开发一个以某种方式扩展的应用程序 让我说 合作 非常受欢迎的应用程序我显然无法控制 为了简单起见 我们还假设非常著名的应用程序作者不会发布更新来阻止我的应用程序 我研究了该应用程序的功能并发现它广泛使用BroadcastReceiv
  • 颤动附近的连接

    当我尝试在设备上做广告或发现时 我收到此错误 但是前一天在环路上效果很好 PlatformException Failure 17 API Nearby CONNECTIONS API is not available on this de
  • 使用 Asp.Net 的 GCM 推送通知

    正如您可能已经看到的 Google 正在迁移其推送通知系统 http developer android com guide google gcm c2dm html http developer android com guide goo
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • Android - 测试另一个活动是否已开始

    我正在尝试测试以下场景 在自动完成文本视图中输入一个字母 向下滚动并选择其中一个选项 然后单击一个按钮 单击按钮将启动一个新活动 我想检查新活动是否已经开始 这是测试方法 public void testSpinnerUI mActivit
  • Android 上的 Jetty 上的 Jersey 抛出 ContainerException:“不存在 WebApplication 提供程序”

    我正在尝试在 Android 上的 Jetty 上运行 Jersey 我创建了一个 Android 它使用 Jersey Servlet 实例化 Jetty 服务器 无论如何 当我启动 Jetty 并访问 REST 资源时 在我的例子中 h
  • Android - 如何合并两个视频

    基本上 我正在寻找一种将两个 mp4 视频文件 在 SD 卡上 组合在一起的方法 更像是在第一个视频的末尾附加第二个视频 我进行了很多搜索 但找不到合适的解决方案 好吧 我根本找不到任何解决方案 所以我的问题是 是否有一个库可以组合 并可能
  • Kotlin 中是否有类似于 #region #endregion 的语法?

    我知道我可以使用 region endregion 包围 C 中的代码片段 Kotlin 中是否有类似的语法 谢谢 region MyRegion protected void Page Load object sender EventAr
  • 如何自动更新Android Studio?

    我需要将 Android Studio 更新到 0 9 9 版本 但是当我按 下载 在更新信息对话框上 时 它会将我发送到此处 http developer android com sdk index html http developer
  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提

随机推荐

  • php服务不可用,ThinkPHP/Library/Vendor/Tcpdf/fonts/uni2cid_ak12.php · 白俊遥/thinkphp-bjyadmin - Gitee.com...

    unicode to cid conversion table is from ftp ftp oreilly com pub examples nutshell cjkv adobe cid2code txt in ak12 tar Z
  • SAP与 WebService接口的配置与调用

    SAP 能通过设置WebService与外部的webservice服务连接 1 进入事务 SE80 选择 Package 指定保存的开发包 如图 创建一个Enterprise Service 2 在弹出的下一个窗口中选择 URL HTTP
  • Unity2018打包图集(SpriteAtlas)以及使用

    将编辑器中Edit ProjectSettings Edit SpritePacker Mode设置为AlwaysEnabled Assets右键Create创建SpriteAtlas 将需要打包图集的图片文件夹选中 然后点击packpre
  • C语言:二分查找(折半查找),冒泡排序

    目录 一 二分查找 二分查找的需注意的细节 二 冒泡排序 冒泡排序需注意的细节 本篇博客详细讲解常用的几个方法 分别是二分查找和冒泡排序法 一 二分查找 二分查找 意思就是每次都分为两部分 将查找的数字和中间数字相比 判断大小后确定所查找数
  • ajax 填充下拉框,使用ajax填充下拉框--普通select

    1 与普通select有区别的是另一种带分组的select 2 带分组的select见另一篇 使用ajax填充下拉框 分组select 3 两者均使用ajax填充 数据来源于后台大哥 效果如下图 html 运营商 js callBack f
  • Centos 8.0中安装Redis服务器

    企业级开发中 经常需要把一些中间件安装在Linux服务上 主要考虑到linux服务器的性能吧 1 官网下载Linux版安装包 Redis 楼主使用的是 6 2 1 目前最新是6 2 6 差别不大 2 使用XShell 和Xftp连接Cent
  • 关于C++智能指针

    普通指针到智能指针的转换 int iPtr new int 42 shared ptr
  • Android Studio中的keystore

    跟着导师第一次做一个使用人数达到4位数的软件 软件提供了更新 结果在更新的时候发现 有的人显示的是已安装了存在签名冲突的同名数据包 不能安装 查了下发现是keystore的问题 直接用apk文件夹下的debug版本的apk放在服务器给他们安
  • JVM jmap命令

    作用 主要用来生成堆dump文件 C Users qianqian gt jmap h Usage jmap option
  • 为什么虚拟现实视频看上去那么粗糙?

    分辨率 Gear VR 可以支持超高分辨率 UHD 的播放 在像素方面 UHD视频每一帧有 3840 像素宽 x 1920 像素高的大小 视频经常播放 30 帧每秒 较低的分辨率也支持高帧率 Galaxy S6 手机显然是能够轻松地播放 4
  • docker内部sshfs

    container内部挂载前提 默认docker容器启动后无法通过sshfs挂载远程目录 可通过在构建container的时候添加 privileged 选项 挂载 sshfs xxx 111 111 111 11 remote dir l
  • Java实现飞机大战小游戏(一)

    day1 创建游戏窗口 1 设置背景图片 BaseFrame类 public class BaseFrame extends JFrame 设置窗体宽度和高度 public static int frameWidth 512 游戏界面宽度
  • cmake 提前结束处理命令: return

    有时候 我们有这样的需求 当处理到某个地方的时候 后面的我们都不想处理或者不需要处理的时候 就可以提前结束当前的处理逻辑 回到父级去处理 在C C 中 我们有break关键字跳出当前循环 continue关键字进入下一次循环 return关
  • 使用Redis作缓存时,怎么保证缓存和数据库的一致性?

    使用Redis作缓存时 怎么保证缓存和数据库的一致性 文章目录 使用Redis作缓存时 怎么保证缓存和数据库的一致性 1 先更新数据库 再更新缓存 2 先删缓存 再更新数据库 3 先更新数据库 再删缓存 其他造成缓存和数据库不一致的原因 方
  • 华为OD机试2022Q4【硬件产品销售方案】97%正确率

    200分的题目 对了97 题目记得不是很清楚了 给定一个amount 代表你这个企业拥有的钱 给定一行 代表一个工厂拥有的所有零件的价格 切库存无限量 例如 100 200 200 300 500 代表工厂有5种零件 每种零件单价为100
  • YARN核心组件功能特性分析

    1 YARN Client YARN Client 提交Application 到ResourceManager 它会首先创建一个Application上下文件对象 并设置ApplicationMaster必需的资源请求信息 然后提交到Re
  • 这个框架真心可以!10分钟就搞定一个网站!

    最近有很多小伙伴问我 有没有能快速能搭建网站的框架 首先我去尝试了低代码 快确实快 但是样式和功能确实差点意思 偶然间 我发现一款神奇的网站框架 VuePress 我尝试部署了下 然后一下爱上了它 我发现很多博主也都是用的这款框架搭建的个人
  • ntp服务器地址是什么协议,ntp服务器地址的介绍与解释

    ntp服务器地址的介绍与解释 分类 云服务资讯 编辑 浏览量 100 2021 07 23 14 43 16 NTP属于运用层协议 依据UDP传输 运用的端口号为123 用来同步网络中分布式时间服务器和客户端之间的时间 使网络中的设备供应依
  • 某宝sign逆向(以商品评论采集为例)

    文章目录 1 目标网址 2 携带参数分析 3 sign值逆向 4 以一个商品为例采集商品评论 往期逆向文章推荐 JS逆向之艺恩数据 JS逆向之今日头条 signature JS逆向之网易云音乐 JS逆向之巨量星图sign签名 JS逆向之巨量
  • Android内存如何优化?阿里技术员工整理亲授,建议收藏

    作者 山鱿鱼说 链接 https juejin cn post 7106289745499521054 基础知识 内存概念 VSS Virtual Set Size 虚拟耗用内存 包含共享库占用的内存 RSS Resident Set Si