首页 > 其他分享 >Android类库打包方法探究

Android类库打包方法探究

时间:2022-12-09 17:01:55浏览次数:58  
标签:类库 mylib res jar apk 探究 Android


  众所周知,Android应用使用ADT打包成apk,apk中包含了运行程序所需要的一切,包括:class、asset、res、AndroidManifest.xml等。而对于类库项目(library project),ADT生成的jar包里只包含编译生成的class文件,不包含res资源文件,res只能在应用项目打包apk的时候打进apk包。

  那考虑自行导出jar如何? 针对类库项目(library project)执行导出(export),导出时把res打上勾,这样导出的jar包里确实包含了res下的资源文件。很不幸,经反复试验得知,即使在jar包里包含了res,目标应用项目在编译时仍然不会对jar包里的res进行处理,打成apk包时是不会包含jar里的res的。这样一来,通过在jar包里包含res以供目标应用项目使用的路走不通了。

  先做个总结:

  1.android类库(library project)能支持打包成jar,并且jar里的字节码类文件能够成功被打进目标应用项目的apk包里。如果类库中不包含activity等需要界面资源的内容,或者在类库中手工读取资源,而不使用ADT的从res下读取资源的机制,这个类库jar的使用完全没问题,不需特别关注。

  2.res下的资源文件打进jar包没有意义,目标应用项目在打apk包时不会从jar中读取res打进apk。猜测不支持从jar中读res的可能的原因是担心资源名与目标应用项目中重复(纯属个人猜测,作不得准)。

  打不成jar包,直接把源码给出去又不合适,怎么办?

  下面是一个办法:

  1.开发类库项目(library project,即Project -> Properties -> Android -> Check "Is Library"),正常编译,生成jar包(在bin下,jar中只包含src下的类生成的字节码,不包含gen下自动生成的类,也不包含res)。假设这个类库叫做mylib,生成的jar名称为mylib.jar。

  2.新建一个类库项目(library project,同样设置 Project -> Properties -> Android -> Check "Is Library" ),假设这个类库叫做mylibdeploy,设置其命名空间与mylib相同。在mylibdeploy下新建一个libs目录,把mylib.jar导入到libs目录下。再将mylib项目下的assets、res目录复制到mylibdeploy下。

  3.开发目标应用(常规Android project,不勾选“Is Library”),在这个目标应用项目中设置对mylibdeploy的引用。引用方法如下: 打开android应用设置 Project -> Properties -> Android , 点“Add...”按钮选择mylibdeploy。经如此设置后,在目标应用项目中就可以引用mylib中的类了。最后编译、导出成apk,这个apk里会包含mylibdeploy下的res,也会包含相应的gen下自动生成的类编译后的文件。

  对于需要向外发布的类库,将mylibdeploy直接发出。可以将其压缩打包成zip或者其它的什么格式,只要使用方能解开就行。使用方(目标应用开发方)按照第3步的方式引用mylibdeploy,就能正常使用mylib.jar,正常打包apk。

  当然,在打包jar(上例中的mylib.jar)时,可以根据需要对其进行部分混淆生成不易被反编译的jar包。

  这种发布包的办法并不完美,期待ADT的改进,未来也许可以直接发布JAR。

  参考:

  Managing Projects from Eclipse with ADT

  ​​http://developer.android.com/guide/developing/projects/projects-eclipse.html​

  Android Developer Tools

  ​​http://developer.android.com/guide/developing/tools/adt.html​

  How to export the project as a JAR file

  ​​http://groups.google.com/group/android-developers/browse_thread/thread/bc4b509765bd1956​

  How to create Android library in Eclipse?

  ​​http://groups.google.com/group/android-developers/browse_thread/thread/ce546a393cbb8bcf​



标签:类库,mylib,res,jar,apk,探究,Android
From: https://blog.51cto.com/u_15907753/5926287

相关文章

  • android打开系统联系人界面
    在android应用程序的开发中,经常要实现的一个功能是调用系统自带的联系人界面,做到选择人之后,取得相应的名称和号码,并返回。android2.0前后实现方式上也有一定的差别:主要是2.0......
  • android静默安装探讨(申请加精)
     1)在网上搜寻该问题的解决方法,且查阅android开发文档,没有发现可以实现该功能的显示API调用,网络上很多人请教同样的问题,但都没有能够实现解答;说是android为了用户的安全,......
  • android之屏幕方向改变以及onConfigurationChanged事件
    注意:onConfigurationChanged事件并不是只有屏幕方向改变才可以触发,其他的一些系统设置改变也可以触发,比如打开或者隐藏键盘。当我们的屏幕方向发生改变时,就可以触发onConfig......
  • Android Studio工程目录结构分析(一)
    AndroidStudio工程目录我们这里以一个简单的HelloWorld工程来分析:1、.gradle和.idea     这两个目录下放置的都是AndroidStudio自动生成的一些文......
  • Android内存优化(使用SparseArray和ArrayMap代替HashMap)
    在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不能达到更好的性......
  • Android内存优化——常见内存泄露及优化方案
    如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,这中情况就是内存泄露......
  • 转发:前端组件化之方案探究
    背景公司目前基于多业务部门,很多业务组件和功能逻辑都具有较高的普适性,但与此同时各业务部分和开发人员缺乏一定的交流平台,更多的是在遇到对应需求时会简单内部讨论一番,......
  • 【类库合集】Python常用类库合集
    1)SSH类库——Paramiko简介:SSH是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。SSH客户端适用于多种平台,几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、D......
  • 自己动手基于 Redis 实现一个 .NET 的分布式锁类库
    分布式锁的核心其实就是采用一个集中式的服务,然后多个应用节点进行抢占式锁定来进行实现,今天介绍如何采用Redis作为基础服务,实现一个分布式锁的类库,本方案不考虑Redis集......
  • RCAR M3N Android P 编译
    1.环境搭建1.1 Nomodulenamed'Crypto'pip3installcrypto -ihttps://pypi.tuna.tsinghua.edu.cn/simple/  1.2 /bin/sh:1:lz4c:notfoundsudoapt-g......