1、第三方提供的库不能使用。
调查方法:差分编译,对比连接后和编译后的差分情况;Debug单步调试,定位出错代码;由于是第三方库不能使用的原因,反编译辅助调查。
调查结果:本机编译后的R文件中的资源ID和Jar包中索引的资源ID(Jar包的.class文件中资源ID是固定值)不一致。
解决方法:(转)http://blog.csdn.net/p106786860/article/details/12152011
===========================================================
随着Android系统的日益发展和日渐成熟,各种平台的合作就日渐频繁。现在主要互联网公司,都退出了各种各样的插件功能。如第三方支付,第三方联合登陆和微博分享等等功能。
。
在每个Android项目中,都会有一个R.java文件,该文件由ADT维护的,只要你将资源文件放到工程里,或者声明新的控件标识,ADT就会监测到,自动在R.java里注册一个ID方便使用。
- public final class R {
- public static final class anim {
- public static final int cycle_7=0x7f040000;
- … …
- }
- public static final class array {
- public static final int bank_type=0x7f050001;
- … …
- }
- public static final class id{
- public static final int account_warning_text_color=0x7f060027;
- public static final int account_withdraw_text_color=0x7f060026;
- … ...
- }
- … ...
- }
Android布局文件中的组件被调用时需要定义组件的android:id属性,android:id属性只能接受资源类型的值,就是必须以@开头的值。我们声明一个控件的ID有如下几种方式:
@+id: =0x7f070007;
- <TextView
- android:id="@+id/noteInfo"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
),。
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- </FrameLayout>
。
- <?xml version="1.0" encoding="utf-8">
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- </FrameLayout>
- </LinearLayout>
- </TabHost>
/res/:
文件: = ()。
- <resources>
- <item name="HorizontalScrollView01" type="id"/>
- <item name="LinearLayout0000" type="id"/>
- <item name="LinearLayout01" type="id"/>
- </resources>
public.xml文件:描述attr、id、drawable等所指定的一个32的id值,即id值。
- <resources>
- <public id="0x7f040000" name="cycle_7" type="anim" />
- <public id="0x7f040002" name="layout_animation_image" type="id" />
- <public id="0x7f040003" name="layout_animation_linear" type="color" />
- </resources>
基础的知识已经准备完毕,现在我们来描述原理。当我们将src目录下的源码通过Eclipse打出Jar后,源码代码中的如()中的R.id.id_name部分,都会被替换成此时在R文件中生成的id_name对应的ID值(如果有兴趣的话,可以用反编译软件可以查看到)。。
,@+id/ static final =0x7f080001。当时当你将Jar提供给第三方的时候,在它的机器上生成的ID值可能就不是0x7f080001,就会出现由于Jar中固定的ID值与当前R文件中生成的ID值不一致,导致()。
通过对上面只是的了解,我们可以用如下方式解决问题:通过使用ids.xml文件和public.xml文件,定义好固定的ID值,将声明控件的方式由@+id改为@id形式,这样引用控件和资源的id根据ids.xml和public.xml的声明,在R文件中声明为固定的值。一直与Jar中的ID值保持一致。
:
1.重新编译项目,生成R文件。
2.将R文件拷贝,根据R文件中的信息,获得ids.xml和public.xml文件中的内容。
文件格式:只需声明@id的对应的R文件中id类型
文件格式:需要声明R文件中所有资源的类型
。
id的形式转换成@id形式
。
4.使用Eclipse的Export功能,将项目src目录下的源码(注仅仅是src目录下的源码,其它资源我们将以库项目的形式提供给用户)导出Jar包,提供给用户调用。
= ()。
5.我们删除该项目src下的源代码,将该项目设置为库项目,以供客户引入或许Jar包中的布局,图片等资源。
到这里我们为客户准备的东西已经完毕,1.srcjar.jar包,2.plugin资源库项目。
并引入我们的plugin资源库项目)。
7.将plugin资源库项目的AndroidManifest.xml中的内容,添加到客户项目中,并在客户端项目中调用srcjar.jar包中的入口Activity即可。
注意:如果在你的项目中存在调用本项目目录调用资源,如assets下的apk或者mp3等文件,可以拷贝到客户端相应的目录即可。
。
===========================================================
2、表单提交时,提示数据通信异常(源代码中的错误提示有误导......坑爹=。=)。
调查方法:辅助fidder抓包工具,监控表单提高及服务器响应情况。
调查结果:服务器响应失败。提交的表单中有不合法的数据。
前端与后端协作时要注重接口的对接(一切以接口文档为准),出现问题时首先确保提交和返回的数据正确,然后在展开调查。
相关资料:
http://blog.csdn.net/xyz_lmn/article/details/8808169
http://www.cnblogs.com/tankxiao/archive/2012/02/06/2337728.html
http://blog.csdn.net/ithomer/article/details/6727581
http://blog.isming.me/2015/01/18/android-anti-decompile/
http://blog.csdn.net/vipzjyno1/article/details/23542617