bcoder

Android Studio中gradle实现多维度打包

 分类:Android, Java 阅读 (36)  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 阅读 (41)  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 阅读 (42)  使用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 阅读 (28)  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 阅读 (33)  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 阅读 (53)  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 阅读 (34)  编译Android8.1修改默认分辨率和屏幕密度已关闭评论
12月 162019
 
一、第一步:首先修改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 阅读 (74)  解决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 阅读 (73)  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 阅读 (42)  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