安卓版的Firefox如何关闭打开某些网页时自动启动本地APP

手机上已经安装了手机淘宝的APP,或者有天猫店铺网店的页面,比如飞歌导航的官网,如果Firefox打开这个网页,就会自动启动手机淘宝APP,导致整个系统非常卡顿。

下面我们看如何关闭这个功能,如下图:

继续阅读安卓版的Firefox如何关闭打开某些网页时自动启动本地APP

Android Studio 2.3调试小米手机安装失败

Android Studio 2.3调试小米手机MIUI 8.7.4的时候,安装APK一直失败,错误信息如下:

$ adb install-multiple -r /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_7.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_6.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_8.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_9.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_3.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_4.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/dep/dependencies.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_2.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_5.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_0.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_1.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/outputs/apk/app-debug.apk 
$ adb shell pm uninstall com.guo.duoduo.anyshareofandroid
$ adb install-multiple -r /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_7.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_6.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_8.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_9.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_3.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_4.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/dep/dependencies.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_2.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_5.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_0.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/intermediates/split-apk/debug/slices/slice_1.apk /Users/longsky/Source/AnyShareOfAndroid/app/build/outputs/apk/app-debug.apk 
$ adb shell pm uninstall com.guo.duoduo.anyshareofandroid
DELETE_FAILED_INTERNAL_ERROR
Error while Installing APKs

网上查询了一下,是MIUI自身的优化导致的问题。
解决方法就是在MIUI->设置->更多设置->开发者选项->启用MIUI优化,关闭这个选项就可以了。

参考链接


Android Studio 2.3 adb install-multiple Failed to create session Failure [UNS...

macOS Sierra (10.12.3)使用Android Studio 2.2.3导入Android 5.1.1_r38 (Lollipop)源代码

1.编译Android 5.1.1_r38源代码

参考链接:
macOS Sierra (10.12.3)上编译ARM版本Android 5.1.1_r38 (Lollipop)源代码

2.调整Android Studio的属性

默认情况下,macOS的磁盘分区文件名是不区分大小写的,但是我们编译的Android 5.1.1_r38源代码却是在新建的一个区分大小写的分区上的,因此需要临时要求Android Studio区分文件名的大小写。

$ vim ~/Library/Preferences/AndroidStudio2.2/idea.properties

在其中增加

idea.case.sensitive.fs=true

3. 编译Android SDK

Android SDK我们需要自己编译注意,此时磁盘空间可能已经不足了,我们首先增大一下磁盘空间

$ hdiutil detach /Volumes/android

$ hdiutil resize -size 100G ~/Android/android.dmg.sparseimage

$ hdiutil attach ~/Android/android.dmg.sparseimage -mountpoint /Volumes/android

$ export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)

$ cd /Volumes/android

$ cd Android_Source

$ source build/envsetup.sh

$ lunch sdk-eng

$ export TARGET_BUILD_TYPE=debug

由于我们修改了TARGET_BUILD_TYPE,因此需要调整代码

$ vim ./development/build/sdk.atree

全部替换里面的${OUT_DIR}/target${OUT_DIR}/debug/target

编译代码

$ make sdk -j8

编译好的文件在out/host/darwin-x86/sdk/sdk目录下面。

4.生成工程文件

工程目录与编译目录相同

$ cd /Volumes/android

$ cd Android_Source

$ mmm development/tools/idegen/

$ ./development/tools/idegen/idegen.sh

$ rm -rf .classpath

编译完成后,在/Volumes/android目录下,生成android.ipr,然后用Android Studio 2.2.3导入已经存在的项目即可,导入后,需要比较长时间建立索引,要耐心等待。

导入完成后,根据错误提示,设置JDK为我们编译内核时候的JDK,设置Android SDK为我们刚刚编译的版本即可。
File->Project Structure->Project Settings->Project->Project SDK中设置JDK版本。

File->Project Structure->Project Settings->Modules->android->Dependencies中设置Android SDK路径以及版本。

参考链接


macOS Sierra (10.12.3)上编译ARM版本Android 5.1.1_r38 (Lollipop)源代码

前置条件


  • macOS Sierra  (10.12.3)
  • Homebrew (1.1.9 或更高版本)
  • Xcode (8.2.1 或更高版本)
  • Xcode (5.1.1 只能是此版本)

准备环境


1.创建大小写区分的磁盘分区

$ cd ~

$ mkdir Android

$ cd Android

$ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 80g android.dmg

2.挂载刚刚创建好的分区

$ hdiutil attach ~/Android/android.dmg.sparseimage -mountpoint /Volumes/android

3. 切换到刚刚挂载的分区

$ cd /Volumes/android

4.安装最新版本的repo

$ brew update

$ brew install repo

5. 安装依赖的第三方应用

$ brew update

$ brew install GnuPG

$ brew install gnupg2

6.下载并安装Xcode 5.1.1此版本,我们只是使用其中的SDK,其他的,我们使用8.2.1中的工具,注意,我们只能使用MacOSX10.8.sdk才能顺利编译通过。

下载地址 http://adcdownload.apple.com/Developer_Tools/xcode_5.1.1/xcode_5.1.1.dmg

下载之后,安装之前我们先把8.2.1的Xcode重命名一下,稍后我们再修改回来即可。我们安装之后,提取Xcode 5.1.1版本里面的"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk",然后拷贝到Xcode 8.2.1 版本的"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"目录下面。操作完成后,可以删除Xcode 5.1.1

也可以从phracker/MacOSX-SDKs 获取已经提取好了的版本。

执行如下命令,使得低版本的SDK生效。

$ sudo /usr/libexec/PlistBuddy -c "Set :MinimumSDKVersion 10.8" /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist

如此操作的原因有两条:

(1)在macOS Sierra  (10.12.3)上,Xcode 5.1.1无法执行,因此没办法做到两个版本并存.

(2)如果通过修改代码来把代码中限制的系统版本调整到10.8版本以上,则GCC存在BUG,导致编译无法正常通过,具体的BUG参考
libgcc: error: unknown value '10.10' of -mmacosx-version-min

7.下载Android-5.1.1_r38源代码(此处请准备梯子,或者自己从国内源进行替换)

$ mkdir Android_Source

$ cd Android_Source

$ repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r38

$ repo sync

编译代码


1.设置编译需要的环境信息

$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

2.切换Java版本到1.7

$ export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)

3.清理代码,为编译准备干净的环境

$ make clobber

4.引入编译环境变量

$ source build/envsetup.sh

5.设置编译目标,此处我们指定编译ARM下的完整调试版本

$ lunch aosp_arm-eng

6.如果需要跟踪调试代码,建议编译为调试类型

$ export TARGET_BUILD_TYPE=debug

7.编译

$ make -j8

注意此处如果发生编译失败,原因基本上是编译顺序导致的引用出错,也就是某些模块还没有编译完成,其他模块已经开始尝试链接,导致依赖错误,此时只要把多线程并发编译修改成单线程编译即可,即直接执行

$ make

运行镜像


$ cd /Volumes/android/Android_Source

$ export ANDROID_BUILD_TOP=/Volumes/android/Android_Source

$ export PATH=$PATH:$ANDROID_BUILD_TOP/out/host/darwin-x86/bin

$ export ANDROID_SWT=$ANDROID_BUILD_TOP/out/host/darwin-x86/framework

$ export ANDROID_PRODUCT_OUT=$ANDROID_BUILD_TOP/out/debug/target/product/generic

$ ./prebuilts/android-emulator/darwin-x86_64/emulator -system ./out/debug/target/product/generic/system.img -data ./out/debug/target/product/generic/data.img -ramdisk ./out/debug/target/product/generic/ramdisk.img

上面运行起来的镜像是从/Volumes/android/Android_Source/out/debug/target/product/generic/hardware-qemu.ini即可读取配置信息的,但是这个文件直接修改无效,我们如果需要修改参数,只能从启动参数中设置。
比如我们如果需要增大内存,开启GPU的支持,则执行如下命令:

$ ./prebuilts/android-emulator/darwin-x86_64/emulator -system ./out/debug/target/product/generic/system.img -data ./out/debug/target/product/generic/data.img -ramdisk ./out/debug/target/product/generic/ramdisk.img -gpu on -memory 2048 

参考链接


Android查看SELinux状态及关闭SELinux

SELinux2.6版本的Linux内核中提供的强制访问控制 (MAC)系统。对于目前可用的Linux安全模块来说,SELinux是功能最全面,而且测试最充分的,它是在20年的MAC研究基础上建立的。SELinux在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。

selinux默认配置在/etc/sysconfig/selinux

默认有三种级别

enforcing级别:Linuxselinux所设置的安全策略都会被启用.所有与selinux安全策略有关的服务或者程序都会被策略阻止.也就是,所有操作都会进行权限检查。

permissive级别:Linuxselinux所设置的安全策略都会被启动,但是所有与selinux安全策略有关的服务或者程序不会被策略阻止,但是会收到警告.也就是,所有操作都被允许(即没有MAC),但是如果有违反权限的话,会记录日志

disabled级别:关闭selinux,相当于系统没有安装selinux一样.

一般可以通过getenforce查看selinux的运行级别.也可以通过setenforce 0 或者1设置selinux的运行级别,级别0表示Permissive模式,级别1表示Enforcing模式. 至于disabled模式和其他模式的切换只能修改配置文件,命令不起作用.其次,修改完成之后,必须重启系统才能够生效.

参考链接


ubuntu 16.04下载Android源代码

由于众所周知的原因,我们是没办法正常下载Android的源代码的,因此只能使用国内的镜像来操作了。

1.安装repo工具

$ sudo apt-get install repo

2.在需要存储代码的地方创建文件夹

$ mkdir ~/Android_Source

$ cd ~/Android_Source

# 国内手工下载 repo 源代码,解决 “fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle”
 
$ git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo .repo/repo

3.使用镜像下载Android源代码
omapzoom.org的镜像

$ repo init -u git://git.omapzoom.org/platform/manifest

清华大学的镜像

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

上面执行之后是拉取全部的代码。

如果要使用某个特定分支的版本的源代码的话,则则初始化的时候指定分支,比如我想要Android 7.0.0_r21的分支,则执行如下命令

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.0.0_r21

4.同步代码

$ repo sync -j4

5.列出全部分支

$ cd .repo/manifests && git branch -a | cut -d / -f 3

6.切换到指定分支

$ repo start Android_7.0.0_r21 7.0.0_r21 --all

7.查看当前的分支

$ repo branches

8.删除不用的本地分支

$ repo abandon Android_7.0.0_r21

参考链接


Android Studio 2.2 启用代码混淆

在新版本的Android Studio中开启混淆的方法如下:

buildTypes {
        release {
            minifyEnabled true //是否混淆
            shrinkResources true //是否去除无效的资源文件
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

具体解释一下minifyEnabled用来影响是不是开启混淆,shrinkResources只有在minifyEnabledtrue的情况下,才能有效,用来去除无效的资源文件。proguard-android-optimize.txtAndroid SDK->tools\proguard目录下,Google已经写好默认的混淆模板文件,其中的proguard-android.txt默认没有配置代码优化,而proguard-android-optimize.txt默认配置了代码优化,至于我们自己工程下面的proguard-rules.pro文件,只要配置我们自定义的额外配置即可,其他的用默认配置即可。

顺便讲一下代码混淆的好处:

1.代码安全,不易理解,增加破解难度。

2.减小APK的体积,减少内存开销。

3.缩减类名,方法名的长度,减少CPU开销。

参考链接


Android Studio 混淆代码时提示 “Warning:org.apache.commons.httpclient.util.URIUtil: can't find referenced class org.apache.commons.codec.net.URLCodec”

Android混淆代码时提示"Warning:org.apache.commons.httpclient.util.URIUtil: can't find referenced class org.apache.commons.codec.net.URLCodec"
解决方法是proguard-rules.pro中增加如下语句:

-dontwarn org.apache.commons.httpclient.**

其他类似的警告信息,可以参考以上的方法,逐行添加即可。

参考链接


ProGuard error can't find superclass or interface org.apache.http.entity