Android 中public.xml在SDK开发和动态加载的用法

本文介绍:Android 中public.xml在SDK开发和动态加载的用法:

解决问题:

 1. 在开发SDK或者apk动态加载中,需要应用layout,drawable(图片,点击),dimen, string等等

2. apk动态加载(代码和资源隔离,dex动态加载),子apk发通知,调用了主应用的图标(原因:同志是系统发出来的,系统会找主应用的图标ID)


解决办法:

两边把对应的资源ID写死,导入SDK时,把资源文件给使用方,apk动态加载的也要把关键的资源给使用法(比如通知栏图标)

格式:  <public type="资源类型" name="资源名" id="0x7f080000" />

具体做法:两边声明values/public.xml文件,如下格式:(可以适配分辨率和横竖屏layout)

Android 中public.xml在SDK开发和动态加载的用法_第1张图片

3. 如何使用资源 ID :
在开发中我们通常使用 Resources.getXXX(resid) 来获取某个资源,传入的是 ID 这个 ID 定义在 R.XXX 类里面,R 类是编译器自动生成的



其实资源 ID 就是一个常量,对我们引用了某个ID,编译成 APK 之后,这个ID的值就固定了,
而 apktool 在重新打包 apk 的时候会对资源重新编译 (编译成 resources.arsc 你有zip打开 apk 看得到),编译资源的时候自然需要对所有资源ID进行重新编排(这是一个随机过程)试想假设原包里面 drawable/a.png id=0x7f020003 那么重新编排资源ID后就可能是 0x7f020004 又假设原包 0x7f020004 对应图片 b.png,那你重新打包后的 apk 当显示 a.png 的时候就会替换成 b.png,这还好不会出错,倘若生成的一个 id 原包不存在,那会导致程序崩溃的!


如果你细心观察就会发现,id 都是 0x7f 开头紧接着后面两位 08 是独立于每种资源类型的,再后面的编码就是从 1 开始咯

public.xml 特殊用途:
<public-padding name="my_" end="0x7f02000f" start="0x7f020001" type="drawable" />

public-padding 顾名思义,留间距,为什么要留间距,这就涉及到一个深奥的问题了,可以应用在 主题、apk动态更新 领域,这个我们以后讨论

加了这个的效果就是在 R 里多了 my_1 ~ my_15 的资源ID,这些个资源ID空的,你去引用会找不到资源,如:

Android 中public.xml在SDK开发和动态加载的用法_第2张图片

格式是 
<public type="资源类型" name="资源名" id="0x7f080000" />

你可能感兴趣的:(Android 中public.xml在SDK开发和动态加载的用法)