Android Studio 2.1.2 在引用AAR的时候排除armeabi-v7a目录下的.so文件

Android Studio 2.1.2在引用AAR的时候,如果AAR中包含armeabi-v7a版本的.so文件,而我们自带的.so又仅仅包含armeabi版本的,会导致我们的APK在运行的时候崩溃,报告找不到.so文件,另外就是会增大我们最后的APK的大小,因此我们需要排除armeabi-v7a目录下的.so文件.
操作方法如下:

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi"
        }
    }
}

这个方法的本质是通过强制指定abi的方式来要求Android Studio排除其他系统版本的.so文件。

同样道理,可以用来在32位的APK中排除64位的.so文件,减少APK大小。

参考链接


How to use 32-bit native libaries on 64-bit Android device

迅雷BT任务提示“任务出错”,鼠标放到“任务出错”标签上,提示“任务信息请求失败”

迅雷BT任务提示"任务出错",鼠标放到"任务出错"标签上,提示"任务信息请求失败"。如下图所示:

20160626222938

点击任务向右的箭头之后,点击"连接情况"标签,可以看到如下的内容,尤其是红色的"查询BT资源信息失败(文件编号:1)",如下图:

20160626223215

这个信息说明,在BT文件中的第2个文件信息无法正常查询到,文件的编号是从0开始的。

此时,我们点击"文件列表"标签,去查看一下第2个文件,可以看到,仅仅是个没有太大意义的"RARGB.com.txt",如下图:

20160626223816

此时,我们去掉对于"RARGB.com.txt"的下载即可解决问题,如下图:

20160626224453

然后再次重新开始任务,会发现,任务已经可以正常开始了。

20160626224713

20160626224843

Android Studio 2.1.2版本计算代码覆盖率

Android Studio 2.1.2版本已经集成了JaCoCo用来进行代码覆盖的计算,严格上来说,这个功能并不是Android Studio实现的,而是IntelliJ IDEA早就实现的功能。

全部需要做的仅仅是在build.gradle中增加testCoverageEnabled = true即可,如下图:

testCoverageEnabled

然后,在命令行中执行

$ gradlew test createDebugCoverageReport

即可在每个子项目的build\reports\coverage\debug\下面会生成代码覆盖率的统计文件。点击index.html即可查看代码覆盖情况,目前看到的情况是,貌似只能统计到test目录下覆盖到的代码,而无法统计androidTest目录下的测试代码的覆盖情况。

参考链接


Dell Wireless 1397 WLAN Mini-Card在Window 10下无法启用蓝牙的解决方法

从目前的测试来看只能通过R159805这个应用来开启蓝牙,但是最新的Windows 10,系统版本 1511,OS版本10586.420的系统上面,只能开启蓝牙,安装的驱动属于Windows通用驱动,因此尽管可以看到蓝牙,却不能正常使用,比如罗技M336鼠标,是无法正常使用的。

参考链接


Thunderbird 45.1.1 提示“文件夹 收件箱 已满,无法保存更多消息。请删除旧邮件、不需要的邮件或者压缩文件夹来保存其他消息。”

Thunderbird使用时间长了之后,我是差不多两年多点了,打开提示“文件夹 收件箱 已满,无法保存更多消息。请删除旧邮件、不需要的邮件或者压缩文件夹来保存其他消息。”,如下图:

Thunderbird-4gb-mbox-limit

根据Thunderbird的中文帮助文档,可以看到如下内容:

如果数据文件夹大于 4 GB,您将会收到一个警告“文件夹已满,无法再容纳电子邮件”。在这种情况下,您必须删除某些电子邮件或移动它们至其他文件夹以减小文件夹大小。(目标文件夹大小在 1-3 GB 比较合适,具体大小取决于您的计算机的性能)

这个实际上是属于Thunderbird文件存储系统的策略问题,尽管文件系统可以处理超过4GB的文件。但是为了兼容一些古老的系统,导致即使是到了目前的版本,依旧无法处理超过4GB的文件。

目前Thunderbird一直是32位的应用,没有出64位的版本,尽管可以使用64位的API访问文件系统,但是还是默认保留了4GB的限制。

网上的删除全部的.msf的方法,只是能解决邮件发生过删除,而实际占有的空间没有释放,因而可以通过重建索引文件的方式,来缓解问题,但是如果从来没有删除过邮件,邮件实际占有的空间已经真实超过4GB的情况下,那么这些方法实际上是无效的。

正确的做法是Ctrl+A选中全部的邮件,然后右击,出现的菜单中选择"归档",即可。这样操作的实质,其实是使用子文件夹的方式突破单个文件夹4GB的限制。

Archives-Menu

归档完成后,Thunderbird会提示是否压缩收件箱来节省空间,此时,一定要允许,否则收件箱的大小不会发生变化,如果此时没有点击许可,也可以手工在收件箱上面右击,弹出的菜单中选择压缩

参考链接


Ubuntu 16.04上使用crosstool-ng建立树莓派2B的编译环境

环境准备


$ sudo apt-get -y update
$ sudo apt-get install -y bison flex texinfo gawk automake subversion
$ sudo apt-get install -y gperf help2man make libtool libncurses5-dev 
$ sudo apt-get install -y gcj-jdk python-dev g++
$ sudo apt-get install libtool-bin

编译crosstool-ng


$ git clone https://github.com/crosstool-ng/crosstool-ng.git
$ cd crosstool-ng
$ ./bootstrap
$ ./configure --prefix=/opt/crosstool-ng
$ make
$ sudo make install

然后加环境变量 export PATH=$PATH:/opt/crosstool-ng/bin

配置编译选项


$ mkdir toolchain
$ cd toolchain
$ ct-ng armv7-rpi2-linux-gnueabihf

如果想自己配置调整某些参数,则执行

$ ct-ng menuconfig

最后执行

$ ct-ng build

默认情况下,生成的编译工具在当前用户目录下的x-tools目录下,如果需要调整这个目录,可以参考
Mac OSX下执行crosstool-ng提示“Your file system ‘xxxx’ is *not* case-sensitive!”

编译树莓派源代码


Ubuntu 16.04 (x64)树莓派B+(Raspberry Pi  B+)源代码编译

参考链接


自己编译给树莓派的交叉编译工具

Mac OSX EI Capitan(10.11.5)上使用crosstool-ng 1.22.0 建立树莓派2B的编译环境

背景介绍


树莓派自带的编译工具是基于Linux的,在Mac OSX上是无法正常使用的,因此比较简单的方法就是使用crosstool-ng来建立交叉编译环境。

配置编译环境


1.安装HomeBrew,方便各种工具的安装

参考让Mac也能拥有apt-get类似的功能——Brew

2.使用HomeBrew安装crosstool-ng

$ sudo brew install crosstool-ng

3.链接Mac OSX上的installginstallMac OSX上没有ginstall

$ sudo ln -s /usr/local/bin/ginstall /usr/bin/install

如果不执行命令,则会报错

/Volumes/RPi-EABI/.build/tools/bin/install: line 2: exec: ginstall: not found

4.使用HomeBrew安装expat

$ sudo brew install expat

不执行此命令,我的电脑会出现crosstool-ng在配置expat的时候失败,但是两者使用的版本并不相同,另外貌似出错后,重试即可,不需要安装expat,但是稳妥起见,还是安装好了。
5.创建大小写区分的磁盘分区文件,并挂载(如果你系统创建的时候,系统分区以及区分大小写,则不必此项操作)

参考Mac OSX下执行crosstool-ng提示“Your file system ‘xxxx’  is *not* case-sensitive!”

6.在刚刚创建并挂载的大小写区分的磁盘上执行配置命令

$ ct-ng armv7-rpi2-linux-gnueabihf

7.修改刚刚命令生成在当前目录下的配置文件

$ sudo vim .config

找到

CT_WANTS_STATIC_LINK=y
CT_CC_GCC_STATIC_LIBSTDCXX=y

禁止使用静态链接(Mac OSX下,无法提供对于libc的静态链接,只能动态链接)

CT_WANTS_STATIC_LINK=n # set disabled
CT_CC_GCC_STATIC_LIBSTDCXX=n # set disabled or comment out

8.执行构建命令

$ ct-ng build

构建中遇到的问题


如果构建出错,可以使用

$ ct-ng build.1

后面的数字代表几个并行的任务,单个任务可以更方便的查看出错的信息,多任务并发会导致日志打印的非常混乱。

在构建(ct-ng build)的时候遇到任何问题,都应该查看当前构建目录下的build.log文件,这个文件中详细记录了构建的过程信息,详细的出错信息等。
由于crosstool-ng在构建过程中需要去服务器上下载源代码,难免出现文件下载不完整的情况,这种情况下,可以从build.log文件中看到如下的内容:

[FILE ]    tar: Retrying...
[FILE ]    tar: Damaged tar archive
[FILE ]    tar: Retrying...
[FILE ]    tar: Damaged tar archive
[FILE ]    tar: Retrying...
[FILE ]    tar: Damaged tar archive
[FILE ]    tar: Retrying...
[FILE ]    tar: Truncated tar archive
[FILE ]    tar: Error exit delayed from previous errors.

则说明下载的源代码出现了问题。最容易出现这个问题的是gcc.以gcc-5.2.0为例子,修正的方法如下:

$ cd .build

$ cd tarballs

$ rm -rf gcc-5.2.0.tar.bz2

$ cd ..

$ cd src

$ rm -rf .gcc-5.2.0.extracting

$ rm -rf gcc-5.2.0

简单解释一下代码,tarballs存储了从服务器上下载的全部源代码的压缩包,解压缩出现问题,因此必须删除,让crosstool-ng去重新下载,扩展名为.extracting文件为crosstool-ng的标记文件,用来标识这个包是不是已经被解压缩过,一旦这个文件存在crosstool-ng就认为对应的工具已经就绪了,就不会处理这个工具了,最后删除的是工具源代码的目录。

如果提示安装binutils的时候失败,如下所示:

[INFO ]  Installing binutils for host
[ERROR]    /Volumes/raspberry/rpi-linux/.build/src/binutils-2.25.1/gold/gold-threads.cc:288:13: error: expected expression
[ERROR]    make[5]: *** [gold-threads.o] Error 1
[ERROR]    make[4]: *** [all-recursive] Error 1
[ERROR]    make[3]: *** [all] Error 2
[ERROR]    make[2]: *** [all-gold] Error 2
[ERROR]    make[1]: *** [all] Error 2
[ERROR]   
[ERROR]  >>
[ERROR]  >>  Build failed in step 'Installing binutils for host'
[ERROR]  >>        called in step '(top-level)'
[ERROR]  >>
[ERROR]  >>  Error happened in: CT_DoExecLog[scripts/functions@216]
[ERROR]  >>        called from: do_binutils_backend[scripts/build/binutils/binutils.sh@240]
[ERROR]  >>        called from: do_binutils_for_host[scripts/build/binutils/binutils.sh@105]
[ERROR]  >>        called from: main[scripts/crosstool-NG.sh@646]
[ERROR]  >>
[ERROR]  >>  For more info on this error, look at the file: 'build.log'
[ERROR]  >>  There is a list of known issues, some with workarounds, in:
[ERROR]  >>      '/usr/local/Cellar/crosstool-ng/1.22.0/share/doc/crosstool-ng/crosstool-ng-1.22.0/B - Known issues.txt'
[ERROR]   
[ERROR]  (elapsed: 36:53.00)
[36:54] / make: *** [build] Error 1

查看build.log可以看到如下的内容:

[ERROR]    /Volumes/raspberry/rpi-linux/.build/src/binutils-2.25.1/gold/gold-threads.cc:288:13: error: expected expression
[ALL  ]        : once_(PTHREAD_ONCE_INIT)
[ALL  ]                ^
[ALL  ]    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/pthread.h:203:27: note: expanded from macro 'PTHREAD_ONCE_INIT'
[ALL  ]    #define PTHREAD_ONCE_INIT {_PTHREAD_ONCE_SIG_init, {0}}
[ALL  ]                              ^
[ALL  ]    1 error generated.
[ERROR]    make[5]: *** [gold-threads.o] Error 1
[ALL  ]    make[5]: *** Waiting for unfinished jobs....

这个BUG的原因是由于GCC的版本问题导致的,低于4.7版本的GCC无法理解这个语法,尽管Mac Osx已经使用最新的LLVM,但是遗憾的是,最新的LLVM并没有支持这个语法。解决方法如下:

$ vim /Volumes/raspberry/rpi-linux/.build/src/binutils-2.25.1/gold/gold-threads.cc

找到如下代码

// Class Once_initialize.  This exists to hold a pthread_once_t
// structure for Once.

class Once_initialize
{
 public:
  Once_initialize()
    : once_(PTHREAD_ONCE_INIT)
  { }

  // Return a pointer to the pthread_once_t variable.
  pthread_once_t*
  once_control()
  { return &this->once_; }

 private:
  pthread_once_t once_;
};

修改为:

// Class Once_initialize.  This exists to hold a pthread_once_t
// structure for Once.

class Once_initialize
{
 public:
  Once_initialize()
  {once_.__sig = _PTHREAD_ONCE_SIG_init; once_.__opaque[0] = 0;}

  // Return a pointer to the pthread_once_t variable.
  pthread_once_t*
  once_control()
  { return &this->once_; }

 private:
  pthread_once_t once_;
};

如果出现了"fatal error: bracket nesting level exceeded maximum of 256",如下所示:

[ERROR]    /Volumes/raspberry/rpi-linux/.build/src/gcc-5.2.0/gcc/config/arm/neon.md:3463:10917: fatal error: bracket nesting level exceeded maximum of 256
[ALL  ]    /Volumes/raspberry/rpi-linux/.build/src/gcc-5.2.0/gcc/config/arm/neon.md:3463:10917: note: use -fbracket-depth=N to increase maximum nesting level
[ALL  ]    47 warnings and 1 error generated.
[ERROR]    make[2]: *** [insn-attrtab.o] Error 1
[ALL  ]    make[2]: *** Waiting for unfinished jobs....
[ALL  ]    42 warnings generated.
[ALL  ]    18 warnings generated.
[ALL  ]    rm gcc.pod
[ERROR]    make[1]: *** [all-gcc] Error 2

则修改方法如下:

$ ct-ng menuconfig

在出现的界面中选择"Paths and misc options"项目
Crosstool-NG-PathAndMiscOptions

在第二级界面中不断下拉,找到"Extra host compiler flags",增加"-fbracket-depth=512",这个选项。

Crosstool-NG-PathAndMiscOptions-ExtraHostCompilerFlags

然后重新执行

$ ct-ng build

如果出现错误:

[ALL  ]    /var/folders/h8/_f6dzm814rn1pjrgxgfvcn900000gn/T//ccU8Jut6.s: Assembler messages:
[ALL  ]    /var/folders/h8/_f6dzm814rn1pjrgxgfvcn900000gn/T//ccU8Jut6.s:81: Error: invalid constant (af) after fixup
[ALL  ]    /var/folders/h8/_f6dzm814rn1pjrgxgfvcn900000gn/T//ccU8Jut6.s:163: Error: invalid constant (ff) after fixup
[ERROR]    make[3]: *** [/Volumes/raspberry/rpi-linux/.build/armv7-rpi2-linux-gnueabihf/build/build-libc-startfiles/csu/libc-start.o] Error 1

这个是由于LLVM目前的版本还无法正确的理解部分GCC的汇编部分的写法,导致编译失败,而这部分的语法一般都是用在优化的时候出现错误,因此我们需要禁用这部分的优化,使用"Paths and misc options"->"Extra host compiler flags"增加 "-fno-unroll-loops"。如下图:
Crosstool-NG-PathAndMiscOptions-ExtraHostCompilerFlags-NoUnrollloops
如果出现如下错误:

[ERROR]    make[3]: *** [iconvdata/others] Error 2
[ERROR]    make[2]: *** [all] Error 2
[ALL  ]    make[4]: *** No rule to make target `/Volumes/raspberry/rpi-linux/.build/armv7-rpi2-linux-gnueabihf/build/build-libc-final/iconvdata/MIK.so', needed by `others'.  Stop.
[ERROR]    make[3]: *** [iconvdata/others] Error 2
[ERROR]    make[2]: *** [all] Error 2
[ERROR]  
[ERROR]  >>
[ERROR]  >>  Build failed in step 'Installing C library'
[ERROR]  >>        called in step '(top-level)'

这个问题是由于编译的时候,同时打开的文件数量超过了256导致的,修复方式为在shell中增大同时打开的文件数量限制到1024

$ ulimit -n 1024

然后在同一个shell中继续执行

$ ct-ng build

如果出现如下错误,则直接忽略即可:

[INFO ]  Installing final gcc compiler
[ERROR]    clang: error: unsupported option '-print-multi-os-directory'
[ERROR]    clang: error: no input files

至于其他问题,貌似重试一下就可以解决了。

编译树莓派源代码


Ubuntu 16.04 (x64)树莓派B+(Raspberry Pi  B+)源代码编译

参考链接


Mac OSX下执行crosstool-ng提示“Your file system ‘xxxx’ is *not* case-sensitive!”

Mac下面使用HomeBrew安装了crosstool-ng来编译树莓派的代码,结果在执行的时候报告如下错误:

$ ct-ng build
[INFO ] Performing some trivial sanity checks
[ERROR] Your file system in '/Users/Documents/rpi/rpi-linux/.build' is *not* case-sensitive!
[ERROR]
[ERROR] >>
[ERROR] >> Build failed in step '(top-level)'
[ERROR] >>
[ERROR] >> Error happened in: CT_Abort[scripts/functions@329]
[ERROR] >> called from: CT_TestAndAbort[scripts/functions@351]
[ERROR] >> called from: main[scripts/crosstool-NG.sh@93]
[ERROR] >>
[ERROR] >> For more info on this error, look at the file: 'build.log'
[ERROR] >> There is a list of known issues, some with workarounds, in:
[ERROR] >> '/usr/local/Cellar/crosstool-ng/1.22.0/share/doc/crosstool-ng/crosstool-ng-1.22.0/B - Known issues.txt'
[ERROR]
[ERROR] (elapsed: 24422614:07.00)
[00:01] / make: *** [build] Error 1

比较简单的解决方法就是创建一个支持大小写区分的文件,作为一个分区挂载,然后把代码拷贝到这个分区中执行编译。

1.创建分区文件

$ hdiutil create -volname "Raspberry" -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 20g raspberry.dmg

2.挂载分区

早期版本的Mac OS X

$ hdiutil attach raspberry.dmg -mountpoint /Volumes/raspberry

#  切换到挂载目录
$ cd /Volumes/raspberry/

对于OS X EI Capitan(10.11.5)版本而言,生成的文件名变成了raspberry.dmg.sparseimage因此需要使用这个文件来挂载

$ hdiutil attach raspberry.dmg.sparseimage -mountpoint /Volumes/raspberry

#  切换到挂载目录
$ cd /Volumes/raspberry/

挂载后会在桌面生成一个名为Raspberry的磁盘文件夹生成,直接操作这个目录即可。

3.修改crosstool-ng的编译工具下载目录

$ ct-ng menuconfig

如下图的方式进行操作:

1.选择"Paths and misc options",并选中"Select"之后点击回车按键

Crosstool-NG-PathAndMiscOptions

2.点击向下的方向按键,,找到"(${Home}/src) Local tarballs directory",这个项,并选中"Select"之后点击回车按键,修改为"/Volumes/raspberry/src",然后继续向下,找到"(${Home}/x-tools/${CT_TARGET}) Prefix directory",这个项,并选中"Select"之后点击回车按键,修改为"/Volumes/raspberry/x-tools/${CT_TARGET}"

Crosstool-NG-PathAndMiscDirectory
Crosstool-NG-PathAndMiscOptionsPrefixDirectoryVolumesraspberry

修改后的结果如下图:

Crosstool-NG-PathAndMiscDirectoryChange
完成操作后,不断快速按下Esc按键,在最后弹出的确认保存窗口中选择保存即可,如下图:

Crosstool-NG-Configure-Save

4.卸载分区

$ hdiutil detach /Volumes/raspberry