首页> 搜索结果页
"android google api jar" 检索
共 388 条结果
使用内部(com.android.internal)和隐藏(@hide)API手记
使用内部(com.android.internal)和隐藏(@hide)API手记   内部API和隐藏API的不同   隐藏API隐藏是为了防止开发人员使用SDK中未完成或者未稳定(接口和架构方面看)的部分。比如,Bluetooth API在API Level 5(android 2.0)之前就存在,但在API Level 3和4(android 1.5和1.6)中使用@hide隐藏起来了。当该API稳定下来,google的开发人员移除@hide属性,在API Level 5中就有Bluetooth API了。还有很多东西在Level 4和5之间发生了变化。如果程序依赖于某些隐藏API,可能会在新版本的Android OS上运行出现问题。   而内部API则不计划对外开放。这是android的内部餐厅,开发人员可以视为黑盒子。这里面的东西同样可能发生改变。同样的,如果您的程序依赖于内部API,在新的Android发布后,可能遇到麻烦。     下面总结它们之间的不同:隐藏API = 正在开发中;内部API = 黑盒   1)配置SDK路径 1.1)Ubuntu: Ctrl+Alt+T打开终端 gedit ~/.bashrc export SDK_HOME=<SDK路径> export PATH=$PATH:$SDK_HOME/platform-tools:$SDK_HOME/tools source ~/.bashrc   1.2)Windows: 我的电脑->右键属性->高级->环境变量 选择系统变量新建:SDK_HOME=<SDK路径> 选择系统变量Path编辑:%SDK_HOME%\platform-tools;%SDK_HOME%\tools;<原Path>     不一定要配置,只是为了方便启动某些工具==     以下是在Windows XP下操作的~   2)AVD Manager创建模拟器并启动   以下以2.3.3平台为例了~   3)从模拟器获取framework.jar   每个模拟器或者真实设备都有一个与android.jar等价的包用于运行时。我们可以取得此jar,解出原始的.class文件,然后复制到android.jar。   adb pull /system/framework/framework.jar C:\   4)解压framework.jar获取classes.dex 5)dex2jar反编译得到原classes   dex2jar下载:http://code.google.com/p/dex2jar/downloads/list   classes.dex放到<dex2jar目录>内或指定绝对路径,例如为C:\classes.dex时:   进入<dex2jar目录> dex2jar C:\classes.dex     得到classes_dex2jar.jar。   6)创建SDK定制平台   进入<SDK路径>\platforms,复制一份对应平台。2.3.3为API-10,所以如下:   复制android-10,重命名为android-10-internals。并如下修改: 1. 把上述classes_dex2jar.jar移动至android-10-internals目录 2. 解压android.jar&classes_dex2jar.jar进各自目录 3. 复制classes_dex2jar.jar解压内容全部替换android.jar解压内容 4. 重新压缩android.jar解压内容至zip,删除冗余东西,重命名回android.jar 5. 修改build.prop文件,具体如下: ro.build.version.sdk=10 –> ro.build.version.sdk=-10 6. 修改source.properties文件,具体如下: Platform.Version=2.3.3 –> Platform.Version=2.3.3.extended     此时重启Eclispe,即可看到我们定制的扩展SDK平台了,此时其实使用隐藏API已经足够了。     注意:重新压缩成的android.jar,看一下目录结构,不要把外层目录也加进去了。   7)定制ADT,去除ForBidden   到目前为止,ADT仍然禁止使用com.android.internals包中的类。   右键任一Android工程->Properties->左侧Java Build Path->右侧Libraries标签->Android XXX->android.jar->Access rules->Forbidden: com/android/internal/**     越过该限制规则,最简单的方式是修改ADT字节码。只需替换"com/android/internal/**”字符串为其它的字符串,比如"com/android/internax/**”。   1. 关闭Eclipse 2. 在<Eclipse目录>\plugins目录,按名称排下序,按c,找到com.android.ide.eclipse.adt_*.jar 3. 复制到外部,解压修改再打包回去,修改如下:   找出com\android\ide\eclipse\adt\internal\project\AndroidClasspathContainerInitializer.class文件   记事本打开文件,查找com/android/internal/**,替换为com/android/internal/**为com/android/internax/**。 4. 回到plugins目录,重命名原先的添加_bak,备份下,把新jar放入。 5. 打开Eclipse,再检查下^^     报错:parseSdkContent failed com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer : Unsupported major.minor version 8241.8224     不能以记事本打开,ASNI?字节码变掉了应该==     用一些Editor以16进制方式打开搜索**,即2A 2A。把l->x,即6C->78。重弄遍,ok^^。备份是好习惯啊!   8)后记   本文源于如下网址:http://mogoweb.net/?s=%40hide;共有四部分,明细地址如下:   第1部分,介绍:http://mogoweb.net/archives/87   第2部分,定制android.jar:http://mogoweb.net/archives/92   第3部分,定制android平台:http://mogoweb.net/archives/104   第4部分,定制ADT:http://mogoweb.net/archives/117     当然,也有其他使用隐藏API的方式,不过觉着这个方式更优秀^^。     还有,AndroidManifest.xml内会是<uses-sdk android:minSdkVersion="-10" />。     补充:发现4.0模拟器内的framework.jar分出了个odex了==。   以下是反编译好的两个framework.jar(classes):   1)4.0.1(模拟器导出):framework_4.0.1.jar   2)4.0.3(源码编译得):framework_4.0.3.jar   具体如何操作,参见《Android混淆、反编译以及反破解的简单回顾》最后的补充^^。      本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/861758,如需转载请自行联系原作者
文章
Java  ·  API  ·  开发工具  ·  Android开发
2017-11-15
使用内部(com.android.internal)和隐藏(@hide)API手记
使用内部(com.android.internal)和隐藏(@hide)API手记   内部API和隐藏API的不同   隐藏API隐藏是为了防止开发人员使用SDK中未完成或者未稳定(接口和架构方面看)的部分。比如,Bluetooth API在API Level 5(android 2.0)之前就存在,但在API Level 3和4(android 1.5和1.6)中使用@hide隐藏起来了。当该API稳定下来,google的开发人员移除@hide属性,在API Level 5中就有Bluetooth API了。还有很多东西在Level 4和5之间发生了变化。如果程序依赖于某些隐藏API,可能会在新版本的Android OS上运行出现问题。   而内部API则不计划对外开放。这是android的内部餐厅,开发人员可以视为黑盒子。这里面的东西同样可能发生改变。同样的,如果您的程序依赖于内部API,在新的Android发布后,可能遇到麻烦。     下面总结它们之间的不同:隐藏API = 正在开发中;内部API = 黑盒   1)配置SDK路径 1.1)Ubuntu: Ctrl+Alt+T打开终端 gedit ~/.bashrc export SDK_HOME=<SDK路径> export PATH=$PATH:$SDK_HOME/platform-tools:$SDK_HOME/tools source ~/.bashrc   1.2)Windows: 我的电脑->右键属性->高级->环境变量 选择系统变量新建:SDK_HOME=<SDK路径> 选择系统变量Path编辑:%SDK_HOME%\platform-tools;%SDK_HOME%\tools;<原Path>     不一定要配置,只是为了方便启动某些工具==     以下是在Windows XP下操作的~   2)AVD Manager创建模拟器并启动   以下以2.3.3平台为例了~   3)从模拟器获取framework.jar   每个模拟器或者真实设备都有一个与android.jar等价的包用于运行时。我们可以取得此jar,解出原始的.class文件,然后复制到android.jar。   adb pull /system/framework/framework.jar C:\   4)解压framework.jar获取classes.dex 5)dex2jar反编译得到原classes   dex2jar下载:http://code.google.com/p/dex2jar/downloads/list   classes.dex放到<dex2jar目录>内或指定绝对路径,例如为C:\classes.dex时:   进入<dex2jar目录> dex2jar C:\classes.dex     得到classes_dex2jar.jar。   6)创建SDK定制平台   进入<SDK路径>\platforms,复制一份对应平台。2.3.3为API-10,所以如下:   复制android-10,重命名为android-10-internals。并如下修改: 1. 把上述classes_dex2jar.jar移动至android-10-internals目录 2. 解压android.jar&classes_dex2jar.jar进各自目录 3. 复制classes_dex2jar.jar解压内容全部替换android.jar解压内容 4. 重新压缩android.jar解压内容至zip,删除冗余东西,重命名回android.jar 5. 修改build.prop文件,具体如下: ro.build.version.sdk=10 –> ro.build.version.sdk=-10 6. 修改source.properties文件,具体如下: Platform.Version=2.3.3 –> Platform.Version=2.3.3.extended     此时重启Eclispe,即可看到我们定制的扩展SDK平台了,此时其实使用隐藏API已经足够了。     注意:重新压缩成的android.jar,看一下目录结构,不要把外层目录也加进去了。   7)定制ADT,去除ForBidden   到目前为止,ADT仍然禁止使用com.android.internals包中的类。   右键任一Android工程->Properties->左侧Java Build Path->右侧Libraries标签->Android XXX->android.jar->Access rules->Forbidden: com/android/internal/**     越过该限制规则,最简单的方式是修改ADT字节码。只需替换"com/android/internal/**”字符串为其它的字符串,比如"com/android/internax/**”。   1. 关闭Eclipse 2. 在<Eclipse目录>\plugins目录,按名称排下序,按c,找到com.android.ide.eclipse.adt_*.jar 3. 复制到外部,解压修改再打包回去,修改如下:   找出com\android\ide\eclipse\adt\internal\project\AndroidClasspathContainerInitializer.class文件   记事本打开文件,查找com/android/internal/**,替换为com/android/internal/**为com/android/internax/**。 4. 回到plugins目录,重命名原先的添加_bak,备份下,把新jar放入。 5. 打开Eclipse,再检查下^^     报错:parseSdkContent failed com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer : Unsupported major.minor version 8241.8224     不能以记事本打开,ASNI?字节码变掉了应该==     用一些Editor以16进制方式打开搜索**,即2A 2A。把l->x,即6C->78。重弄遍,ok^^。备份是好习惯啊!   8)后记   本文源于如下网址:http://mogoweb.net/?s=%40hide;共有四部分,明细地址如下:   第1部分,介绍:http://mogoweb.net/archives/87   第2部分,定制android.jar:http://mogoweb.net/archives/92   第3部分,定制android平台:http://mogoweb.net/archives/104   第4部分,定制ADT:http://mogoweb.net/archives/117     当然,也有其他使用隐藏API的方式,不过觉着这个方式更优秀^^。     还有,AndroidManifest.xml内会是<uses-sdk android:minSdkVersion="-10" />。     补充:发现4.0模拟器内的framework.jar分出了个odex了==。   以下是反编译好的两个framework.jar(classes):   1)4.0.1(模拟器导出):framework_4.0.1.jar   2)4.0.3(源码编译得):framework_4.0.3.jar   具体如何操作,参见《Android混淆、反编译以及反破解的简单回顾》最后的补充^^。      本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/861758,如需转载请自行联系原作者
文章
Java  ·  API  ·  开发工具  ·  Android开发
2017-11-10
Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分
如果开发的应用用户较多,那么必须保证应用在多个版本不同的设备上能够正确的运行。这就要求对各个版本比较熟悉,知道在什么版本中加入了什么新的功能或特性。但是Android的版本太多了,是个令人头疼的问题。如果想了解Android的版本差异,建议读一下Android开发者文档上相关的章节。 为了让你的应用程序指定可以运行的版本,Android的manifest文件中提供了<uses-sdk>标签。该标签中有三个属性,分别是minSdkVersion,targetSdkVersion,maxSdkVersion。这三个属性比较容易让人迷惑,我也是仔细读了谷歌的官方文档,才弄清楚这三个属性的意义。此外,在项目构建时,还有个概念叫build target,在本文中也会进行分析。 什么是API level 其实标签<uses-sdk>中指定的并不是我们使用的sdk的版本,也不是Android系统的版本,而是我们使用的Android平台的版本,即API level。API level是一个整数,它指的是我们使用的框架(Framework)的版本,也就是我们使用的sdk中的各个平台下的android.jar。但是这个API level又和Android系统的版本有着对应关系,并且每个系统都会在内部记录它所使用的API level。举例来说,我使用的手机系统是Android 2.3.3, 那么它就会在内部记录使用的API level为10。这个内部的API level可以让系统判定能不能安装一款app,这个问题会在下文中提及。 下面给出android系统版本,API level和版本代号之间的对应关系表。(该表来自谷歌官方文档:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#provisional) 由上表可以看出,android的系统版本和API level之间并不是一一对应的,比如Android 2.3, Android 2.3.1, Android 2.3.2对应API level 9, 而Android 2.3.3, Android 2.3.4对应API level 10。API level是Android向开发者提供的一套Framework(android.jar)的代号,可能发布了新的系统版本,但是这一套接口并没有变化,所以就不必提供新的Framework开发包,所以API level也不必改变。由此可知Android系统版本和API level是多对一的关系。由于API level就是发布的android.jar(一套接口)的代号,所以API level和sdk中platforms目录中的各个android.jar是一一对应的。说白了,Android系统版本是给Android用户看的,而API level是给应用程序开发者看的。 什么是build target build target并不存在于manifest文件中,而是存在于项目根目录中的project.properties文件中。如果使用Eclipse构建项目的话,那么每个项目的根目录下都会有一个project.properties文件,这个文件中的内容用于告诉构建系统,怎样构建这个项目。打开这个文件,除了注释之外,还有以下一行: target=android-18 这句话就是指明build target,也就是根据哪个android平台构架这个项目。指明build target为android-18,就是使用sdk中platforms目录下android-18目录中的android.jar这个jar包编译项目。同样,这个android.jar会被加入到本项目的build path中。如下图: 每当修改了build target,就会将另一个android.jar加入到build path中替换原来的jar。将build target改成android-17后的效果如下图: 如果将build target 改成android-8,那么就会使用sdk中android-8下的android.jar编译项目,如果在Activity中调用ActionBar相关的Api,那么就会报错,因为ActionBar相关的Api是在API level 11中才加进来的。 一般情况下,应该使用最新的API level作为build target。这也是eclipse生成项目时的默认行为。 android:minSdkVersion 指明应用程序运行所需的最小API level。如果不指明的话,默认是1。也就是说该应用兼容所有的android版本。我们应该总是声明这个属性。 如果系统的API level低于android:minSdkVersion设定的值,那么android系统会阻止用户安装这个应用。下载将android:minSdkVersion设置为11, 并且将该应用安装在android 2.3的手机上(对应API level 9),在安装时会有如下提示: 提示手机API level的版本太低,安装失败。 如果指明了这个属性,并且在项目中使用了高于这个API level的API, 那么会在编译时报错。将build target设为最新的android-19,那么就会使用最新的android-19下的android.jar来编译项目。将minSdkVersion设置为8。在使用的android.jar中,肯定会有和ActionBar相关的API, 但是在项目中调用ActionBar API, 项目会报错。因为minSdkVersion指明的API level 8中不存在ActionBar相关的API。 调用Activity.getActionBar()和ActionBar.getHeight()方法需要API level 11, 但是指定的minSdkVersion为8,所以报错。由此可见,minSdkVersion不仅在程序安装时起作用,也会在项目构建时起作用。 如果没有设置minSdkVersion这个属性,那么默认是1。表明程序兼容所有的Android系统,能够在所有Android系统上运行。如果使用了高于API level 1 的API, 如ActionBar。那么在构建项目时,会提示和上面相同的错误,项目构建失败。 android:targetSdkVersion 标明应用程序目标API Level的一个整数。如果不设置,默认值和minSdkVersion相同。 这个属性通知系统,你已经针对这个指定的目标版本测试过你的程序,系统不必再使用兼容模式来让你的应用程序向前兼容这个目标版本。应用程序仍然能在低于targetSdkVersion的系统上运行。 由于Android不断向着更新的版本进化,一些行为甚至是外观可能会改变。然而,如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续以期望的形式来运行。你可以通过指定targetSdkVersion来匹配运行程序的平台的 API level来禁用这种兼容性行为。举例来说,设置这个值为11或更高,当你的应用运行在Android3.0或更高的系统上时,系统会为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level 11就暗示了支持大屏幕。 根据你设置的targetSdkVersion 的值,系统会执行很多兼容行为。一些行为在对应平台版本的Build.VERSION_CODES中有讨论。 为了让你的应用程序支持每个Android版本,你应当提高targetSdkVersion的值到最新的API level,然后在对应的平台上彻底的测试你的应用。 从上面的论述可知,targetSdkVersion这个属性是在程序运行时期起作用的,系统根据这个属性决定要不要以兼容模式运行这个程序。 一般情况下,应该将这个属性的值设置为最新的API level 值,这样的话可以利用新版本系统上的新特性。eclipse在生成项目时,默认将该值设置为最高,如果设置一个较低的值,会给出一个警告,如下图所示。 这个警告的意思是没有将targetSdkVersion的值设置为最高值,较新的系统会以兼容模式运行该程序。请考虑在新版本系统上测试程序并将targetSdkVersion设置为最新。更详细的信息请参考android.os.Build.VERSION_CODES 。 android:maxSdkVersion 标明可以运行你的应用的最高API Level版本。 在Android1.5, 1.6, 2.0 和2.0.1,在安装应用或系统升级时,系统会检查这个值。在这两种情况下,如果应用设置的maxSdkVersion 值低于系统本身使用的API Level,系统将不会允许安装该应用。在系统升级后,新系统会重新校验这个值,如果新系统的API Level高于这个值,新系统会删除你的应用。 在高于2.0.1的系统上,安装应用时不会再检验应用中设置的maxSdkVersion值,在系统升级后也不会重新校验这个值。但是在向用户展示可用的应用时,Google Play会继续使用这个属性进行过滤。 maxSdkVersion这个属性本来是在程序安装时和系统升级后起作用的。但是根据官方文档中的说明, 已经不再推荐使用这个属性。 经过测试,将maxSdkVersion的值设置成9,程序是可以安装在4.2的手机上的。说明这个值已经不再起作用。 [html] view plain copy    <uses-sdk   droid:minSdkVersion="8"       android:targetSdkVersion="19"        android:maxSdkVersion="9"/>  
文章
测试技术  ·  API  ·  开发工具  ·  Android开发  ·  开发者
2017-10-09
Google确认下一个Android版本将不会使用Oracle的Java API
在下一个Android版本中Google将会把应用程序接口(APIs)的实现替换为OpenJDK,它是Oracle私有的Java开发工具包(JDK)的开源版本。Google确认了Android N将会仅依赖于OpenJDK,而非Android自身实现的Java APIs。一位Google的发言人说:“最为一个开源平台,Android的构建是基于开源社区的合作。在即将到来的Android的下一个版本Android N,我们计划将所有Android的Java语言开发包用OpenJDK实现,从而为开发人员在构建应用程序和服务时提供通用代码库。Google是OpenJDK社区的长期贡献者,并且我们期待在未来为OpenJDK作出更大的贡献。” Android提供了一定的Java API库,以支持使用Java语言来开发Android apps,这些库分为两部分:API库和Google开发的API库的实现代码。Oracle开发的Java,其API库由两种实现:专有的JDK版本和开源的OpenJDK版本。Google决定全面使用OpenJDK,其实Android在一些地方早已开始使用了,使用OpenJDK意味着要开源这部分的实现代码。 这个code commit表明修改了8902个文件,明确表示了OpenJDK代码被加进了Android中: Initial import of OpenJdk files. Create new libcore/ojluni directory with src/main/java and src/main/native subdirectiories. Build ojluni into core-oj jar. Use openjdk classes from java.awt.font package. Copy all files from jdk/src/share/classes and jdk/src/solaris/classes directories in openjdk into libcore/ojluni/src/main/java. Copy following native files from openjdk to libcore/ojluni/src/main/native: [long list of files] Google一直希望Android开发者能够接受这些改变,因为它在开发apps时有助于简化代码 —— 使用单一共同的Java API代码库而非使用多代码库。这些原因可能是真实的,但并非完全转向OpenJDK的全部原因,如果是这样的话几年前Google早就这么干了。当Google发言人被问到为什么是现在,Google指出是去年发布的Java 8和Java语言的一些新特性例如lambdas。Google想要为OpenJDK投入更多资源,这样团队就能对新特性和技术改进有更大的影响力和发言权。 当然这其中还涉及大量的版权问题,代码的提交是否意味着Oracle和Google之间关于Java APIs的法律诉讼是否已经庭外和解,由于Oracle的诉讼还在进行,Google对于代码提交和诉讼是否有关拒绝作出评论。2010年1月Oracle收购Sun之后,Oracle在2010年8月起诉Google的版权和专利侵权,认为Android在未经授权的情况下使用了Java API。Google反驳称,APIs不受版权保护,因为它对于软件开发、协作和创新是必不可少的。在2012年5月,一个陪审团认为Java的API不受版权保护,Google对Oracle的专利侵犯不成立。2014年5月,联邦巡回上诉法院部分逆转了区法院的判决,认定Java API受版权保护。就在2015年6月,美国最高法院拒绝审理此案,案件发回下级法院继续审理。在这些与Oracle的对决之后,Google已经决定彻底拥抱OpenJDK了么?不管怎么样,结局是确定的:Android未来的版本将基于OpenJDK而非Oracle专有的JDK版本。 不管怎么样,案件还未结束,Google也无法改变现有的Android版本,业界人士对此案的裁决异常关注,因为这将对软件开发产生巨大的影响。如果Oracle胜诉,开发者基于现有应用和服务开发新的软件都将产生版权问题。如果Google胜了,APIs的使用将不会受到版权保护。 本文转自d1net(转载)
文章
Oracle  ·  Java  ·  关系型数据库  ·  API  ·  Android开发
2017-07-04
Andriod Supoort库实现andriod程序向下兼容
项目中引入andriod supoort库实现向下兼容 android api向来是高版本兼容低版本,如api-8(android2.2)必会兼容api-4(android 1.6)但是反之则不会,你使用2.2的平台版本build了一个apk,若想能在1.6上运行,则需要做向下兼容。android support是google官方的向下兼容包。 具体引入兼容包步骤 方法1:右击项目→选择Android Tools→Add Support Library… 方法2: 从你的Android SDK安装目录(例如,<sdk>/extras/android/support/v4/android-support-v4.jar)下拷贝JAR文件到你项目的libs/目录下。 Android Support v4:  这个包是为了照顾1.6及更高版本而设计的,这个包是使用最广泛的,eclipse新建工程时,都默认带有了。 Android Support v7:  这个包是为了考虑照顾2.1及以上版本而设计的,但不包含更低,故如果不考虑1.6,我们可以采用再加上这个包,另外注意,v7是要依赖v4这个包的,即,两个得同时被包含。 Android Support v13:这个包的设计是为了android 3.2及更高版本的,一般我们都不常用,平板开发中能用到。 本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1652938
文章
Android开发  ·  Java  ·  API  ·  开发工具
2016-08-28
Android Studio3.0新的依赖指令
前言 Android studio 版本更新至3.0,同时也出现了两个新的依赖指令:implement 和api。 在com.android.tools.build:gradle 3.0 以下版本依赖在gradle 中的声明写法: compile fileTree(dir: 'libs', include: ['*.jar']) 3.0后的写法为 implementation fileTree(dir: 'libs', include: ['*.jar']) 或 api fileTree(dir: 'libs', include: ['*.jar']) 新增两个指令的区别 api 指令完全等同于compile指令,没区别 implement指令的特点是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开。 图片解释 用api指令编译,Glide依赖对app Module 是可见的 image 用implement指令编译依赖对app Module 是不可见的 image 建议 在Google IO 相关话题的中提到了一个建议,就是依赖首先应该设置为implement的,如果没有错,那就用implement,如果有错,那么使用api指令,这样会使编译速度有所增快。
文章
Java  ·  API  ·  Android开发
2018-04-16
Google证实下一版Android不再使用Oracle专属的Java API
Google正计划将Java应用程序接口(APIs)从Orcale专属的Java开发套件(JDK)换成开源的OpenJDK。Hacker News在上月率先曝光了“神秘的Android代码库”,而Google亦向VentureBeat证实“Android N”将仅仅依赖于OpenJDK,而不是Android自有的Java API版本。 一名Google发言人告诉VentureBeat: 作为一个开源的平台,Android建立在开源社区的协作之上。 在我们即将发布的新版Android中,我们计划将Android的Java语言库迁移至OpenJDK,以便为开发者们打造一个用于构建应用和服务的常见代码库。 Google长期致力于贡献和携手OpenJDK社区,我们期待未来能够为OpenJDK项目作出更大的贡献。 Android提供了某些Java API库来支持Java变成语言的应用开发,这主要分成2个部分——面向库的APIs,以及由Google开发的、能够让库工作起来的部署代码。 至于Java的“现东家”,甲骨文(Oracle)有两种这些库的实现方法——专有的JDK版本、以及开源的OpenJDK版本。 Google决定“巩固”OpenJDK方面的努力,且Android早已在某些地方用上了它,这意味着该公司会分享它的实现代码。 Initial import of OpenJdk files. Create new libcore/ojluni directory with src/main/java and src/main/native subdirectiories. Build ojluni into core-oj jar. Use openjdk classes from java.awt.font package. Copy all files from jdk/src/share/classes and jdk/src/solaris/classes directories in openjdk into libcore/ojluni/src/main/java. Copy following native files from openjdk to libcore/ojluni/src/main/native: [long list of files] 上文提到的“代码提交”指明已有8902个文件改动,明确指出了OpenJDK代码已被加入Android。 Google希望开发者们会对这一改动感到欣喜,因为这简化了他们构建应用程序时的代码(这些Java API库的通用代码、而不是多个代码库)。 本文作者:佚名 来源:51CTO
文章
Oracle  ·  Java  ·  关系型数据库  ·  API  ·  Android开发
2017-08-08
在Eclipse中查看Android SDK的源代码
1. 下载android.jar对于版本的source code      http://git.source.android.com/?p=platform/frameworks/base.git;a=snapshot;h=android-2.3.1_r1;sf=tgz Google的Android SDK中包含一个android.jar文件,里面有Android所有的公开类的API接口。同时,Google还提供了一个Eclipse插件,可以很容易的开始进行开发。但是,这里并没有一个类似于androidSrc.jar的文件,因此当我们试图在Eclipse去查看Android SDK的源代码的时候,会得到下面这样的一个页面: Google已经发布了Android所有的源代码,很大。要在Eclipse中查看Android的源代码,需要去http://source.android.com/(国内需),Get Source那个页面内按照指示一步步的将所有的东西都通过Git弄下来。很值得抽出一个晚上的时间来做这件事,因为如果能够随时查看源码,对于理解SDK如何工作的是非常有帮助的。 链接到Eclipse 现在我们有了源码,应该可以告诉Eclipse如何找到它了。右键点击android.jar——属性,可是却发现了这样的信息: 嗯....那段话的大意是,当前的class path的设置属于'Android Library',不允许用户修改。好吧,只能去看看ADT的源码了,看能否找到什么办法。 本文转自wanqi博客园博客,原文链接:http://www.cnblogs.com/wanqieddy/archive/2011/08/08/2131012.html如需转载请自行联系原作者
文章
开发工具  ·  Android开发  ·  git  ·  API
2018-01-01
添加Firestore时重复的类
最近将Firebase-Firestore添加到我的android项目中,并且在构建时开始获取对protobuf中的类的重复引用。 build.gradle // Top-level build file where you can add configuration options common to all // sub-projects/modules. buildscript { ext.protobufVersion = '0.8.6' repositories { google() jcenter() maven { url 'https://maven.fabric.io/public' } maven { url "https://jcenter.bintray.com" } maven { url "https://jitpack.io" } } dependencies { classpath 'com.android.tools.build:gradle:3.5.3' classpath 'io.fabric.tools:gradle:1.31.2' classpath 'com.google.gms:google-services:4.3.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.41" classpath 'com.akaita.android:easylauncher:1.3.1' classpath "com.google.protobuf:protobuf-gradle-plugin:$protobufVersion" } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'com.akaita.android.easylauncher' apply plugin: 'com.google.protobuf' repositories { google() jcenter() mavenCentral() maven { url 'https://jitpack.io' } maven { url 'https://maven.fabric.io/public' } } configurations { playstoreImplementation compatImplementation freeCompatImplementation stagingCompatImplementation } ext { supportLibVersion = '28.0.0' } dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' /*playstoreImplementation('com.google.firebase:firebase-messaging:15.0.2') { exclude group: 'com.google.firebase', module: 'firebase-core' }*/ compatImplementation 'androidx.emoji:emoji-appcompat:1.0.0' freeCompatImplementation 'androidx.emoji:emoji-bundled:1.0.0' stagingCompatImplementation 'androidx.emoji:emoji-bundled:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'org.sufficientlysecure:openpgp-api:10.0' implementation 'com.github.inputmice:Android-Image-Cropper:2.7.2' implementation 'androidx.legacy:legacy-support-v13:1.0.0' implementation 'androidx.appcompat:appcompat:1.1.0-rc01' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.emoji:emoji:1.0.0' implementation 'com.google.android.material:material:1.1.0-alpha07' implementation 'org.bouncycastle:bcmail-jdk15on:1.58' implementation 'org.whispersystems:signal-protocol-java:2.6.2' implementation 'org.conscrypt:conscrypt-android:1.3.0' implementation 'rocks.xmpp:xmpp-addr:0.8.0' implementation 'org.osmdroid:osmdroid-android:6.0.1' implementation 'de.measite.minidns:minidns-hla:0.2.4' implementation 'me.leolin:ShortcutBadger:1.1.22@aar' implementation 'com.makeramen:roundedimageview:2.3.0' implementation 'com.wefika:flowlayout:0.4.1' implementation 'net.ypresto.androidtranscoder:android-transcoder:0.2.0' implementation 'org.hsluv:hsluv:0.2' //Butterknife dependency implementation 'com.jakewharton:butterknife:10.2.0' kapt 'com.jakewharton:butterknife-compiler:10.2.0' //Network Retrofit and okhttp implementation('com.squareup.retrofit2:retrofit:2.1.0') { // exclude Retrofit’s OkHttp dependency module and define your own module import exclude module: 'okhttp' } implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0' implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'com.hbb20:ccp:2.2.3' implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' implementation 'com.crashlytics.sdk.android:answers:1.4.7' implementation 'com.google.firebase:firebase-core:17.2.1' implementation 'com.google.firebase:firebase-messaging:20.1.0' implementation 'com.google.firebase:firebase-config:19.1.0' implementation 'com.google.firebase:firebase-dynamic-links:19.0.0' implementation 'com.google.firebase:firebase-database:19.2.0' implementation 'com.google.firebase:firebase-firestore:21.3.1' implementation 'com.wdullaer:swipeactionadapter:2.0.0' implementation 'com.wdullaer:materialdatetimepicker:3.2.0' implementation 'io.michaelrocks:libphonenumber-android:8.10.1' implementation 'com.google.code.gson:gson:2.8.5' implementation 'ch.halcyon:squareprogressbar:1.6.4' implementation 'com.github.zawadz88:material-activity-chooser:0.2.2' implementation 'com.urbanairship.android:urbanairship-fcm:11.0.1' implementation 'commons-codec:commons-codec:1.12' implementation 'com.github.kal72:RackMonthPicker:1.6.0' implementation "android.arch.work:work-runtime:1.0.0-alpha11" implementation 'org.apache.commons:commons-lang3:3.9' implementation 'org.greenrobot:eventbus:3.1.1' implementation 'com.google.android.play:core:1.6.4' implementation 'com.google.protobuf:protobuf-lite:3.0.1' //What's new library implementation('io.github.tonnyl:whatsnew:0.1.2') { exclude module: 'annotations' } //Showcase view library implementation 'com.github.amlcurran.showcaseview:library:5.4.3' implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.mikhaellopez:circularimageview:3.2.0' implementation 'com.facebook.fresco:fresco:2.0.0' implementation files('libs/YouTubeAndroidPlayerApi.jar') //firebase analytics implementation 'com.google.firebase:firebase-analytics:17.2.0' //https://jitpack.io/p/kapilmhr/AlphabetIndexFastScrollRecyclerview implementation 'com.github.kapilmhr:AlphabetIndexFastScrollRecyclerview:1.0.0' } ext { travisBuild = System.getenv("TRAVIS") == "true" preDexEnabled = System.getProperty("pre-dex", "true") } android { compileSdkVersion 28 signingConfigs { company{ {...} } } defaultConfig { minSdkVersion 21 targetSdkVersion 28 versionCode 120 versionName "2.10.3" archivesBaseName += "-$versionName" applicationId "com.company.chat" resValue "string", "applicationId", applicationId resValue "string", "app_name", "Company" multiDexEnabled true vectorDrawables { useSupportLibrary = true } } dataBinding { enabled true } dexOptions { // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false. preDexLibraries = preDexEnabled && !travisBuild jumboMode true javaMaxHeapSize "2g" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } flavorDimensions("distribution", "emoji") productFlavors { /*playstore { dimension "distribution" versionNameSuffix "+p" }*/ free { dimension "distribution" {...} } staging { dimension "distribution" {...} system { dimension "emoji" versionNameSuffix "s" } compat { dimension "emoji" } } buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //versionNameSuffix "r" signingConfig signingConfigs.company zipAlignEnabled true } debug { applicationIdSuffix ".dev" shrinkResources false minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } lintOptions { checkReleaseBuilds false disable 'MissingTranslation', 'InvalidPackage', 'MissingQuantity', 'AppCompatResource' } subprojects { afterEvaluate { if (getPlugins().hasPlugin('android') || getPlugins().hasPlugin('android-library')) { configure(android.lintOptions) { disable 'AndroidGradlePluginVersion', 'MissingTranslation' } } } } packagingOptions { exclude 'META-INF/BCKEY.DSA' exclude 'META-INF/BCKEY.SF' } // https://proandroiddev.com/how-to-setup-your-android-app-to-use-protobuf-96132340de5c // Added to fix duplicate classes issue protobuf { protoc { // You still need protoc like in the non-Android case artifact = 'com.google.protobuf:protoc:3.0.0' } plugins { javalite { // The codegen for lite comes as a separate artifact artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0' } } generateProtoTasks { all().each { task -> task.builtins { // In most cases you don't need the full Java output // if you use the lite output. remove java } task.plugins { javalite { } } } } } sourceSets{ main.java.srcDirs += "${protobuf.generatedFilesBaseDir}/main/javalite" } } 为了解决该错误,我在这里和此处遵循了相应的解决方法,因此在protobuf中继续出现以下错误。 Duplicate class com.google.protobuf.AbstractMessageLite found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.AbstractMessageLite$Builder found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.AbstractMessageLite$Builder$LimitedInputStream found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.AbstractParser found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar) com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.ByteString found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.ByteString$1 found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.ByteString$ByteIterator found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.ByteString$CodedBuilder found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.ByteString$Output found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.CodedInputStream found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.CodedOutputStream found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) Duplicate class com.google.protobuf.CodedOutputStream$OutOfSpaceException found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) ... Go to the documentation to learn how to Fix dependency resolution errors.
问答
Java  ·  Go  ·  Maven  ·  Android开发
2020-01-06
Android studio 中引用jar的其实是Maven?(二)
上一篇:Android studio 中引用jar的其实是Maven?(一) 搭建maven仓库:   去了解一个新的事物的时候,最好的方式就是去使用它。例如去了解一座城市的时候,最好的方式就是乘坐公共交通工具。    根据上一遍的初始Maven可以知道,android studio中使用的仓库是jcenter中央仓库,这个仓库是本来就集合在gradle中的。看,进入这个jcenter方法之后,可以看到都是引用了gradle工程的jar包。所以这个jcenter是一个gradle中公共的仓库                     由于Android Studio使用了Gradle构建工具,在library依赖的处理上是将被依赖的library作为一个module引入(拥有一份完整的library拷贝),而Eclipse的ADT则是直接将library作为外部项目依赖链接进来,两者各有各的优缺点。Android Studio的好处是能时刻保持项目的完整性,每一个项目都包含了整个项目所需要的一切东西,当你把项目共享给别人的时候就不会因为落下某个library而导致别人无法正常打开你的项目。缺点则是多个项目都依赖同一个library,每个项目都有自己一份library代码拷贝,当这个library的代码需要更新的时候,每一个项目中的library代码都需要更新一遍。而Eclipse的library依赖,只是做了一个library链接,多个项目可以链接到同一个library,好处是library需要修改的时候只需要修改一处代码,缺点时与他人共享项目的时候可能会落下library忘记共享。    一般一个公司长期开发累积下来,都会总结出一套自己的SDK或者工具供自己的产品使用。如果使用Android Studio开发,一旦自己的SDK需要更新难免就会遇到前面说的问题。好在Android Studio除了library module依赖这种方法之外,还提供了本地仓库或者(服务器)远程仓库依赖,通过Gradle工具自动从仓库中获取并管理项目所需要的library。Gradle支持maven仓库,早期的Android Studio直接使用的就是maven中央仓库,虽然正式版之后改用jcenter,但是依然可以混用自定义的maven仓库。 所以如果我们有SDK,并且是使用Android Studio进行开发的话,那么我们就需要把我们的SDK发布到jcenter仓库中去了。因此我们首先要学会发布代码到jcenter中。 具体的步骤可以参考以下非常详细的说明:   如何使用Android Studio把自己的Android library分享到jCenter和Maven Central     一般来说,经过上面的步骤发布到jcenter的代码或jar包都是提供给别人进行使用,但对于自己公司的sdk或者工具类,把这些内容公布在jcenter中就显得没有那么安全。毕竟任何人都可以通过访问jcenter的网址对jar包进行下载,一旦公司中的关键技术泄露出去,对公司影响甚大,特别有着支付板块的代码。所以我们需要拥有我们自己地代码仓库。 如何在Linux服务器上搭建自己的Maven                   搭建简单的Maven之后,我们需要把我们的代码jar包发布到自己的Maven中。在发布之前,我们先来看看我们是如何获取仓库中的jar包的。我们拿android studio的一个项目。         1.首先我们通过android studio的界面操作,加入一个google的gson库。          加入了这个gson之后,我们看到工程目录下的build.gradle文件已经更新。       更新的内容为: compile 'com.google.code.gson:gson:2.2.4'    2.了解公共库地址的构建    其中compile为默认的字段,后面是目标库的地址。这个lib的地址字符串包含了三部分,分别用冒号隔开:  GROUP_ID:ARTIFACT_ID:VERSION     所以上面gson的例子中,Group_ID就是com.google.code.gson,Artifact_ID就是gson,VersionID就是2.2.4。    其实,这里的配置结合我上文找到的jcenter的域名一组成了目标jar的地址。    域名:https://repo1.maven.org/maven2/    结合上面lib地址字符串之后的地址:https://repo1.maven.org/maven2/com/google/code/gson/gson/2.2.4/          仓库中存储的有两种类型的library:jar 和 aar。jar文件大家都知道,但是什么是aar文件呢?      aar文件时在jar文件之上开发的。之所以有它是因为有些Android Library需要植入一些安卓特有的文件,比如AndroidManifest.xml,资源文件,Assets或者JNI。这些都不是jar文件的标准。     因此aar文件就时发明出来包含所有这些东西的。总的来说它和jar一样只是普通的zip文件,不过具有不同的文件结构。jar文件以classes.jar的名字被嵌入到aar文件中。其余的文件罗列如下: [java] view plain copy  print? - /AndroidManifest.xml (mandatory)   - /classes.jar (mandatory)   - /res/ (mandatory)   - /R.txt (mandatory)   - /assets/ (optional)   - /libs/*.jar (optional)   - /jni/<abi>/*.so (optional)   - /proguard.txt (optional)   - /lint.jar (optional)   可以看到.aar文件是专门为安卓设计的。           3.确定jar包在仓库中的地址      先看我们如何获取jar包,有了上面的jar地址规则,我们就可以获取一个已有的仓库中的一个jar。      如图,一个已经搭建好的Nexus仓库中,找到这个仓库的公开地址:(红线覆盖的地方)           得到这个仓库的公开地址之后,我们要找寻一个jar来供我们android studio中使用。     因此在界面的左侧我输入了一个远程库下载下来的log4j来搜索。     此时的界面为:         红框中你可以到,这个log4j-api的jar包的所在仓库组:Central  ,GroupID : org.apache.logging.log4j  ,artifactId:log4j-api,version:2.3.     为了证实该jar是否可以找到,可以按照上面的方法,拼接这个jar的所在位置的url: /Central仓库地址/org.apache.logging.log4j/log4j-api/2.3.     那么我们在android studio中如何引用这个jar包呢?     1.打开工程的下面的build.xml     (配置jCenter()的那么build.xml)     2.配置仓库地址到maven插件中。          3.配置compile ,到需要使用log4j的工程中的build.xml中,加入: 也可以使用上面的android加入仓库代码的界面操作。 上一篇:Android studio 中引用jar的其实是Maven?(一) 参考:http://www.open-open.com/lib/view/open1435109824278.html            http://techtalk.alo7.com/?p=220
文章
Java  ·  开发工具  ·  Maven  ·  Android开发
2016-03-21
...
跳转至:
开发与运维
5322 人关注 | 128030 讨论 | 213593 内容
+ 订阅
  • 悟了,应该都了解分布式架构下负载均衡器吧
  • 学习C++笔记408
  • 学习C++笔记407
查看更多 >
数据库
250028 人关注 | 46006 讨论 | 67845 内容
+ 订阅
  • 动态web 静态web
  • javaweb(JSP):网页代码
  • 关于对ESC的体验结果
查看更多 >