• 问题总结2015/05/05


    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方便使用。 

     

    1. public final class R {   
    2.     public static final class anim {   
    3.         public static final int cycle_7=0x7f040000;   
    4.         … …    
    5.     }   
    6.     public static final class array {   
    7.         public static final int bank_type=0x7f050001;   
    8.         … …    
    9.     }   
    10.     public static final class id{   
    11.         public static final int account_warning_text_color=0x7f060027;   
    12.         public static final int account_withdraw_text_color=0x7f060026;   
    13.         … ...   
    14.     }   
    15.     … ...   
    16. }   

    Android布局文件中的组件被调用时需要定义组件的android:id属性,android:id属性只能接受资源类型的值,就是必须以@开头的值。们声明一个控件的ID有如下几种方式: 

    @+id =0x7f070007; 

     

    1. <TextView             
    2.    android:id="@+id/noteInfo"            
    3.    android:layout_width="match_parent"            
    4.    android:layout_height="wrap_content"/>   

    ), 

     

    1. <FrameLayout   
    2.     android:id="@android:id/tabcontent"   
    3.     android:layout_width="fill_parent"   
    4.     android:layout_height="fill_parent" >   
    5. </FrameLayout>   

      

     

    1. <?xml version="1.0" encoding="utf-8">    
    2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"      
    3.     android:id="@android:id/tabhost"    
    4.     android:layout_width="fill_parent"    
    5.     android:layout_height="fill_parent" >    
    6.     <LinearLayout    
    7.         android:orientation="vertical"    
    8.         android:layout_width="fill_parent"   
    9.         android:layout_height="fill_parent" >   
    10.         <TabWidget   
    11.             android:id="@android:id/tabs"               
    12.             android:layout_width="fill_parent"              
    13.             android:layout_height="wrap_content" />   
    14.         <FrameLayout   
    15.             android:id="@android:id/tabcontent"              
    16.             android:layout_width="fill_parent"               
    17.             android:layout_height="fill_parent" >   
    18.         </FrameLayout>   
    19.     </LinearLayout>   
    20. </TabHost>   

     

     

    /res/ 

    文件:  = () 

     

    1. <resources>   
    2.     <item name="HorizontalScrollView01" type="id"/>   
    3.     <item name="LinearLayout0000" type="id"/>   
    4.     <item name="LinearLayout01" type="id"/>   
    5. </resources>   

    public.xml文件:描述attr、id、drawable等所指定的一个32的id值,即id值。 

     

    1. <resources>   
    2.     <public id="0x7f040000" name="cycle_7" type="anim" />   
    3.     <public id="0x7f040002" name="layout_animation_image" type="id" />   
    4.     <public id="0x7f040003" name="layout_animation_linear" type="color" />   
    5. </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

  • 相关阅读:
    git
    Django RestFramework
    vuex以及axios
    npm 、webpack 、 vue-cli
    vue的生命周期
    vue-router
    vue框架 (小清单)
    nodejs review-01
    npm-bluebird使用
    js整理4
  • 原文地址:https://www.cnblogs.com/clong2010/p/4479657.html
Copyright © 2020-2023  润新知