问题:项目中不同的分发渠道可能需要打包多种APK(同样的代码),包名可能是不一样的,如果一个一个修改包名重新编apk是很麻烦,可以参考下列步骤在Android Studio上操纵Gradle来打包不同包名的apk。

这里例子的目标是,同样的代码,打包成com.example.android.newsreader和com.example.android.newsreaderdev两个不同包名的apk

1.首先在build.gradle的android节点中加入下列代码

productFlavors{    flavors_release{        manifestPlaceholders = [str:"releaseStr",package_name:"com.example.android.newsreader"]        applicationId "com.example.android.newsreader"    }    flavors_dev{        manifestPlaceholders = [str:"devStr",package_name:"com.example.android.newsreaderdev"]        applicationId "com.example.android.newsreaderdev"    }}
这个productFlavors的功能即为打包的参数化而提供的,flavors_release和flavors_dev可以被视作自己定义的两套变量集,实际操作中可以自定义 注意到这里有一个manifestPlaceholders的参数,里面提供的实际上是几个参数变量和值,这里的参数都可以通过${name}的方式在AndroidManifest.xml中使用。原来是想在AndroidManifest中的manifest的节点将package给参数化来达到打不同包名的apk的目的,即:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="${package_name}"      android:versionCode="1"      android:versionName="1.0">    <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="14" />...

结果Android Studio的Lint自动给了我一个提示:

说明Android Studio推荐我采用设置applicationId的方式来将包名参数化 于是乎,我在flavors_release和flavors_dev中又加入了applicationId的设置,即: 和

下面看看是否有作用

2.这一步需要操纵Gradle面板

此时我们在Android Studio的右侧的gradle面板中点击 按钮刷新下,于是在build子栏目中出现下列东西:

其中以assemble*打头的都是生成apk的选项,生成的apk在build/outputs/apk中,这里我们对任一项双击即可生成对应的apk

对应flavors_release和flavors_dev的apk应该就是和这两个,于是分别双击他们等待各自生成apk的过程

3.下面查看Project面板中的内容

打开project面板,我们发现真的出现了几个apk:

可以看出来每次双击gradle中的一条会生成三个apk,我们把newsreader-flavors_dev-debug.apk和newsreader-flavors_release-debug.apk拿出来,用aapt命令查看下他们的包名(命令为aapt dump badging {filename.apk})

果然,包名是不一样的。 那么是否可以同时安装呢,这里把两个apk都安装到模拟器中,果然是可以的:

可以看到出现了两个NewsReader,其实都是一模一样的,只是包名不同

4. 如何在打包的时候指定签名

在Android Studio菜单栏进入Build->Generate Signed Apk:

指定你的keystore后点击next:

这里会发现在Flavors里面有两个项目,即我们在gradle里面配置上的两个flavors参数集,各自选上,点击finish即可生成所需要的apk

5. 有个疑问,为什么修改applicationId即可修改包名呢?applicationID和packagename到底是什么关系

实际上, package 代表了 java 代码中的包名。 applicationId 代表了应用中的唯一标识。和应用签名一起用来区别和其他应用不同。我想这也就是为什么 Google 市场能够允许相同应用不同 applicationId 的原因。 最后一个提示: 打包出来后,发布前最好要全面测试下,以免出现问题

更多相关文章

  1. android 本地数据库
  2. Android(安卓)WebView 开发详解(二)
  3. Android单元测试 - 验证函数参数、返回值的正确姿势
  4. 使用Lint 和 Annotations来提升代码质量
  5. android app 快速接入支付宝流程(android studio)
  6. Android(安卓)sqlite 采用execSQL和rawQuery方法完成数据的添删
  7. android适配器SimpleCursorAdapter的使用以及最后一个参数的作用
  8. Android(安卓)聊天界面对话
  9. Android(安卓)APP之间共享SharedPreference

随机推荐

  1. android http get
  2. android 获取屏幕的长和宽
  3. android 学习笔记有用代码片段(1)
  4. Android(安卓)设置字体大小和显示大小后
  5. Android文字跑马灯控件(文本自动水平滚动)
  6. Android(安卓)采用代码编写ui
  7. android:onClick attribute
  8. RxJava在Android的应用场景
  9. android 动态设置控件大小
  10. android 文件保存方法 sd卡中或系统