android 换肤 apk

简介: 引用:http://handsomeliuyang.iteye.com/blog/1304975 在android系统中,每一个application是一个进程和一个用户,不同的进程间是不能互相访问的。

引用:http://handsomeliuyang.iteye.com/blog/1304975

在android系统中,每一个application是一个进程和一个用户,不同的进程间是不能互相访问的。如果想让两个程序之间可以相互访问其资源,就可以让这两个apk运行在同一个进程里就可以。要让两个apk运行在同一个进程里,要满足两个条件:相同的sharedUserId用相同的证书进行签名

  默认情况下,如果不配android:sharedUserId,则其userid与包名相同,所以我们可以把皮肤包的android:sharedUserId与主apk配置的相同,再用相同的签名打包,就可以共享资源。

  以上是打皮肤包方法,但真正把这个方案用在复杂一点的项目里时,问题会很多。比如按照上面的方法,在主apk里怎样获取皮肤包的图片:

Java代码 
  收藏代码
  1. try {  
  2.     mSkin1Context = this.createPackageContext("com.ly.skin1", CONTEXT_IGNORE_SECURITY);  
  3. catch (NameNotFoundException e) {  
  4.     mSkin1Context = this;  
  5. }  
  6. Drawable drawable = mSkin1Context.getResources().getDrawable(R.drawable.image1);  

 用上面的方法有一个要求,就是在主程序和皮肤程序里都要有image1图片,但这两张图片的内容是不一样的。

  这样感觉只要资源的名称相同就行了,但关键是R.drawable.image1是一个常量,在编译阶段会用常量的值替换掉这个变量,问题就出来了,尽管主apk和皮肤包有相同名称的图片,但如果他们的值不一样,则也会出错。

  R文件里的常量的值不是只与其本身资源的名称有关,还与所有的图片名称有关,只有保证皮肤包和主apk有完全相同的图片名称(所有),才能保证其生成的常量的值也相同。

针对上面的问题的解决办法:

  如果不想皮肤包太大,可以用item属性:

Xml代码 
  收藏代码
  1. <item type="drawable" name="icon"/>  
  2. <item type="drawable" name="image1"/>  
  3. <item type="drawable" name="image3"/>  

这样也可以在R文件里的Drawable类里添加上面三个常量。

注意:上面的三个图片,icon,image1,image3可以在资源文件里已经存在了,也可以在这里再写一遍,但其他的layout属性不可以这样做,只能写没有出现过的。

 

共享layout文件

  上面只讲了换图片方法,即然是资源全部共享,其实还可以共享其layout文件,这样可以改变其布局文件,包括字体颜色和位置。

  同样的问题,R.layout.xxx也是常量,在编译期间都会替换成数值,为了保证其生成的常量的值都相同,我们可以让皮肤包和主apk的布局文件一样,也可以用上面的item标签,但注意item里的与layout里的,不能重复,但drawable可以。

  还有一个问题就是id值,id值也可以在item里写,这样在其他的layout文件里就不要用@+id/xxx,直接用@id/xxx就可以了,但我测出一个问题,如果把id全部都写在layout文件里,和全部都写在item里,其常量的值不一样,所以只能选一样方法。

 

讲讲用这种方法进行换肤的缺点:

   1. 由于其常量的值与整个资源都有关系,所以一个皮肤包只能与一个特定的版本相关联,每个版本都要用其独立的皮肤包,以前的不能重用,因为在新的版本里,其资源一般都会发生变化。

   2. 如果想让皮肤包小一点话,就要为不能的手机分辨率打不同的apk包

   3. 由于不同的版本之间不能共用皮肤包,所以用户更新新版本后,只有手动才能把老的皮肤包删除掉,但用户区分哪个是老的皮肤包,比较麻烦。

   4. 为了维护的方便,一般是把每个版本拥有的皮肤包的地址写死在客户端。

相关文章
|
7月前
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
677 83
|
6月前
|
安全 算法 小程序
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
361 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
|
7月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
199 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
8月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
192 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
Java Android开发 Windows
使用keytool查看Android APK签名
本文介绍了如何使用Windows命令行工具和keytool查看APK的签名信息,并提供了使用AOSP环境中的signapk.jar工具对APK进行系统签名的方法。
1324 0
使用keytool查看Android APK签名
|
Android开发
解决android apk安装后出现2个相同的应用图标
解决android apk安装后出现2个相同的应用图标
710 2
|
Android开发
将AAB(Android App Bundle)转换为APK
将AAB(Android App Bundle)转换为APK
601 1
|
Android开发 开发者
Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)
Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)
949 1
|
XML API Android开发
android S 上 安装apk出现android.os.FileUriExposedException
android S 上 安装apk出现android.os.FileUriExposedException
338 6
|
设计模式 缓存 Java
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试