Android NDK 生成不合理的大二进制文件,如何优化 .so 大小?

2023-12-23

我注意到 Android NDK (r6b在我的例子中)产生不合理的大结果 .so 文件。例如,在我的例子中,我有大约 150-200 行 C++ 代码(6 个本机方法和 3 个 C++ 最简单的类),并且此本机代码生成60kb (!)具有启用的异常和 RTTI 的 .so 或具有禁用的异常和 RTTI 的 12kb .so。只是为了检查我是否已编译你好-jni示例包含在 NDK 包中,并从此示例中获取 10kb .so 用于单行本机方法。

在我看来,这对于移动平台来说是不合理的开销(在我的桌面上,类似大小的代码产生的开销要少大约 10-15 倍。所以)。

  1. 我应该知道一些技巧来减少二进制文件的大小吗?
  2. 为什么纯 C 代码会有如此大的开销?
  3. 为什么启用异常和 RTTI 的 C++ 代码的开销更大?

更新#1:来自 NDK 的 hello-jni 示例的 readelf 输出

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0xc18
  Start of program headers:          52 (bytes into file)
  Start of section headers:          9344 (bytes into file)
  Flags:                             0x5000002, has entry point, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         5
  Size of section headers:           40 (bytes)
  Number of section headers:         19
  Section header string table index: 18

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .hash             HASH            000000d4 0000d4 0001a4 04   A  2   0  4
  [ 2] .dynsym           DYNSYM          00000278 000278 000420 10   A  3   3  4
  [ 3] .dynstr           STRTAB          00000698 000698 0004aa 00   A  0   0  1
  [ 4] .rel.dyn          REL             00000b44 000b44 000048 08   A  2   0  4
  [ 5] .rel.plt          REL             00000b8c 000b8c 000030 08   A  2   6  4
  [ 6] .plt              PROGBITS        00000bbc 000bbc 00005c 04  AX  0   0  4
  [ 7] .text             PROGBITS        00000c18 000c18 001518 00  AX  0   0  4
  [ 8] .rodata           PROGBITS        00002130 002130 000014 01 AMS  0   0  4
  [ 9] .ARM.extab        PROGBITS        00002144 002144 000024 00   A  0   0  4
  [10] .ARM.exidx        ARM_EXIDX       00002168 002168 0000e0 00  AL  7   0  4
  [11] .init_array       INIT_ARRAY      00003248 002248 000008 00  WA  0   0  1
  [12] .fini_array       FINI_ARRAY      00003250 002250 00000c 00  WA  0   0  1
  [13] .dynamic          DYNAMIC         0000325c 00225c 0000e8 08  WA  3   0  4
  [14] .got              PROGBITS        00003344 002344 000040 04  WA  0   0  4
  [15] .bss              NOBITS          00003390 002384 000010 00  WA  0   0 16
  [16] .comment          PROGBITS        00000000 002384 000036 00      0   0  1
  [17] .ARM.attributes   ARM_ATTRIBUTES  00000000 0023ba 000029 00      0   0  1
  [18] .shstrtab         STRTAB          00000000 0023e3 00009b 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x002168 0x00002168 0x00002168 0x000e0 0x000e0 R   0x4
  LOAD           0x000000 0x00000000 0x00000000 0x02248 0x02248 R E 0x1000
  LOAD           0x002248 0x00003248 0x00003248 0x0013c 0x00158 RW  0x1000
  DYNAMIC        0x00225c 0x0000325c 0x0000325c 0x000e8 0x000e8 RW  0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     .ARM.exidx 
   01     .hash .dynsym .dynstr .rel.dyn .rel.plt .plt .text .rodata .ARM.extab .ARM.exidx 
   02     .init_array .fini_array .dynamic .got .bss 
   03     .dynamic 
   04     

Dynamic section at offset 0x225c contains 25 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x0000000e (SONAME)                     Library soname: [libhello-jni.so]
 0x00000010 (SYMBOLIC)                   0x0
 0x00000019 (INIT_ARRAY)                 0x3248
 0x0000001b (INIT_ARRAYSZ)               8 (bytes)
 0x0000001a (FINI_ARRAY)                 0x3250
 0x0000001c (FINI_ARRAYSZ)               12 (bytes)
 0x00000004 (HASH)                       0xd4
 0x00000005 (STRTAB)                     0x698
 0x00000006 (SYMTAB)                     0x278
 0x0000000a (STRSZ)                      1194 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000003 (PLTGOT)                     0x3344
 0x00000002 (PLTRELSZ)                   48 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0xb8c
 0x00000011 (REL)                        0xb44
 0x00000012 (RELSZ)                      72 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x00000016 (TEXTREL)                    0x0
 0x6ffffffa (RELCOUNT)                   7
 0x00000000 (NULL)                       0x0

Relocation section '.rel.dyn' at offset 0xb44 contains 9 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000c24  00000017 R_ARM_RELATIVE   
00003254  00000017 R_ARM_RELATIVE   
00003368  00000017 R_ARM_RELATIVE   
0000336c  00000017 R_ARM_RELATIVE   
00003374  00000017 R_ARM_RELATIVE   
00003378  00000017 R_ARM_RELATIVE   
00003380  00000017 R_ARM_RELATIVE   
00003370  00001015 R_ARM_GLOB_DAT    00000000   __cxa_call_unexpected
0000337c  00003215 R_ARM_GLOB_DAT    00000000   __gnu_Unwind_Find_exid

Relocation section '.rel.plt' at offset 0xb8c contains 6 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00003350  00000d16 R_ARM_JUMP_SLOT   00000000   __cxa_begin_cleanup
00003354  00001216 R_ARM_JUMP_SLOT   00000000   memcpy
00003358  00001416 R_ARM_JUMP_SLOT   00000000   __cxa_finalize
0000335c  00001f16 R_ARM_JUMP_SLOT   00000000   abort
00003360  00002a16 R_ARM_JUMP_SLOT   00000000   __cxa_type_match
00003364  00003216 R_ARM_JUMP_SLOT   00000000   __gnu_Unwind_Find_exid

There are no unwind sections in this file.

Symbol table '.dynsym' contains 66 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000c18     0 SECTION LOCAL  DEFAULT    7 
     2: 00003390     0 SECTION LOCAL  DEFAULT   15 
     3: 00001c64    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_ForcedUnwind
     4: 00001668   164 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_RaiseExcepti
     5: 00001b20     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP
     6: 00001c40    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Resume_or_Rethrow
     7: 00002248     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_end
     8: 000011c0     8 FUNC    GLOBAL DEFAULT    7 __aeabi_unwind_cpp_pr0
     9: 00001d4c    44 FUNC    GLOBAL DEFAULT    7 _Unwind_GetRegionStart
    10: 00001c40    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Resume_or_Rethr
    11: 000033a0     0 NOTYPE  GLOBAL DEFAULT  ABS _bss_end__
    12: 00001c88    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Backtrace
    13: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_begin_cleanup
    14: 00001b04    20 FUNC    GLOBAL DEFAULT    7 __restore_core_regs
    15: 00001b40     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP_D_1
    16: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_call_unexpected
    17: 00000cf0     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetCFA
    18: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy
    19: 00000c8c    76 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Set
    20: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_finalize
    21: 00003250     0 NOTYPE  GLOBAL DEFAULT   12 __FINI_ARRAY__
    22: 00003384     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__
    23: 00001404   212 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Backtrace
    24: 00003390     4 OBJECT  GLOBAL DEFAULT   15 __dso_handle
    25: 00001b30     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP_D
    26: 00001798   876 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Pop
    27: 000011b0     8 FUNC    WEAK   DEFAULT    7 __aeabi_unwind_cpp_pr2
    28: 00001c88    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Backtrace
    29: 00002168     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_start
    30: 00001bf8    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_RaiseException
    31: 00000000     0 FUNC    GLOBAL DEFAULT  UND abort
    32: 00001c1c    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Resume
    33: 00001b48     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_WMMX
    34: 00001b18     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP
    35: 00001c1c    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Resume
    36: 00000cfc    32 FUNC    GLOBAL DEFAULT    7 _Unwind_DeleteException
    37: 00000cf8     4 FUNC    GLOBAL DEFAULT    7 _Unwind_Complete
    38: 000033a0     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_end__
    39: 00003248     0 NOTYPE  GLOBAL DEFAULT   11 __INIT_ARRAY__
    40: 00001d78   888 FUNC    GLOBAL DEFAULT    7 __gnu_unwind_execute
    41: 00001b28     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP_
    42: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_type_match
    43: 0000172c   108 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Resume
    44: 00001b38     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP_
    45: 00001bf8    36 FUNC    GLOBAL DEFAULT    7 _Unwind_RaiseException
    46: 00003384     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    47: 000033a0     0 NOTYPE  GLOBAL DEFAULT  ABS __end__
    48: 000015f4    28 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_ForcedUnwind
    49: 0000170c    32 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Resume_or_Re
    50: 00000000     0 FUNC    WEAK   DEFAULT  UND __gnu_Unwind_Find_exidx
    51: 00001b04    20 FUNC    GLOBAL DEFAULT    7 restore_core_regs
    52: 00001be4     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_WMMXC
    53: 00001d04     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetTextRelBase
    54: 00000c29    24 FUNC    GLOBAL DEFAULT    7 Java_com_example_hellojni
    55: 00001d14    56 FUNC    GLOBAL DEFAULT    7 _Unwind_GetLanguageSpecif
    56: 00000c40    76 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Get
    57: 00001bd0     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_WMMX
    58: 000020f0    64 FUNC    GLOBAL DEFAULT    7 __gnu_unwind_frame
    59: 00001c64    36 FUNC    GLOBAL DEFAULT    7 _Unwind_ForcedUnwind
    60: 00003384     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    61: 000033a0     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    62: 00001b8c     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_WMMXD
    63: 000011b8     8 FUNC    WEAK   DEFAULT    7 __aeabi_unwind_cpp_pr1
    64: 00001d0c     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetDataRelBase
    65: 00003384     0 NOTYPE  GLOBAL DEFAULT   14 __data_start

Histogram for bucket list length (total of 37 buckets):
 Length  Number     % of total  Coverage
      0  5          ( 13.5%)
      1  14         ( 37.8%)     22.2%
      2  9          ( 24.3%)     50.8%
      3  6          ( 16.2%)     79.4%
      4  2          (  5.4%)     92.1%
      5  1          (  2.7%)    100.0%

No version information found in this file.
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "5TE"
  Tag_CPU_arch: v5TE
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-1
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align8_needed: Yes
  Tag_ABI_align8_preserved: Yes, except leaf SP
  Tag_ABI_enum_size: int

您可能会看到与以下提供的差异@Joel F,尤其是有关堆栈展开的内容(对于 C++ 异常?)

更新#2

问题出在 NDK r6b 中包含的工具链中,特别是与链接器有关。谢谢@Joel F有关先前 NDK 版本的胶水。我已将 NDK r5c 与 NDK r6b 一起安装并比较结果。编译器通过两个工具链生成相同的目标文件,但链接后结果不同。


EDIT 3我能够使用 NDK r6b 重现 10KB hello-jni 二进制文件。我发现了一个可怕的黑客here http://embdev.net/topic/201054。基本上将这一行放入您的文件之一中:

char __aeabi_unwind_cpp_pr0[0];

但是你的代码将缺乏异常处理(我认为这是重点-fno-exceptions....)

无论如何,这使 libhello-jni.so 对我来说减少到了 2228 字节。仍然比 r5c 大,但比 10KB 小很多。

EDIT 2是的,您的 readelf 输出中似乎有很多与 C++ 相关的开销。也许他们在 r5c 和 r6b 之间做了一些改变? r5c的hello-jni.c中没有C++代码。

我有 160 行 C 代码,NDK r5c 将其缩减为 3.8KB .so。请尝试以下操作来查看造成大小的原因:

/path/to/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/<platform>/bin/arm-linux-androideabi-readelf -a libmylib.so

EDIT我使用 NDK r5c 构建了 hello-jni 示例以及生成的结果libhello-jni.so文件大小为 1588 字节。

构建命令:

ndk-build V=1

构建输出:http://pastebin.com/AdRDVbnF http://pastebin.com/AdRDVbnF(显然 SO 对行长度或其他东西有限制)。

输出来自readelf -a libhello-jni.so:



ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x2dc
  Start of program headers:          52 (bytes into file)
  Start of section headers:          1108 (bytes into file)
  Flags:                             0x5000002, has entry point, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         5
  Size of section headers:           40 (bytes)
  Number of section headers:         12
  Section header string table index: 11

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .hash             HASH            000000d4 0000d4 00004c 04   A  2   0  4
  [ 2] .dynsym           DYNSYM          00000120 000120 0000e0 10   A  3   2  4
  [ 3] .dynstr           STRTAB          00000200 000200 0000db 00   A  0   0  1
  [ 4] .text             PROGBITS        000002dc 0002dc 00002c 00  AX  0   0  4
  [ 5] .rodata           PROGBITS        00000308 000308 000014 00   A  0   0  4
  [ 6] .ARM.exidx        ARM_EXIDX       0000031c 00031c 000008 00  AL  4   0  4
  [ 7] .dynamic          DYNAMIC         00001324 000324 000088 08  WA  3   0  4
  [ 8] .got              PROGBITS        000013ac 0003ac 00000c 04  WA  0   0  4
  [ 9] .comment          PROGBITS        00000000 0003b8 000012 00      0   0  1
  [10] .ARM.attributes   ARM_ATTRIBUTES  00000000 0003ca 000029 00      0   0  1
  [11] .shstrtab         STRTAB          00000000 0003f3 000061 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x00031c 0x0000031c 0x0000031c 0x00008 0x00008 R   0x4
  LOAD           0x000000 0x00000000 0x00000000 0x00324 0x00324 R E 0x1000
  LOAD           0x000324 0x00001324 0x00001324 0x00094 0x00094 RW  0x1000
  DYNAMIC        0x000324 0x00001324 0x00001324 0x00088 0x00088 RW  0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     .ARM.exidx 
   01     .hash .dynsym .dynstr .text .rodata .ARM.exidx 
   02     .dynamic .got 
   03     .dynamic 
   04     

Dynamic section at offset 0x324 contains 12 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x0000000e (SONAME)                     Library soname: [libhello-jni.so]
 0x00000010 (SYMBOLIC)                   0x0
 0x00000004 (HASH)                       0xd4
 0x00000005 (STRTAB)                     0x200
 0x00000006 (SYMTAB)                     0x120
 0x0000000a (STRSZ)                      219 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000000 (NULL)                       0x0

There are no relocations in this file.

There are no unwind sections in this file.

Symbol table '.dynsym' contains 14 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000002dc     0 SECTION LOCAL  DEFAULT    4 
     2: 00000324     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_end
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr0
     4: 000013b8     0 NOTYPE  GLOBAL DEFAULT  ABS _bss_end__
     5: 000013b8     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__
     6: 0000031c     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_start
     7: 000013b8     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_end__
     8: 000013b8     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
     9: 000013b8     0 NOTYPE  GLOBAL DEFAULT  ABS __end__
    10: 000002dd    44 FUNC    GLOBAL DEFAULT    4 Java_com_example_hellojni
    11: 000013b8     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    12: 000013b8     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    13: 000013b8     0 NOTYPE  GLOBAL DEFAULT    8 __data_start

Histogram for bucket list length (total of 3 buckets):
 Length  Number     % of total  Coverage
      0  0          (  0.0%)
      1  0          (  0.0%)      0.0%
      2  1          ( 33.3%)     16.7%
      3  0          (  0.0%)     16.7%
      4  1          ( 33.3%)     50.0%
      5  0          (  0.0%)     50.0%
      6  1          ( 33.3%)    100.0%

No version information found in this file.
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "5TE"
  Tag_CPU_arch: v5TE
  Tag_THUMB_ISA_use: Thumb-1
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align8_needed: Yes
  Tag_ABI_align8_preserved: Yes, except leaf SP
  Tag_ABI_enum_size: int
  Tag_ABI_optimization_goals: Aggressive Debug
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android NDK 生成不合理的大二进制文件,如何优化 .so 大小? 的相关文章

  • 如何获取之前的碎片?

    为了在我的应用程序中重用某些片段 我需要知道哪个片段是返回堆栈上的第二个片段 为了做到这一点 我正在使用getFragmentManager getFragments 显示以下错误 但有效 FragmentManager getFragme
  • Android 在打开应用程序时会广播吗?

    例如 如果我想知道Youtube何时打开 是否有与之相关的广播 我当然知道我可以轮询 logcat 消息来检查活动 但我可以通过广播来做到这一点吗 因为它会少得多的耗电 此链接似乎表明这是不可能的 如何跟踪 Android 中的应用程序使用
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Android 上的 SVG 支持

    Android 支持 SVG 吗 有什么例子吗 最完整的答案是这样的 Android 2 x 默认浏览器本身不支持 SVG Android 3 默认浏览器支持 SVG 要将 SVG 支持添加到 2 x 版本的平台 您有两个基本选择 安装功能
  • 安卓定位不准确

    我正在尝试获取当前用户的位置 我试图重构我的代码以获得更好的结果 但我只是不断得到关于准确度的荒谬位置 它在 900 600 米之间 如何才能得到更好的结果 使其精度达到50m以内 这是我的代码 package com agam mapsl
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 调试:在 Android 1.0 中找不到文件

    今天我更新到 Android Studio v 1 0 在尝试编译任何项目时出现以下错误 app build intermediates classes debug 找不到文件 问题是在更新之前我没有任何问题 这是我实际尝试编译的代码 构建
  • 如何解决 Firebase AuthUi 中无法找到显式活动?

    使用 firebase UI 时 我无法找到显式活动类 com firebase ui auth KickoffActivity protected void onCreate Bundle savedInstanceState super
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • 如何在android中设置权限WRITE_SECURE_SETTINGS? [复制]

    这个问题在这里已经有答案了 我正在尝试启用 4 0 以上的辅助功能服务设置 但它显示异常 即 引起原因 java lang SecurityException 权限拒绝 写入安全设置需要 android permission WRITE S
  • AudioTrack、SoundPool 或 MediaPlayer,我应该使用哪个?

    如果我需要能够 播放多个音频文件 具有不同的持续时间 例如 5 到 30 秒 独立设置右 左声道的音量 应用声音效果 如混响 失真 那么 我应该使用哪个 API 另外 我在 AudioTrack API 上找不到太多文档 有谁知道在哪里可以
  • glTexImage2D: 之前出错:( 0x506 内部 0x1908 格式 0x1908 类型 0x1401

    当使用 Android Studio 运行模拟器时 我在模拟器屏幕上看不到任何内容 一切都是黑色的 我得到以下事件日志 模拟器 glTexImage2D 出错了 0x506 内部 0x1908 格式 0x1908 类型 0x1401 我已经
  • 如何在 Android 模块中使用 FirebaseAuth

    我正在开发一个聊天库 我想在其中显示登录用户的对话 制作该库的原因是我想将其集成到多个项目中 我现在面临的问题是FirebaseAuth表示用户尚未登录 FirebaseAuth getInstance mFirebaseApp getCu
  • 如何在TableLayout中创建三列

    我正在开发一个使用的屏幕TableLayout 在这里我可以轻松创建两列 但我怎样才能创建三列呢 这里有一个例子
  • 获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度

    我知道如何使用 getOrientation 方法获取手机 y 轴和磁北之间的方向角 如此处所述https developer android com guide topics sensors sensors position https
  • 在 React Native 中调试应用程序崩溃

    我是 React Native 新手 我正在尝试安装 React Native Facebook SDK 以便我可以使用我的应用程序进行 Facebook 登录 我按照此处列出的步骤操作 https tylermcginnis com in
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 如何在 Viewpager 中禁用预加载下一页? [复制]

    这个问题在这里已经有答案了 如何在 Viewpager 中禁用页面预加载 I tried viewPager setOffscreenPageLimit 0 但它不起作用 用这个viewPager setOffscreenPageLimit
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android

随机推荐

  • RStudio 中的 install.keras() 失败并出现 http 连接错误

    我一直试图在 RStudio Windows 中安装并运行 keras 但没有成功 我使用普通包 keras 安装了 keras 包 没有使用github 我已经安装了最新的 python 3 6 和 Anaconda 然后我用 gt li
  • 使用 pdfkit 时可以在同一段落中混合使用字体粗细吗?

    我正在尝试寻找一种使用方法粗体字体粗细用于内联强调pdfkit http pdfkit org 不幸的是 我无法找到一种在不强制换行的情况下更改字体的方法 不利于内联强调 我正在尝试类似的事情 pdf text Hello LEFT 200
  • EGIT 分支本地与远程跟踪

    我是 GIT 新手 我将 EGIT 与 eclipse 一起使用 我有一个关于分支机构的问题 我在其中看到 本地 和 远程跟踪 两个部分 如果我必须在其中一个分支机构工作 我认为有两种方法可以完成它 a 检查远程跟踪下的 origin fe
  • Yii2 - 将变量从视图传递到 Gridview 自定义操作列

    我想保存用户在单击页面的 gridview 小部件中的 编辑 按钮之前访问的最后一个位置 我创建了一个名为 lastAddress 的变量 但我真的不知道如何将其传递到 gridview 并将其附加到 编辑 按钮的 url 变量中 谁能告诉
  • SecTrustEvaluate 上始终为 EXC_BAD_ACCESS

    我在用苹果的示例代码 https developer apple com library mac documentation security conceptual CertKeyTrustProgGuide iPhone Tasks iP
  • 在 OpenGL 上映射 Wavefront .obj 纹理顶点

    一位艺术家给了我所有 3D 模型 让我导出为 obj 和 mtl 以便我可以使用 OpenGL 渲染它 但我不明白为什么纹理顶点大于 1 有时甚至是负值 看一下这个例子 vn 0 000717425 0 00106739 0 0099169
  • 错误:在 Android 中添加“splits”后找不到 EOCD

    我在 gradle 中使用以下拆分代码来减小 APK 大小 splits abi Enable ABI split enable true Clear list of ABIs reset Specify each architecture
  • 如何依赖注入 SignInManager?

    我有一个 Web API 应用程序 我正在使用第 3 方身份验证 Firebase 身份验证 我的身份验证工作正常 但一旦用户登录到我的服务器 我想将凭据和用户数据保存到我的 ASP NET Identity 表中 如果我在 Startup
  • PHP:在包含文件中“使用”? [复制]

    这个问题在这里已经有答案了 在 PHP 中使用命名空间时 您可以执行以下操作 是否可以将 use 行放入包含文件中 如果有几十个这样的 use 语句 那么将它们写入您需要它们的每个文件中是非常烦人的 但 use 语句仅适用于当前文件 并且在
  • cookie 和桌面应用程序

    据我所知 网站会向浏览器发送 cookie 以维护某些状态 浏览器会将其存储在本地 当再次访问该网站时 浏览器会将这些 cookie 作为请求的一部分发送回网站 我的印象是 cookie 是浏览器特定的东西 我想澄清这一理解 连接到 Web
  • 如何找到 COM prog id?

    我想通过后期绑定访问 COM 库 我怎样才能找到它的progID Type oClassType Type GetTypeFromProgID THE MISSING PROGID progID 通常采用 Library Class 形式
  • 更新单元格电子表格时,请求的身份验证范围不足 [403]

    在 Google Developer Console 中 Sheet API 已启用 我使用与访问电子表格相同的密钥 当我读取数据时 一切正常 我在 requestUp Execute 上收到请求身份验证范围不足的错误 using Syst
  • 正则表达式lookbehind (JS) 中的可选字符

    我正在尝试使用正则表达式来解析模板中的一些内容 有开始标签和结束标签 但我只想选择这些标签之间的内容 以便我可以 String replace 内容看起来像这样 OpenTag The Content I want CloseTag Ope
  • JHipster Eclipse 项目在“main”中运行内存不足

    我正在构建一个基线 JHipster 项目 不涉及任何附加功能 没有集群等 我使用标准的支持 Node 的 当然 命令行遵循确切的教程步骤 然后将项目作为 Maven 项目导入到 Eclipse 中 根据检查项目 一切看起来都应该工作正常
  • 通过API获取Hbase区域大小

    我正在尝试为 Hbase 编写一个平衡器工具 它可以按区域计数和 或区域大小 storeFile 大小的总和 平衡表的区域服务器之间的区域 我找不到任何返回区域大小或相关信息的 Hbase API 类 我已经检查了一些可用于获取其他表 区域
  • Android JNI - 将 jstring 转换为 wchar_t 的可靠方法

    在我的 Android JNI 代码中 我需要将 jstring 转换为 wchar t 我找到的最接近的参考是如何将 jstring 转换为 wchar t https stackoverflow com questions 68042
  • ASP.NET MVC:返回重定向和ViewData

    我的 MasterPage 中有一个登录框 每当登录信息不正确时 我都会评估ViewData loginError 向用户显示错误消息 登录是 UserController 的一个操作 因此包含登录的表单有action User Login
  • 访问对象数组中的 object.variable

    我需要这段代码的帮助 public class ParkingLot static int MAX 5 static Car Slot new Car MAX public static void main String args Slot
  • Postgresql COPY CSV 错误:最后一个预期列后有额外数据

    我正在尝试从以下位置导入数据http www unitedstateszipcodes org zip code database http www unitedstateszipcodes org zip code database 数据
  • Android NDK 生成不合理的大二进制文件,如何优化 .so 大小?

    我注意到 Android NDK r6b在我的例子中 产生不合理的大结果 so 文件 例如 在我的例子中 我有大约 150 200 行 C 代码 6 个本机方法和 3 个 C 最简单的类 并且此本机代码生成60kb 具有启用的异常和 RTT