将修改过的Android 4.0 源码如何正确合理的拷贝到 4.1上
在修改Android 系统源码时,比如现在我有两套面向两个不同芯片的4.0.4 Android 源码,以下简称为A源码,B源码,A / B 源码生成的Android系统用户操作及视觉都是一样的。现在我使用A源码生成的 systemUI.apk(状态栏) 放到 B源码生成的系统里面,这时会出现错误。错误情况大多为以下这类型的话:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.phone/com.android.phone.InCallScreen}: android.view.InflateException: Binary XML file line #52: Error inflating class com.android.phone.InCallTouchUi
E/AndroidRuntime( 8656): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1964)
E/AndroidRuntime( 8656): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1989)
E/AndroidRuntime( 8656): at android.app.ActivityThread.access$600(ActivityThread.java:126)
E/AndroidRuntime( 8656): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1155)
E/AndroidRuntime( 8656): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 8656): at android.os.Looper.loop(Looper.java:137)
又比如我有4.0.4 和 4.1 两种面向同一芯片版本的源码,但把 4.0.4 版本的 systemUI.apk(状态栏)放到 4.1系统的里面也同样出错。
当然除了systemUI.apk(状态栏),还有 Phone.apk / Setting.apk 这些涉及到 FrameWork 资源的都会。
问题1:这个一般是什么原因造成的?是否因为 systemUI.apk(状态栏) 涉及到 FrameWork 资源,而不同版本的FrameWork资源不相同而致使 apk 出错?
问题2:是否是不同系统编译出来的资源ID不一样,导致凡是引用到Framework资源ID的多少都会出现问题。敢问系统的资源ID在哪里可以看到。eclipse的R文件可以看到资源ID,但系统 mmm 编译我不知道在哪里。
问题3:一般由一个旧系统升级到一个新系统,比如4.0升到4.1,难道只有重写代码这条路,就不能利用之前写的那些(就是把就系统的整个apk的源码放到新系统里面,而不是在新系统一行行改)?各位一般如何升的,求一种合理的升级方法。
我初学不久,词语可能用得不恰当,标题都不知道用什么关键词,敢情各位不吝赐教。
[解决办法]
LZ 的问题 我就不一一回答了 费劲。 首先你移植4.0的某些功能时,先要了解4.1有哪些特性、对比4,1和4,。0 看4.1在4.0的基础上做了哪些修改功能或者BUG
如果是整个应用移植 与framework底层、其他的没什么挂钩就可以直接放在package/app 或这vender...路径下
涉及到framework底层的东西 就需要对比一下4.0和4.1的代码 相应的一个功能、一个功能的添加 修复 慢慢的移植
[解决办法]
拿楼主的比如Launcher例子来说把,
楼主是要将4.0的直接放到4.1上跑起来?还是将4.0上你改的东西在4.1的源码上也修改?
如果是,那就没多大意义,因为4.1的比4.0的功能是更完善的,比如桌面应用程序、快捷方式、插件支持相互之间托动交换位置;
如果不是,那就要基于4.1的源码,将你在4.0上改的东西在4.1上重新做一次,说是做一次,其实就是把修改的文件重新改一遍;
还有像楼主说第三方的桌面,能在android很多版本上跑起来,而Android的自带Launcher却不能,因为系统的应用都有直接调用系统隐藏的方法之类的,而随着版本的升级,那些隐藏Api里面的方法可能参数会变,又或者名字会变,所以不能通用,如果你想通用,那你把那些隐藏的方法全部去了,用其他方式实现
[解决办法]