文档库 最新最全的文档下载
当前位置:文档库 › eclipse+gradle解决android 65k 方法问题

eclipse+gradle解决android 65k 方法问题

eclipse+gradle解决65k method问题

问题描述:

我的开发环境eclipse 4.3, sdk 4.4.2(19)。项目工程如下:

Iphone为主工程,其他工程为依赖包。源码和jar包太多,运行时出现以下错误

[2015-06-12 12:26:57 - Dex Loader] Unable to execute dex: method ID not in [0, 0xffff]: 65536

[2015-06-12 12:26:57 - Iphone] Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

采用Android dex分包方案解决,步骤如下

(注:以下过程中涉及到网络下载,最后准备好翻墙工具。我用的是goagent+gogotester)eclipse配置代理:

(1)在eclipse.ini最后加入如下内容:

-DproxySet=true

-DproxyHost=127.0.0.1

-DproxyPort=8087

(2)打开eclipse window-->Preferences-->然后如下图

一、安装gradle

1.1、下载gradle-

2.2.1-bin.zip

(https://https://www.wendangku.net/doc/1714034255.html,/distributions/gradle-2.2.1-bin.zip)

1.2、解压到安装目录

如:D:\wangxw\program\gradle-2.2.1)

1.3、配置环境变量

GRADLE_HOME和path

二、下载sdk5.0(21)

将新下载的android-21集成到以前的sdk路径下

2.1、platforms下加上android-21

2.1、build-tools下增加21.1.2

2.3、extras增加multidex。

将sdk21 extras包下的multidex和multidex-instrumentation包复制过来

三、配置build.gradle

3.1、进入workspace下增加文件 build.gradle和settings.gradle

build.gradle文件内容如下:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

repositories {

mavenCentral()

}

dependencies {

classpath 'com.android.tools.build:gradle:0.14.+'

}

}

settings.gradle文件内容如下:(此步根据个人工程项目来编辑)

include ':IncomingCallActivity'

include ':imphone'

include ':Iphone'

include ':actionbarsherlock'

include ':libs'

include ':voipphone'

include ':jmsdk'

include ':phonesdk'

3.2、为每个工程配置 build.gradle

主工程如下图:

主工程Iphone中的build.gradle内容如下:

buildscript {

repositories {

mavenCentral()

}

dependencies {

classpath 'com.android.tools.build:gradle:0.14.+'

}

}

apply plugin: 'android'

dependencies {

compile fileTree(dir: 'libs', include: '*.jar')

compile project(':imphone')

compile 'com.android.support:multidex:1.0.0'

}

android {

compileSdkVersion 19

buildToolsVersion "21.1.2"

enforceUniquePackageName=false

lintOptions{

abortOnError false

}

defaultConfig {

minSdkVersion 14

targetSdkVersion 19

// Enabling multidex support.

multiDexEnabled true

}

signingConfigs {

myrelease {

keyAlias 'androiddebugkey'

keyPassword 'android'

storeFile

file('C:\\Users\\Administrator\\.android\\debug.keystore') storePassword 'android'

}

}

buildTypes {

release {

minifyEnabled true

proguardFile

getDefaultProguardFile('proguard-android.txt')

signingConfig signingConfigs.myrelease

}

}

dexOptions {

preDexLibraries = false

}

sourceSets {

main {

manifest.srcFile 'AndroidManifest.xml'

java.srcDirs = ['.apt_generated','src']

resources.srcDirs = ['.apt_generated','src']

aidl.srcDirs = ['.apt_generated','src']

renderscript.srcDirs = ['.apt_generated','src']

res.srcDirs = ['res']

assets.srcDirs = ['assets']

}

// Move the tests to tests/java, tests/res, etc...

instrumentTest.setRoot('tests')

// Move the build types to build-types/

// For instance, build-types/debug/java,

build-types/debug/AndroidManifest.xml, ...

// This moves them out of them default location under src//... which would

// conflict with src/ being used by the main source set. // Adding new build types or product flavors should be accompanied

// by a similar customization.

debug.setRoot('build-types/debug')

release.setRoot('build-types/release')

}

}

afterEvaluate {

tasks.matching {

https://www.wendangku.net/doc/1714034255.html,.startsWith('dex')

}.each { dx ->

if (dx.additionalParameters == null) {

dx.additionalParameters = ['--multi-dex']

}else {

dx.additionalParameters += '--multi-dex'

}

}

}

副工程中每个工程也需配置build.gradle

如下图:

build.gradle内容如下:

apply plugin: 'android-library'

dependencies {

compile fileTree(dir: 'libs', include: '*.jar') compile project(':phonesdk')

}

android {

compileSdkVersion 19

buildToolsVersion "21.1.2"

enforceUniquePackageName=false

lintOptions{

abortOnError false

}

defaultConfig {

minSdkVersion 14

targetSdkVersion 19

}

sourceSets {

main {

manifest.srcFile 'AndroidManifest.xml'

java.srcDirs = ['src']

resources.srcDirs = ['src']

aidl.srcDirs = ['src']

renderscript.srcDirs = ['src']

res.srcDirs = ['res']

assets.srcDirs = ['assets']

jniLibs.srcDirs = ['libs']

}

// Move the tests to tests/java, tests/res, etc...

instrumentTest.setRoot('tests')

// Move the build types to build-types/

// For instance, build-types/debug/java,

build-types/debug/AndroidManifest.xml, ...

// This moves them out of them default location under src//... which would

// conflict with src/ being used by the main source set. // Adding new build types or product flavors should be accompanied

// by a similar customization.

debug.setRoot('build-types/debug')

release.setRoot('build-types/release')

}

}

3.3、为主工程Iphone加android-support-multidex

将android-support-multidex.jar引入到工程中。

(注:最好放在referenced libraies中,而不是放在libs下,这样避免build时jar包重复)

然后在Application中覆盖方法

注:这里有三种方式:

?在AndroidManifest.xml的application中声明android.support.multidex.MultiDexApplication;

?如果你已经有自己的Application类,让其继承MultiDexApplication;

?如果你的Application类已经继承自其它类,你不想/能修改它,那么可以重写attachBaseContext()方法:根据自身情况选择一种方式。

补充:

1、如果依赖工程比较多,觉得3.2对每个project写一个build.gradle很麻烦。可以为eclipse

下载gradle插件,然后export来做。(前提是能够下载gradle插件)

步骤如下:

(1) 打开eclipse-->Help-->Eclipse Marketplace

(2) 在search中输入gradle integration for eclipse搜索

根据eclipse版本选择一个install

(3) 如果上面成功的话。window-->Preferences-->Gradle

选择gradle主目录和用户目录

(4) export生成build.gradle

右键主工程(Iphone)-->Export-->Generate Gradle build files

然后就会自动生成项目下的build.gradle文件。再对比上面内容,把没有的配置项一一加上buildToolsV ersion要在21以上

2、上面的签名信息不知怎么配置时。如下:

(1)打开eclipse-->Window-->Preferences-->Android-->Build找到证书位置

(2) 进入证书文件所在目录。输入命令:

keytool -list -v -keystore debug.keystore -storepass android

查看证书别名(此证书默认密码是:android)

(3) 如果没有可用的key,可以通过命令向证书文件添加一条(做之前先将证书备份)

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000

然后一系列的名称输入

四、打包apk

前面的完成后可以build apk包了

打开cmd-->cd 进入Iphone目录.输入:gradle build --stacktrace

最终Build successful为止

查看build目录下的apk包

其中Iphone-debug.apk为调试的apk包,Iphone-release.apk为发布包打开apk包,可以看见.dex被分成了多个

五、常见问题

步骤四中,会遇到很多种情况错误,常见错误如下:

(1)

解决方法:找到sdk中的proguard-android.txt文件

在文件最后添加,你需要忽略警告的包名:

(2) 如果是报duplicate entry:xxxx.class。一定是jar冲突了,可能是多个project中都引入了相同的jar,需要剔除掉重复的jar。如下:

因为在build.gradle中:

如果把android-support-multidex.jar放到了libs目录下,那么上面这种写法肯定就导致两次引入了次jar包。

解决方法,将android-support-multidex.jar放到另外目录下

在同add to Build path方法引入项目就不会报错了

六、eclipse+gradle的方式怎样在android真机上debug

6.1、下载eclipse插件ADT-21.1.0.zip

解压开分别将plugins和fetures包下的内容复制到eclipse相应文件夹

6.2、部署debug.apk并重启eclipse

(1) 将output/apk文件夹下的xx-debug.apk上传安装到手机上

(2) 在连接上手机的情况下,打开eclipse-->window-->show view-->other-->Devices

如上图:选择你手机上的软件包名,然后点击右上角的绿色小蜘蛛启动debug。进入debug 模式,可以打断点调试了

相关文档