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/
// 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/
// 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 模式,可以打断点调试了