需求

上一篇文章主要写了打包刚开始的配置和参数化构建。这篇文章主要讲一讲在改包名、改资源的打包实践中,常会碰到的问题以及解决办法。如果看博客的人有更好的解决办法,也可以找我交流,关于页面有我联系方式。

打包的主要需求如下:

改包名

可以替换icon,可以修改应用名,包括应用内部显示的名称(如版权信息)

可以控制部分功能是否开启

改包名分析

我们知道,改包名只是修改applicationId,和代码中类的package无关,所以基本上代码和AndroidManifest.xml中组件的name,都是不需要改动的。但是还是会涉及到下面的这些问题:

代码中使用”包名”写死的路径,比如/data/data/com.xx.xx/。

AndroidManifest.xml中,ContentProvider会填一个authorities属性,换包名等于换应用authorities就得跟着变。部分action,部分activity的taskAffinity。

第三方的client_key(支持多包名就没关系了,比如umeng push)。

提供给外部调用的activity和service,偶尔会要求必须在包名路径下(刚好我碰上了这奇葩事)。

具体解决办法:

使用全局查找,找出包名的字符串,统一改为context.getPackageName(),没有context对象的地方,使用BuildConfig.APPLICATION_ID。

当我们配了applicationId以后,就可以在AndroidMenifest.xml中使用{$applicationId}代替写死的包名。

像applicationId一样,在gradle文件的defaultConfig中,把每个key都声明成常量调用。在做打包之前,我想的是给产品运营人员提供一个构建参数让他们填写,后来意识到,其实这些clientkey和包名是绑定的,于是在工程里新建了一个名包文件夹,里面保存了key=value的格式,打包时,通过shell读取到环境变量,然后用shell修改gradle的配置。

actiivity可以使用activity-alias标签

应用场景

部分shell脚本的源码,这里只是修改build.gradle的脚本,要打包还要再加入./gradlew assembleRelease等其它个性化脚本

将完整的shell脚本保存成sh文件,放到工程目录下,在jenkins中执行该sh文件sh ./jenkinsbuild.sh

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33field_name=('BOOL_FIELD1' )

value=($BOOL_FIELD1 )

#注意 这里是用测试的值 注意value要和filed的name对应 在shell中全是字符串格式

#value=('false' 'false' 'false' 'false' 'false' 'false' 'false' 'false' 'false' 'false')

for i in "${!field_name[@]}";

do

echo ${field_name[$i]} ${value[$i]}

#只有当变量不为null的情况下,才去修改Build文件

if [ -n "${value[$i]}" ];then

toReplace='buildConfigField "boolean", \"'${field_name[$i]}'\", "'${value[$i]}'"'

echo $toReplace

sed -i 's/buildConfigField \"boolean\", \"'"${field_name[$i]}"'\", \"\([a-zA-Z]*\)\"/'"$toReplace"'/g' build.gradle

fi

done

toReplace='applicationId \"'$PACKAGE_NAME'\"'

echo $toReplace

sed -i 's/applicationId \"com.lefo.oldpkg\"/'"$toReplace"'/g' build.gradle

#字符串变量 操作方式是删除掉gradle文件中旧的 添加新的

field_name=('PT_CLIENT_ID' 'PT_CLIENT_SECRET' 'PT_QQ_ID' 'PT_WX_RELEASE_ID' 'BUGLY_ID' 'APP_TYPE' 'PT_SERVER_SECRET' 'LICENSE_URL' 'POLICY_URL')

value_name=('client_id' 'client_secret' 'qq_id' 'wx_id' 'bugly_id' 'app_type' 'server_secret' 'license' 'policy')

for i in "${!field_name[@]}";

do

echo ${field_name[$i]}

value=${value_name[$i]}

toReplace='buildConfigField \"String\", \"'${field_name[$i]}'\", \"\\\"'${!value}'\\\"\"'

echo $toReplace

sed -i '/buildConfigField \"String\", \"'${field_name[$i]}'\", /d' build.gradle

sed -i '/defaultConfig/a buildConfigField \"String\", \"'${field_name[$i]}'\", \"\\\"'${!value}'\\\"\"' build.gradle

done

那么,脚本中,client_id这些,是如何一次性加入到环境变量中的?这里要用到另一款插件,Environment Injector Plugin。这款插件可以在执行时往执行环境中注入变量。关于变量的配置信息,我在工程目录下新建了一个文件夹保存的配置文件。就是key=value的格式,就是你熟悉的java properties file。这里的PACKAGE_NAME,在jenkins参数化构建时,给产品提供的是一个选项列表,固定好包名列表给产品选择选,毕竟涉及到client_key的修改,不能随便填。

改资源该怎么改

产品居然想要修改APP名称,图标,部分页面的图片,这里要用到gradle配置中的productFlavors。工程中新建一个文件夹lefo,注意要名字对应,然后我们将要替换的资源,按原资源存放位置,放到package1目录下,打包时,不能再执行assembleRelease,这个时候就应该是./gradlew assembleLefoRelease

1

2

3

4

5

6productFlavors{

lefo{

//产品说,可不可以做到应用显示的名字和内部的名字不一样 可以 给应用单独配一个名字 本来有个资源叫app_name

manifestPlaceholders = [label:"@string/app_label"]

}

}

既然想这么定制,那就彻底交给产品,他们想放什么放什么。

修改应用名称:直接使用jenkins中参数配置,通过sed命令修改strings.xml

图标资源替换:最初想的是从某处下载一份资源,然后替换掉包中资源,产品那边和我们一样用的是svn,jenkins在构建的时候,SCM是在构建之前的,也就是说,在构建以前就要checkout代码。问题就来了,资源目录的URL可以做为一个参数传进来,但并不是每一次打包,都需要替换资源。如果URL没有传,那SCM就不能过,构建就会失败,根本走不到编译过程。这里同样要使用插件Environment Injector Plugin,它可以在SCM以前,使用脚本修改某个变量的值。

注意下图中我使用的是groovy script,如果我没有记错的话,只有groovy script是可以在SCM之前执行的。如果没有填,脚本就给它一个内容为空的文件夹路径,SCM配置中,支持${RES_URL}使用。为什么不给RES_URL配一个默认值呢?因为不填写更直观,产品修改的时候,也不用每次都删除旧的再复制上新的还得检查一遍。

产品经理用的很嗨,暂时没有续,为了不涉及隐私,整篇加上前一篇都是一些片段,想直接copy进去使用的可能要失望了。不过,拼凑一起还是可以的,实在不懂的来找我。

android打包名字,使用jenkins为android工程打包,支持多包名,改资源(踩坑指南)...相关推荐

  1. Android applink 踩坑指南

    Android applink 踩坑指南 原理 接入步骤 将链接与activity关联起来 加入meta data 生成身份验证JSON 真机测试 结论 官方文档 原理 与url scheme不同的地 ...

  2. android 字体文件压缩,Android 字体使用踩坑指南

    Android 字体使用踩坑指南 最近项目改版,根据ui的设计,需要使用到三字体.在使用过程中遇到一些坑,于是有了这个避坑指南! 字体压缩 第一个坑!字体库的体积太大. 字体压缩的前提是要使用的内容是 ...

  3. android手机屏幕共享神器踩坑指南

    开源项目地址:https://github.com/Genymobile/scrcpy scrcpy,由 Genymobile 推出的可跨平台的.可自定义码率的.开源的屏幕共享工具.它提供了在 USB ...

  4. Android自动化打包工具,利用Jenkins实现Android自动化打包

    Jenkins简介 What is Jenkins? Jenkins is a self-contained, open source automation server which can be u ...

  5. android gradle权威指南pdf_干货 | 携程 Android 10适配踩坑指南

    作者简介 曙光,携程资深软件工程师,负责市场营销相关研发及管理工作.2019 年 9 月 3 日,Google 发布了 Android 10 正式版.Android 10 聚焦移动创新.安全隐私和数字 ...

  6. android 多包名apk,一个项目如何编译多个不同签名、包名、资源等,的apk?

    4 其他需要注意的事项 如果您在清单文件AndroidManifest.xml中,有那种以包名开头命名的那种.因为如果包名都改了,有些也需要动态的改变.可以用${applicationId}代替.在打 ...

  7. 【Android 逆向】应用安装目录 ( Android 应用的默认安装目录 | 查找 Android 应用的安装目录 | 查询当前正在运行的应用包名 | 根据包名查询应用安装路径 )

    文章目录 一.Android 应用的默认安装目录 二.查找 Android 应用的安装目录 1.查询当前正在运行的应用包名 2.根据包名查询应用安装路径 一.Android 应用的默认安装目录 应用安 ...

  8. 20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程

     场景:实现安装一个apk应用程序的过程.界面如下: 编写如下应用,应用结构如下: <RelativeLayout xmlns:android="http://schemas.an ...

  9. android file域,Android FileProvider详细解析和踩坑指南

    其实很早之前我的应用就已经兼容到Android7.0了,此次写这个文章就是想详细梳理一下android的文件系统,以及做一下FileProvider的解析. Android7.0 (N) 开始,将严格 ...

最新文章

  1. C# 算法系列一基本数据结构
  2. 一名算法工程师,对流量和时代红利的思考
  3. 独家 | 菜鸟级机器学习入门(附代码实例)
  4. GCN代码超详解析Two-stream adaptive graph convolutional network for Skeleton-Based Action Recognition(三)
  5. [HOW TO]-centos环境搭建opengrok笔记
  6. 【干货】APP产品处理加载机制和刷新机制的交互方法解析
  7. 9大方法为云安全保驾护航
  8. python删除txt指定内容_正则表达式使用python从文件中过滤和删除特定的多行文本...
  9. linux 对象 调出r_[转载]linux系统下安装R包
  10. python改错题重要的事情说三遍_5个很好的Python面试题问题答案及分析
  11. 计算机辅助教学:多媒体课件制作教程,多媒体课件制作5步曲!
  12. 论文笔记:TrafficPredict: Trajectory Prediction for Heterogeneous Traffic-Agents
  13. win10动态壁纸无法通过右击属性的个性化来换掉
  14. UG NX 12 组合投影曲线
  15. Android运营商名称显示之PLMN的读取(原)
  16. 微软培训和认证的建议
  17. 解决VM虚拟机导致硬盘灯常亮,很卡的问题
  18. 【软工实践】第0次作业
  19. 程序员又背锅了!虾米音乐代码注释惊现“穷逼vip”
  20. stm32 读取sd卡图片显示_「正点原子STM32Mini板资料连载」第三十五章 汉字显示实验...

热门文章

  1. wordpress添加媒体_如何在WordPress中添加jQuery FAQ手风琴
  2. 谷歌 Pixel 手机阻止用户拨打报警电话
  3. Unity脚本子线程修改UI的一种方式
  4. 手持设备:懒人的互联网音乐智能同步/播放器
  5. Creator3D:shader7_尽然还有双pass这波操作
  6. 运行npm install webpack -g 出现 4048错误
  7. 安徽航信研发项目管理体系探索与实践
  8. 计算机考研 学渣逆袭上清华,学渣逆袭:曾挂科8门学分绩点1.08 考上北大研究生...
  9. 下载Stani‘s Python Editor
  10. 洛谷P3237 [HNOI2014]米特运输