Android8.1系统中启用bootchart

 分类:Android, Android, Java, Operating System 阅读 (1,520)  Android8.1系统中启用bootchart已关闭评论
3月 072020
 

bootchart是用于记录开机时进程启动时间的工具

默认情况下是没有启用的,在init.rc中是有启动的,看如下代码:

但是,查看了一下bootchart的源码(在system/core/init/bootchart.cpp中),它启动要判断另外一个条件,代码如下:

也就是说检查/data/bootchart/enabled文件是否存在(不管文件是不是有内容),如果存在就启用bootchart,这样就好办了,我们在/data/bootchart中随便新建一个名字enabled的空文件就好了。

修改完后再重新启动安卓系统发现/data/bootchart目录下有了下面几个文件:

header

proc_diskstats.log

proc_ps.log

proc_stat.log

接下来就可以用其他工具根据这些log生成图片了,我使用的是linux下的pybootchartgui工具

 

 Posted by on 2020-03-07

Android模拟器部分参数说明

 分类:Android, Android, Java, Operating System 阅读 (1,432)  Android模拟器部分参数说明已关闭评论
3月 052020
 

模拟器版本Android emulator version 26.1.3.0 (build_id 4240222) 

本文所述都是基于android8.1系统源码编译后的模拟器程序,不是android studio中的模拟器

部分参数说明:

-screen 触屏模式,可以为如下参数:touch, multi-touch, or no-touch

-accel 加速模式,可以为如下参数:on, off, auto

-writable-system 执行adb remount后system和vender分区可写

-skin 皮肤名称,如果是安卓系统源码,皮肤在development/tools/emulator/skins目录下

-wipe-data 清除用户数据

-shell 看着是可以显示系统的log了,其他区别不清楚

-cores 模拟器的cpu核心数

-gpu 设置硬件OpenGLES模拟模式,可选参数:on, off, auto

-memory 设置模拟器的物理内存大小,单位MB,有的时候设置比较大的值会导致模拟器无法启动

-show-kernel 显示内核消息

-no-boot-anim 禁止开机动画,加速模拟器启动速度,有的时候加上模拟器启动不了

-tcpdump <file> 将网络包抓到某个文件

-bootchart 允许-bootcharting,具体可以百度搜索一下bootchart

-selinux <disabled|permissive> 是否开启selinux

-dpi-device 设置设备的dpi

参数帮助列表:

其他的配置文件

在生成的镜像目录中还有一个config.ini,也可以进行一些配置,具体参考自己机器上的文件进行配置

在我的机器上是out/target/product/generic_x86_64/config.ini这个文件

 Posted by on 2020-03-05

ThreadLocal的使用

 分类:Android, Java, Java语言 阅读 (828)  ThreadLocal的使用已关闭评论
3月 052020
 
一、ThreadLocal的作用

  ThreadLocal也是用作保证线程安全的一种方式,与平常我们所说的线程安全的方式不同,ThreadLocal是对每个线程都保存一份数据来保证多个线程不会同时使用这个数据。

  也许你会说,那我在线程里定义一个这样的数据变量不就可以了?如果你只是定义一个线程类,而运行该线程类的多个实例,当然是可以的。

  ThreadLocal是可以用在一个程序中的所有线程中,比如主线程和子线程同时使用这个变量(这听起来有点像单例的场景)。

  在Android中比较典型的应用就是Looper了,看Looper池的定义

  看ThreadLocal<Looper>是定义成了静态变量了

二、ThreadLocal的方法

  ThreadLocal支持泛型,一共有如下三个方法

  • set
  • get
  • remove

  根据函数的名字我们很容易知道他们的作用,这里就不再介绍了

三、其他高级用法

  可以和软引用配合使用,以节省内存的使用

 Posted by on 2020-03-05

Android Studio中gradle实现多维度打包

 分类:Android, Java 阅读 (1,261)  Android Studio中gradle实现多维度打包已关闭评论
1月 132020
 

举个不太恰当的例子,比如我们需要生成针对友盟统计的渠道为官网、应用宝、百度应用市场三个渠道各自对应的开发环境和测试环境的应用包。

那么,我们首先在AndroidManifest.xml中定义相关的点位符

友盟统计渠道点位符:

开发环境占位符:

在项目的build.gradle的android节点下定义flavorDimensions,如下:

然后我们定义productFlavors

获取当前apk占位符的值

我们以app_enviornment这个占位符为例,获取这个点位符的值后,确定连接开发服务器还是测试服务器

新建项目自定义的Application类(如果不明白,请百度一下这步如何操作),本例代码如下:

如上,获取到了占位符app_enviornment的值,根据AppEnviornment就可以做其他处理了

这个操作也不是必须放在自定义的Application类中,放在Activity中也可以

自动多版本apk的打包

在项目的build.gradle文件的android节点中增加如下代码:

  1. ${variant.versionName} – 版本名称
  2. ${variant.versionCode} – 版本编码
  3. ${variant.productFlavors[0].name} – 第一维度的名称(官网、应用宝等)
  4. ${variant.productFlavors[1].name}- 第二维度的名称(开发环境、测试环境等)

生成的apk截图如下:

Android Studio中如何指定要调试的版本

在studio左下角,找到Build Variants工具栏,在Active Build Variant中选择要调试的那个版本

代码下载

https://github.com/wintergoes/DimensionTestApp

 Posted by on 2020-01-13

Android8.1系统源码集成三方应用三方apk的方法

 分类:Android, Java 阅读 (2,173)  Android8.1系统源码集成三方应用三方apk的方法已关闭评论
12月 242019
 

首先在源码目录下建一个apks的目录,然后在apks下面建应用的目录,比如music

将my_music.apk拷贝到music目录下

在music目录下新建Android.mk文件,编译Android.mk文件,输入以下内容:

最后记得找到相应的包含PRODUCT_PACKAGES的mk文件,并在PRODUCT_PACKAGES属性中加入新建的LOCAL_MODULE,示例如下:

然后执行make编译

 Posted by on 2019-12-24

使用Android Studio调试系统应用的方法

 分类:Android, Java 阅读 (2,134)  使用Android Studio调试系统应用的方法已关闭评论
12月 202019
 

本文不适用于正常的手机应用开发,本文是在定制的安卓系统上开发

一、如何使应用变成系统应用

在AndroidManifest.xml中,根节点manifest中增加如下属性:

二、问题

如果直接run,则程序无法安装,会提示INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误

三、解决办法,使用keytool-importkeypair

见下面的链接:

https://www.jianshu.com/p/407c3754e490

keytool-importkeypair下载地址:

https://github.com/getfatday/keytool-importkeypair

 

 Posted by on 2019-12-20

Android8.1不使用jack编译的方法

 分类:Android, Java 阅读 (2,026)  Android8.1不使用jack编译的方法已关闭评论
12月 202019
 
一、为什么使用jack?
  1. 支持增量编译,编译速度快
二、全局禁用

禁止整个系统编译使用jack编译,在/build/core/combo/javac.mk中将

修改为false,即

三、单个模块禁用

在模块的Android.mk中增加如下设置

LOCAL_JACK_ENABLED := disabled

四、jack的三种模式

jack有三种模式:full、incremental、disabled

full – 全量编译

incremental – 增量编译,在frameworks/base下的Android.mk可看到frameworks是采用增量编译的

disabled – 禁用

 Posted by on 2019-12-20

Android8.1开发系统服务步骤

 分类:Android, Java 阅读 (1,266)  Android8.1开发系统服务步骤已关闭评论
12月 192019
 

1.在frameworks/base/core/java/下新建aidl文件的目录结构,比如你的服务所在包名为com.zht.car,则新建如下层级目录com/zht/car

2.新建aidl文件,如IBeidou.aidl

3.输入IBeidou.aidl的内容

4.在frameworks/base/Android.mk中的LOCAL_SRC_FILES中增加新增加aidl路径

5.在build/core/tasks/check_boot_jars/package_whitelist.txt中增加包的白名单,如下:com\.zht\.car\..*

6.执行make update-api

7.执行make检查前边的步骤有没有问题

5.在frameworks/base/services/core/java/com/android/server/中,根据服务的名称新建目录

 Posted by on 2019-12-19

Android8.1中SeLinux使用

 分类:Android, Java 阅读 (1,612)  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 阅读 (5,649)  编译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