Android应用作为jar包导入到其他app中资源文件找不到问题

简单为大家谈谈Google ARCore客户端 一、前言 AR(Augmented Reality:增强现实) 今年年初上的一部电影:《头号玩家》,就是一个虚拟游戏世界,模拟出了各种现实的感觉。 当然,我个人的理解,头号玩家里面的场景我是划分为VR,大部分只是个虚拟现实,把人融入到虚拟的世界里面,而AR则是把虚拟的东西融入到现实的世界中来; 咱们今天说的只是增强视觉方面,当然AR不仅仅只是增强视觉,包括听觉,触觉,味觉,嗅觉等等,使用虚... 阅读详情

随着Android系统的日益发展和日渐成熟,各种平台的合作就日渐频繁。现在主要互联网公司,都退出了各种各样的插件功能。如第三方支付,第三方联合登陆和微博分享等等功能。 

近期由于业务的需要,公司提出将项目的功能打成jar包,提供给其它客户调用。经过一段时间的调查研究和实践,先将解决办法总结如下。 

一、原理介绍 

在每个Android项目中,都会有一个R.java文件,该文件由ADT维护的,只要你将资源文件放到工程里,或者声明新的控件标识,ADT就会监测到,自动在R.java里注册一个ID方便使用。 

[java] view plaincopy
  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:当我们保存布局文件后,系统会自动的在R.java中生成一个int类型的16进制值的变量。public static final int noteInfo=0x7f070007; 

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

方式二@id:使用固定id值(可在ids.xml文件和public.xml文件中指定),不自动生成。 

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

方式三@android:id:通过该系统定义好的id值,引用Android系统内部资源。  

[html] view plaincopy
  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>   

TabHost的id必须是tabHost,TabWidget的id必须是tabs,FrameLayout的id必须是tabcontent。这些id都是直接引用的系统的值。 

 

在项目的/res/values目录下,我们可以定义如下两个文件,分别介绍它的作用: 

ids.xml文件:为 应用相关的资源提供唯一的资源id,id是为了获得xml中的对象而需要的参数,也就是Object = findViewById(R.id.id_name)中的id_name。这些值可以在代码中用android.R.id引用到。 

[html] view plaincopy
  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值。 

[html] view plaincopy
  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后,源码代码中的如Object = findViewById(R.id.id_name)中的R.id.id_name部分,都会被替换成此时在R文件中生成的id_name对应的ID值(如果有兴趣的话,可以用反编译软件可以查看到)。但是由于R文件中的ID值是由系统自动生成的,而且在不同的系统环境和不同的时间,id_name对应的ID可能不一样。 

 

故我们就出现了如下问题:假设在生成Jar包的时候,@+id/id_name在R文件中自动生成的ID值为public static final int action_settings=0x7f080001。当时当你将Jar提供给第三方的时候,在它的机器上生成的ID值可能就不是0x7f080001,就会出现由于Jar中固定的ID值与当前R文件中生成的ID值不一致,导致Object = findViewById(R.id.id_name)无法找到控件的对象的问题。 

 

通过对上面只是的了解,我们可以用如下方式解决问题:通过使用ids.xml文件和public.xml文件,定义好固定的ID值,将声明控件的方式由@+id改为@id形式,这样引用控件和资源的id根据ids.xml和public.xml的声明,在R文件中声明为固定的值。一直与Jar中的ID值保持一致。 

 

二、操作步骤 

这里我们就以一个简单的项目v_main_plug演示操作步骤: 

1.重新编译项目,生成R文件。 


2.将R文件拷贝,根据R文件中的信息,获得ids.xml和public.xml文件中的内容。 

ids.xml文件格式:只需声明@id的对应的R文件中id类型 


public.xml文件格式:需要声明R文件中所有资源的类型 


可能由于项目中的资源比较多,实际工作中可以使用文本工具自动替换,或写程序自动替换。 

3.将项目布局文件中@+id的形式转换成@id形式。 

这个可以使用Eclipse的搜索和替换功能很快的实现。 


4.使用Eclipse的Export功能,将项目src目录下的源码(注仅仅是src目录下的源码,其它资源我们将以库项目的形式提供给用户)导出Jar包,提供给用户调用。 


这里我补充解释一下,此时导出的Jar,里面的Object = findViewById(R.id.id_name)的R.id.id_name等部分,是从public.xml文件中设置的固定值替换,所以一直保持一致。 

5.我们删除该项目src下的源代码,将该项目设置为库项目,以供客户引入或许Jar包中的布局,图片等资源。 


到这里我们为客户准备的东西已经完毕,1.srcjar.jar包,2.plugin资源库项目。 

6.将srcjar.jar包加入客户的项目中(我们以jardemo项目简单模拟),并引入我们的plugin资源库项目(注客户项目一定要和资源项目在同一个目录下)。 


7.将plugin资源库项目的AndroidManifest.xml中的内容,添加到客户项目中,并在客户端项目中调用srcjar.jar包中的入口Activity即可。 

注意:如果在你的项目中存在调用本项目目录调用资源,如assets下的apk或者mp3等文件,可以拷贝到客户端相应的目录即可。 

Android Studio 加载第三方jar包(jar包和res分开的情况) 首先我们先来了解一下Eclipse和AndroidStudio(下面简写成AS)两种android开发工具导入jar包的方式。Eclipse (jar解决方案) 1. 只有jar包无res文件的情况下,直接把jar包拷贝到项目的libs目录下(在与res平级的目录下新建libs文件夹),然后右击jar包,选择Build Path中的Add toBuild Path,即可。 2. 既有ja 阅读详情

相关推荐

Android 应用提供SDK Jar包给第三方使用 (设计思路 以及实现步骤)

最近想总结一下关于应用如何封装自己的SDK给第三方应用使用,提供jar包给第三方使用是现在比较常见的方式,方式有很多种,但是具体的大体思路都是一样的,今天写了一个SDK封装的大体框架Demo,方便后期查查阅: 工具基于AndroidStudio 3.6.3版本 AndroidSDKDemo 大体的设计思路分为三个步骤 第一: 服务端 作为服务端 我们需要建立自己的aidl 以及实现类 方便第三方调用的时候 将服务端代理的句柄传给SDK 第二: SDK作为服务端和客户端的中间代理,可以直接拿到服务代理对象进行操作,并暴露给客户端可见的实用类和接口回调类 第三: 客户端只能使用SDK暴露出来的接口

日积月累:Android项目打第三方jar包

随着Android系统的日益发展和日渐成熟,各种平台的合作就日渐频繁。现在主要互联网公司,都退出了各种各样的插件功能。如第三方支付,第三方联合登陆和微博分享等等功能。 近期由于业务的需要,公司提出将项目的功能打成jar包,提供给其它客户调用。经过一段时间的调查研究和实践,先将解决办法总结如下。 一、原理介绍 在每个Android项目中,都会有一个R...

移动编程 336

别再只盯着YOLOv8了!手把手带你用PaddleDetection的PP-YOLOE+搞定你的第一个检测项目

本文介绍了PP-YOLOE+在目标检测领域的优势与应用实践,对比YOLOv8展示其在精度、速度和部署便利性上的突破。通过详细的代码示例和实战教程,帮助开发者快速上手PaddleDetection工具链,实现产业级目标检测项目,提升开发效率。

weixin_42701915的博客 185

android使用第三方jar包,出错notfound

使用第三方jar包 除了我以下介绍的方法,别的方法我基本上都试验过,均会出现编译或运行错误。以下方法经测试编译和运行都完全没问题。 步骤: 方法1:Eclipse下, 右键工程, Build path, java build path,选择libraries 在右边的按钮中点击“Add Library” 选择“User library”,点击“下一步” 点击“User...

dztdztdzt的专栏 483

零外围电路!用CH340X实现ESP32一键下载的完整教程

本文详细介绍了如何利用CH340X系列USB转串口芯片实现ESP32的一键自动下载功能,无需任何外围逻辑控制电路。通过解析CH340X的增强型DTR/RTS功能,提供核心电路设计、电压匹配方案,并指导在Arduino IDE和PlatformIO中进行软件配置,帮助开发者构建简洁、可靠且低成本的ESP32下载方案。

gpu4optimizer的博客 774

深入解析PVT corner:从wcl到ml的芯片设计关键考量

本文深入解析了芯片设计中的PVT corner概念,重点探讨了从传统WC到先进工艺下WCL、ML等关键工艺角。文章详细阐述了温度反转效应如何使低温WCL成为最严苛的时序场景,并提供了基于先进工艺的实战签核策略与多角多模分析流程,确保芯片在极端工艺、电压、温度下的稳健性。

tree8的博客 526

Android引入第三方jar包识别不到类

第一部分:异常情况处理 按照第二部分正常引入第三方jar包正常使用之后,项目若引入新的第三方库后,出现引入的jar包资源又变红,编译不通过的异常。解决方式:手动将xxx.iml 文件中的 <orderEntry type="jdk" jdkName="Android API 30 Platform" jdkType="Android SDK" />移动到文件最后即可。 第二部分:正常引入jar包核心步骤 1、引入第三方jar包 provided files('libs/..

WALL_robot_的博客 2544

用C#语言实现记事本

本次程序设计作业为用C#语言设计一个记事本,设计的记事本应与电脑系统自带的记事本类似,最后实现的界面及功能应类似于下图。

qq_57738695的博客 2847

Android AR 编写指南

ar 编写指南

adc_god的博客 573

【2025最新】Multisim 14.3超详细安装步骤 【附安装包+永久+汉化】|Multisim 14.3

嗨,小伙伴们!是不是一直在找可靠的multisim下载安装教程?今天就给大家带来超详细的2025年Multisim 14.3安装全攻略!这款电路仿真神器绝对是学电子、做电路设计的必备工具!很多朋友后台留言说安装时各种报错、汉化失败,所以我决定出一期零基础、保姆级的教程,从下载到安装再到汉化,全部一步到位搞定!按照我的步骤来,包你顺利安装不出错!!!通过本教程,相信大家已经成功安装并配置好了Multisim 14.3。这款电路仿真神器能帮你设计和测试各种电路,从简单的LED闪烁到复杂的信号处理电路都不在话下。

pythonpapaxia的博客 8万+

gcc/g++ 链接库的编译与链接

gcc/g++ 链接库的编译与链接 surgewong@gmail.com http://blog.youkuaiyun.com/surgewong       程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可

Surge 4万+

如何制作Jar包并在android中调用jar包

android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmanifest.xml和res文件夹,就可以了。否则在调用jar包的时候会出现“Error generating final archive: Found duplicate file for APK

记事本 6447

ESP32-IDF开发之旅 外设篇④ 串口通信 Uart

ESP32-S3 UART串口通信详解 本文介绍了ESP32-S3的UART串口通信配置流程,涵盖硬件引脚分配、参数设置、数据收发等关键步骤。

单片机菜鸟哥的博客 495

Android打jar包之将Android工程连同第三方jar包一起打包成jar包问题总结

由于项目需要,需要将Android工程打包成jar包供他人调用,随着功能的增加,需要引入第三方jar包的功能,因而要将Android工程连同第三方的jar包一起重新打包成jar包,现在将实际操作中的一些问题稍作总结。 Android工程打包成jar包一共可分为三种情况,下面针对不同情况总结不同的打包方法: 情况一:需要打包的Android工程不包含任何资源文件,只需打包源代码 方法1

小小程序员 6223

Google Earth Engine(GEE)——MOD09A1/MOD11A2/MOD13A1不同的QA波段去云进行分析

​​​​​​​大多数光学卫星图像产品都带有一个或多个 QA 波段,允许用户评估每个像素的质量并提取满足其要求的像素。QA 波段最常见的应用是提取有关多云像素的信息并对其进行屏蔽。但是 QA 波段包含大量其他信息,可以帮助您从分析中删除低质量数据。通常,QA 频带中包含的信息存储为按位标志。在这篇文章中,我将介绍与位运算相关的基本概念,以及如何使用位掩码提取和屏蔽特定的质量指标。

此星光明博客 4575

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android开发~制作JAR包

一、概述(开发环境Android Studio 1.0.1) 在项目开发过程中,当我们项目积累越来越多,有一些公用的代码可以重用,或者做一些SDK类型项目的时候就需要打包自己的JAR了。之前如果使用eclipse开发android项目,打包JAR的例子网上可以找到很多,但切换到使用Android Studio,新的问题就又出现了。 二、使用Android Studio制作JAR 1、新建项目

阿福的专栏 6181

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android Studio 生成JAR包和调用JAR包方法

5、新建mylibrary\src\main\java\com\example\mylibrary\Jarlibrary.java。原文链接:https://blog.youkuaiyun.com/qq_37858386/article/details/114522709。二、编译出来的jar可以直接看,有时候copy jar文件到libs后,需要关闭工程重新打开才能import调用。1、复制上面生成的jarsdk.jar到路径app\libs\下面。8、生成jar包jarsdk.jar。

xiaoyifeishuang1的博客 5006

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

AS如何引用本地jar包问题解决方案

从Eclipse转Android Studio后,很多操作都不是很清楚,就包括jar包的使用,直到昨天出现了问题,才去找原因并解决。问题是这样的:自定义的控件打成jar包了,在其他工程中调用,在运行时出现错误,提示说在xml中的自定义控件无法填充。在xml中弹出错误,说NoClassDefFoundError,进入源码发现指向的是styleable,也就是自定义属性。毫无疑问,这就是R文件的问题了。

成长的味道 1万+

Android Studio 将公共工具库打成jar包和arr包的方法!

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。(以下体系的复习资料是我从各路大佬收集整理好的)《Android开发七大模块核心知识笔记》《960全网最全Android开发笔记》《379页Android开发面试宝典》历时半年,我们整理了这份市面上最全面的安卓面试题解析大全包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。

2401_84149557的博客 1403

android工程中引入第三方JAR包后安装APK时老是提示找不到库文件

android工程中引入第三方JAR包后安装APK时老是提示找不到库文件 || Android如何将程序打成jar包 || 运行java.lang.noclassdeffounderror错误 分类: android研发2011-07-28 17:321177人阅读评论(2)举报 使用第三方jar包 除了我以下介绍的方法,别的方法我基本上都试验过,均会出现编译或运行错误。以下方法

joeyaung_1983的专栏 1165

Android studio 将 Module 打包成 Jar 包

  整理记录 AndroidStudio 把一个 module 项目打包成 jar 包。 一、默认自动生成的 jar 包   众所周知 android studio 会在library所依赖的 app运行 或 build 之后自动生成 jar 包,路径为 Module根目录/build/intermediates/bundles/debug or release/classes.jar,这样生成的...

weixin_34184561的博客 1685

Android Studio打包生成Jar包的方法

Android studio 将 Module 打包成 Jar 包   整理记录 AndroidStudio 把一个 module 项目打包成 jar 包。 一、默认自动生成的 jar 包   众所周知 android studio 会在library所依赖的 app运行 或 build 之后自动生成 jar 包,路径为 Module根目录/build/intermediates/bundl...

chenhuakang的博客 1万+

Android JAR包的生成与调用

在项目开发中常常需要将Activity导出成JAR包,方便别人去调用。最近由于项目需要,我要将自定义的代码导出成jar包,给别人去调用开发。之前没弄过,于是上网查看别人是怎么实现的。但是看了很多博客发现要么是全文字,讲的云里雾里,要么是讲的遮遮掩掩,将的不全。我查看了许多资料,终于搞清楚jar包的导出与调用的方法。将我的理解与大家分享。 下面

sunrise_zhu的专栏 2376

Android 之 将 Module 打包成 Jar 包

 整理记录AndroidStudio 把一个 module 项目打包成 jar 包。 一、默认自动生成的 jar 包   众所周知 android studio 会在library所依赖的 app运行 或 build 之后自动生成 jar 包,路径为 Module根目录/build/intermediates/bundles/debug or release/classes.jar,这样生成...

早日成为鹏总 1867

Android Studio开发生成自己的SDK核心Jar包文件

作为Android开发者我们用过很多SDK,比如友盟、微博、支付宝、Mob等等?当我们饶有兴趣的想研究一下这些SDK源码的时候发现,都是a、b、d啊一些字母,看得你都烦躁了,其实只是它们的研发人员对代码进行了混淆。代码混淆其实是一种自我保护的方式,可以有效防止自己的核心业务模块被轻而易举破解。今天我们要讲的就是发布自己的SDK,所以代码混淆也是本文的一个重点,现在我们开始一步步进行说明:1、首先开...

雨打芭蕉的博客 6862
上一篇: Android Animation动画
下一篇: 推荐移动建站工具
notebook034
博客等级 码龄16年 6粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值