Android8.1中SeLinux使用

 分类:Android, Java 阅读 (184)  Android8.1中SeLinux使用已关闭评论
12月 172019
 
查看SeLinux是否启用,输入命令:

getenforce

如果返回:Enforcing – 正在启用,Permissive – 未启用但会提示

临时设置为不启用(需要root权限):

setenforce 0

查看进程的SeLinux相关权限:

ps -AZ

查看文件的SeLinux相关权限:

ls -lZ

在源码中关闭SeLinux:

找到相应的BoardConfig.mk,打开文件,找到BOARD_KERNEL_CMDLINE项,在这一行的结尾增加

androidboot.selinux=permissive(前面加一个空格)

 

 Posted by on 2019-12-17

编译Android8.1修改默认分辨率和屏幕密度

 分类:Android, Java 阅读 (442)  编译Android8.1修改默认分辨率和屏幕密度已关闭评论
12月 162019
 
一、第一步:首先修改frameworks/base/packages/SettingsProvider/res/values/defaults.xml

增加两项

这里修改分辨率为1024,768,屏幕密度为160

注意:如果是定制的系统,可能在系统相关的目录下有一个覆盖的defaults.xml,要修改那个xml,一般在device/xxx/xxx_xxx的子目录中

二、第二步,在DatabaseHelper.java中加载默认值

在文件frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java中做如下修改:

在loadSecureSettings中增加如下代码

loadStringSetting(stmt, Settings.Secure.DISPLAY_DENSITY_FORCED, R.string.display_density_forced);

在loadGlobalSettings中增加如下代码:

  loadStringSetting(stmt, Settings.Global.DISPLAY_SIZE_FORCED, R.string.display_size_forced);

 Posted by on 2019-12-16

解决Android8.1下不能单独编译SystemUI模块的问题

 分类:Android, Java 阅读 (346)  解决Android8.1下不能单独编译SystemUI模块的问题已关闭评论
12月 122019
 

在frameworks/base/packages/SystemUI目录下执行mm命令,提示找不到metrics-helper模块

不能单独编译模块,全编译系统很浪费时间

问度娘后发现子目录tests依赖于这个模块,将tests目录下的Android.mk改名后即可

另附ubuntu下自动编译SystemUI的shell脚本

 

 Posted by on 2019-12-12

Android中接收应用安装、覆盖安装、删除的广播(Android8.0+)

 分类:Android, Java 阅读 (559)  Android中接收应用安装、覆盖安装、删除的广播(Android8.0+)已关闭评论
12月 102019
 
一、Android8.0之前的版本

在Android8.0之前,可以通过注册静态广播来监听应用安装或者删除的广播

如下是在AndroidManifest.xml中注册静态广播的一段代码

唯一需要注意的是,有一个android:scheme属性是必须的,否则收不到广播

二、Android8.0之后的版本

Android8.0之后很多静态广播不能用了,想要接收应用安装、覆盖安装和删除的广播,需要动态注册广播。

代码如下:

需要注意的是,必须使用这句代码filter.addDataScheme(“package”);来指定DataScheme
 Posted by on 2019-12-10

FLAG_ACTIVITY_FORWARD_RESULT的使用

 分类:Android, Java 阅读 (139)  FLAG_ACTIVITY_FORWARD_RESULT的使用已关闭评论
12月 102019
 

这几天看安卓系统源码的时候,遇到FLAG_ACTIVITY_FORWARD_RESULT,用于跨Activity传递ActivityResult

记得有一次面试还有面试官问到这个问题,当时还以为是说要用eventbus或者本地广播

我们先用一个图片看看这个标志的作用

下面看看三个Activity的代码

ActivityA的代码

ActivityB的代码

ActivityC的代码

注意事项:

1.如果intent中设置了FLAG_ACTIVITY_FORWARD_RESULT就不能再使用startActivityForResult打开新的Activity了

2.setResult必须在super.finish()之前调用

3.这个标志是否适合于更多层Activity的转发?可以

 Posted by on 2019-12-10

Android8.1顶栏SystemUI下拉菜单中的快捷按钮修改

 分类:Android, Java 阅读 (246)  Android8.1顶栏SystemUI下拉菜单中的快捷按钮修改已关闭评论
12月 092019
 
1、默认的快捷按钮的项目在res/values/config.xml中

项目的名称:quick_settings_tiles_default

默认的值为:wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast

2、所有的快捷设置项

在res/value/config.xml中,项目名称:quick_settings_tiles_stock

项目值:wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,work,cast,night

  • wifi – 无线网络
  • bt – 蓝牙
  • dnd – 勿扰模式
  • flashlight – 手电筒?
  • rotation – 自动旋转
  • battery – 省电模式?
  • cell – ?
  • airplane – 飞行模式
  • cast – 投射
  • location – 位置信息
  • hotspot – 无线热点
  • inversion – 反色
  • saver – 流量节省程序
  • work – ?
  • night – 夜晚模式?
3、有个编辑按钮,可以编辑常用的快捷按钮

当编辑后,按钮的配置存储在系统数据库的Secure.QS_TILES常量中,常量值:sysui_qs_tiles

使用下面命令可以查看修改后的值:

adb shell settings get secure sysui_qs_tiles

 Posted by on 2019-12-09

Android系统源代码跟踪调试小技巧

 分类:Android, Java 阅读 (85)  Android系统源代码跟踪调试小技巧已关闭评论
12月 062019
 

本来一直是在源码中加Log的方法进行调试

但是有些函数很长,if分支也很多,而且还有一些是通过线程或者binder、sendMessage等异步的方式调用的,加上系统编译又很慢,调试起来真是费劲

后来想到程序报错时会输出java的函数栈,我们能不能利用这个呢?可以一直追踪到函数的前几个调用函数。

答案是可以的,我们可以在代码中加入下面的代码,让程序打印调用栈

new Exception().printStackTrace()

加上这个以后,会打印堆栈,但不是抛出异常,这样就很方便的知道函数的调用栈列表了

对于调用Aidl时客户端的堆栈跟踪

假如我们跟踪某段代码后,发现这段代码是通过aidl被调用的,那我们就跟踪不到调用端的代码了,那么我们可以通过throw一个Exception的方式还跟踪。调用端会触发RemoteException而打印出堆栈。

当然,如果客户端try catch了RemoteException这个方式可能就不起作用了

throw new IllegalStateException(“Throw an aidl remote exception.” );

客户端会报如下样式的错误:

 

 Posted by on 2019-12-06

修改Android8.1吉字节、千字节、光字节、太字节的问题

 分类:Android, Java 阅读 (274)  修改Android8.1吉字节、千字节、光字节、太字节的问题已关闭评论
12月 032019
 

Android8.1显示GB时默认显示吉字节

修改方法如下:

在源码目录下/external/icu/icu4c/source/data/unit中找到zh.txt文件

打开此文件,然后将其中的吉字节修改为GB,千字节修改为KB,兆字节修改为MB,太字节修改为TB,每一项可能有多个地方需要修改,然后保存

因为这个目录下的要单独编译,make clean都不管用,执行下面的命令:

将source/data/out/tmp/目录下的icudt58l.dat文件push到手机/system/usr/icu/目录下,重启手机即可查看效果

然后将source/data/out/tmp/目录下的icudt58l.dat文件拷贝到source/stubdata中,下次编译系统的时候就直接显示GB了。

 

转载自:https://www.jianshu.com/p/fadf33914875

 Posted by on 2019-12-03

imx8+Android8.1修改系统默认语言的方法

 分类:Android, Java 阅读 (129)  imx8+Android8.1修改系统默认语言的方法已关闭评论
12月 032019
 
一、修改方法

在文件device/fsl/mek_8q/BoardConfig.mk中增加一行

PRODUCT_LOCALES = zh_CN

设置变量PRODUCT_LOCALES的值为zh_CN

注意

1、别写在某个if判断中

2、不需要make clean,直接make就可生效

3、验证方法:可以查看out/target/product/mek_8q/system/build.prop中ro.product.locale的值验证,这里正确了再烧录验证

 

 

 Posted by on 2019-12-03

Android插件化初探之apk加载和反射调用函数

 分类:Android, Java 阅读 (130)  Android插件化初探之apk加载和反射调用函数已关闭评论
12月 022019
 
一、整体试验步骤

1.建立子apk,新建一个android应用项目,叫firstplugin

2.在java根目录下新建一个类,叫LoginImpl

3.在LoginImpl.java中实现一个静态方法, login(),此方法只输出一个Log

4.编译生成apk,push到手机的/sdcard目录,此处生成的文件名为firstplugin-debug.apk

5.开始建宿主apk,新建另外一个Android应用项目PlugInHostApp

6.在MainActivity的onCreate中增加如下代码:

7.编译运行,看log中是否输出了login这个字符串

二、遇到的问题和解决方法

1.java.lang.ClassNotFoundException: Didn’t find class “com.zht.car.firstplugin.LoginImpl” on path错误

解决方法:

  1. 查看是否有访问外部存储目录的权限(笔者遇到的就是这个问题,程序不会在new DexClassLoader时报无权限访问或者找不到文件的错误,而会在loadClass时报找不到类的错误)
  2. 关闭Android Studio的Instant run选项,在菜单Settings->Build, Execution, Deployment中(笔者是在Ubuntu中使用Android Studio,没找到此选项)
 Posted by on 2019-12-02