安卓 eclipse 项目 迁移 android studio gradle 配置 热修复 annotations注解

Posted 当富网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓 eclipse 项目 迁移 android studio gradle 配置 热修复 annotations注解相关的知识,希望对你有一定的参考价值。





repositories 
    mavenCentral()
    mavenLocal()
    jcenter()



buildscript 
    repositories 
        mavenCentral()
        mavenLocal()
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:2.1.0'

        // annotations 注解
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'

        //  tinker 热修复
        classpath "com.tencent.tinker:tinker-patch-gradle-plugin:$TINKER_VERSION"

    


apply plugin: 'android'

//  tinker热修复
apply plugin: 'com.tencent.tinker.patch'

//Android annotations
apply plugin: 'android-apt'
def AAVersion = '3.3.1'

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

    compile("com.tencent.tinker:tinker-android-lib:$TINKER_VERSION")   changing = true 
    compile("com.tencent.tinker:tinker-android-anno:$TINKER_VERSION")   changing = true 
    compile "com.android.support:multidex:1.0.1"

    //Android annotations编译jar包路径
    apt "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"



def gitSha() 
    try 
        String gitRev = 'git rev-parse --short HEAD'.execute().text.trim()
        if (gitRev == null) 
            throw new GradleException("can't get git rev, you should add git to system path or just input test value, such as 'testTinkerId'")
        
        return gitRev
     catch (Exception e) 
        throw new GradleException("can't get git rev, you should add git to system path or just input test value, such as 'testTinkerId'")
    


def javaVersion = JavaVersion.VERSION_1_7


android 
    compileSdkVersion 19
    buildToolsVersion "23.0.2"

    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    

    //recommend
    dexOptions 
        jumboMode = true
        //最大堆处理
        incremental = true;
        preDexLibraries = false
        javaMaxHeapSize "4g" // 2g should be also OK
    

    lintOptions
        disable "ResourceType"
        checkReleaseBuilds false
        abortOnError false
    


    packagingOptions 
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    

    sourceSets 
        main 
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['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/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... 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')
    

    signingConfigs 
        release 
            try 
                storeFile file("./keystore/release.keystore")
                storePassword "abc!@#\\$410"
                keyAlias "xxx"
                keyPassword "abc!@#\\$410"
             catch (ex) 
                throw new InvalidUserDataException(ex.toString())
            
        

        debug 
            //storeFile file("./keystore/debug.keystore")
            try 
                storeFile file("./keystore/debug.keystore")
                storePassword "abc!@#\\$410<span style="font-family: Arial, Helvetica, sans-serif;">xx\\$xx</span>"
                keyAlias "xxx"
                keyPassword "xx\\$xx"
             catch (ex) 
                throw new InvalidUserDataException(ex.toString())
            
        
    

    defaultConfig 
        applicationId "com.pggmall.chatuidemo"
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 1
        versionName "2.0.0"
        /**
         * you can use multiDex and install it in your ApplicationLifeCycle implement
         */
        multiDexEnabled true
        /**
         * not like proguard, multiDexKeepProguard is not a list, so we can't just
         * add for you in our task. you can copy tinker keep rules at
         * build/intermediates/tinker_intermediates/tinker_multidexkeep.pro
         */
        multiDexKeepProguard file("keep_in_main_dex.txt")
        /**
         * buildConfig can change during patch!
         * we can use the newly value when patch
         */
        buildConfigField "String", "MESSAGE", "\\"I am the base apk\\""
//        buildConfigField "String", "MESSAGE", "\\"I am the patch apk\\""
        /**
         * client version would update with patch
         * so we can get the newly git version easily!
         */
        buildConfigField "String", "CLIENTVERSION", "\\"$gitSha()\\""
        buildConfigField "String", "PLATFORM",  "\\"all\\""
    
//    //use to test flavors support
//    productFlavors 
//        flavor1 
//            applicationId 'tinker.sample.android.flavor1'
//        
//
//        flavor2 
//            applicationId 'tinker.sample.android.flavor2'
//        
//    

    buildTypes 
        release 
            minifyEnabled false
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
        debug 
            debuggable true
            minifyEnabled false
            signingConfig signingConfigs.debug
        
    




def bakPath = file("$buildDir/bakApk/")

/**
 * you can use assembleRelease to build you base apk
 * use tinkerPatchRelease -POLD_APK=  -PAPPLY_MAPPING=  -PAPPLY_RESOURCE= to build patch
 * add apk from the build/bakApk
 */
ext 
    //for some reason, you may want to ignore tinkerBuild, such as instant run debug build?
    tinkerEnabled = true
    //you should bak the following files
    //old apk file to build patch apk
    tinkerOldApkPath = "$bakPath/pggmall_native-debug-1017-10-38-09.apk"
    //proguard mapping file to build patch apk
    tinkerApplyMappingPath = "$bakPath/"
    //resource R.txt to build patch apk, must input if there is resource changed
    tinkerApplyResourcePath = "$bakPath/pggmall_native-debug-1017-10-38-09-R.txt"



def getOldApkPath() 
    return hasProperty("OLD_APK") ? OLD_APK : ext.tinkerOldApkPath


def getApplyMappingPath() 
    return hasProperty("APPLY_MAPPING") ? APPLY_MAPPING : ext.tinkerApplyMappingPath


def getApplyResourceMappingPath() 
    return hasProperty("APPLY_RESOURCE") ? APPLY_RESOURCE : ext.tinkerApplyResourcePath


def getTinkerIdValue() 
    //return hasProperty("TINKER_ID") ? TINKER_ID : gitSha()
    return "tinkerId"


def buildWithTinker() 
    return hasProperty("TINKER_ENABLE") ? TINKER_ENABLE : ext.tinkerEnabled


if (buildWithTinker()) 
    apply plugin: 'com.tencent.tinker.patch'

    tinkerPatch 
        /**
         * necessary,default 'null'
         * the old apk path, use to diff with the new apk to build
         * add apk from the build/bakApk
         */
        oldApk = getOldApkPath()
        /**
         * optional,default 'false'
         * there are some cases we may get some warnings
         * if ignoreWarning is true, we would just assert the patch process
         * case 1: minSdkVersion is below 14, but you are using dexMode with raw.
         *         it must be crash when load.
         * case 2: newly added Android Component in AndroidManifest.xml,
         *         it must be crash when load.
         * case 3: loader classes in dex.loader are not keep in the main dex,
         *         it must be let tinker not work.
         * case 4: loader classes in dex.loader changes,
         *         loader classes is ues to load patch dex. it is useless to change them.
         *         it won't crash, but these changes can't effect. you may ignore it
         * case 5: resources.arsc has changed, but we don't use applyResourceMapping to build
         */
        ignoreWarning = true
        /**
         * optional,default 'true'
         * whether sign the patch file
         * if not, you must do yourself. otherwise it can't check success during the patch loading
         * we will use the sign config with your build type
         */
        useSign = true

        /**
         * Warning, applyMapping will affect the normal android build!
         */
        buildConfig 
            /**
             * optional,default 'null'
             * if we use tinkerPatch to build the patch apk, you'd better to apply the old
             * apk mapping file if minifyEnabled is enable!
             * Warning:
             * you must be careful that it will affect the normal assemble build!
             */
            applyMapping = getApplyMappingPath()
            /**
             * optional,default 'null'
             * It is nice to keep the resource id from R.txt file to reduce java changes
             */
            applyResourceMapping = getApplyResourceMappingPath()

            /**
             * necessary,default 'null'
             * because we don't want to check the base apk with md5 in the runtime(it is slow)
             * tinkerId is use to identify the unique base apk when the patch is tried to apply.
             * we can use git rev, svn rev or simply versionCode.
             * we will gen the tinkerId in your manifest automatic
             */
            tinkerId =  getTinkerIdValue()
        

        dex 
            /**
             * optional,default 'jar'
             * only can be 'raw' or 'jar'. for raw, we would keep its original format
             * for jar, we would repack dexes with zip format.
             * if you want to support below 14, you must use jar
             * or you want to save rom or check quicker, you can use raw mode also
             */
            dexMode = "jar"
            /**
             * necessary,default '[]'
             * what dexes in apk are expected to deal with tinkerPatch
             * it support * or ? pattern.
             */
            pattern = ["classes*.dex",
                       "assets/secondary-dex-?.jar"]
            /**
             * necessary,default '[]'
             * Warning, it is very very important, loader classes can't change with patch.
             * thus, they will be removed from patch dexes.
             * you must put the following class into main dex.
             * Simply, you should add your own application @code tinker.sample.android.SampleApplication
             * own tinkerLoader, and the classes you use in them
             *
             */
            loader = ["com.tencent.tinker.loader.*",
                      "com.pggmall.chatuidemo.MyApplication",
                      //use sample, let BaseBuildInfo unchangeable with tinker
                      "com.tinker.app.BaseBuildInfo"
            ]
        

        lib 
            /**
             * optional,default '[]'
             * what library in apk are expected to deal with tinkerPatch
             * it support * or ? pattern.
             * for library in assets, we would just recover them in the patch directory
             * you can get them in TinkerLoadResult with Tinker
             */
            pattern = ["lib/armeabi/*.so"]
        

        res 
            /**
             * optional,default '[]'
             * what resource in apk are expected to deal with tinkerPatch
             * it support * or ? pattern.
             * you must include all your resources in apk here,
             * otherwise, they won't repack in the new apk resources.
             */
            pattern = ["res/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]

            /**
             * optional,default '[]'
             * the resource file exclude patterns, ignore add, delete or modify resource change
             * it support * or ? pattern.
             * Warning, we can only use for files no relative with resources.arsc
             */
            ignoreChange = ["assets/sample_meta.txt"]

            /**
             * default 100kb
             * for modify resource, if it is larger than 'largeModSize'
             * we would like to use bsdiff algorithm to reduce patch file size
             */
            largeModSize = 100
        

        packageConfig 
            /**
             * optional,default 'TINKER_ID, TINKER_ID_VALUE' 'NEW_TINKER_ID, NEW_TINKER_ID_VALUE'
             * package meta file gen. path is assets/package_meta.txt in patch file
             * you can use securityCheck.getPackageProperties() in your ownPackageCheck method
             * or TinkerLoadResult.getPackageConfigByName
             * we will get the TINKER_ID from the old apk manifest for you automatic,
             * other config files (such as patchMessage below)is not necessary
             */
            configField("patchMessage", "tinker is sample to use")
            /**
             * just a sample case, you can use such as sdkVersion, brand, channel...
             * you can parse it in the SamplePatchListener.
             * Then you can use patch conditional!
             */
            configField("platform", "all")

        
        //or you can add config filed outside, or get meta value from old apk
        //project.tinkerPatch.packageConfig.configField("test1", project.tinkerPatch.packageConfig.getMetaDataFromOldApk("Test"))
        //project.tinkerPatch.packageConfig.configField("test2", "sample")

        /**
         * if you don't use zipArtifact or path, we just use 7za to try
         */
        sevenZip 
            /**
             * optional,default '7za'
             * the 7zip artifact path, it will use the right 7za with your platform
             */
            zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
            /**
             * optional,default '7za'
             * you can specify the 7za path yourself, it will overwrite the zipArtifact value
             */
//        path = "/usr/local/bin/7za"
        
    



    /**
     * bak apk and mapping
     */
    android.applicationVariants.all  variant ->
        /**
         * task type, you want to bak
         */
        def taskName = variant.name

        tasks.all 
            if ("assemble$taskName.capitalize()".equalsIgnoreCase(it.name)) 
                it.doLast 
                    copy 
                        def date = new Date().format("MMdd-HH-mm-ss")
                        from "$buildDir/outputs/apk/$project.getName()-$taskName.apk"
                        into bakPath
                        rename  String fileName ->
                            fileName.replace("$project.getName()-$taskName.apk", "$project.getName()-$taskName-$date.apk")
                        

                        from "$buildDir/outputs/mapping/$taskName/mapping.txt"
                        into bakPath
                        rename  String fileName ->
                            fileName.replace("mapping.txt", "$project.getName()-$taskName-$date-mapping.txt")
                        

                        from "$buildDir/intermediates/symbols/$taskName/R.txt"
                        into bakPath
                        rename  String fileName ->
                            fileName.replace("R.txt", "$project.getName()-$taskName-$date-R.txt")
                        
                    
                
            
        
    






以上是关于安卓 eclipse 项目 迁移 android studio gradle 配置 热修复 annotations注解的主要内容,如果未能解决你的问题,请参考以下文章

从 Eclipse 导入项目到 Android Studio

eclipse怎么运行安卓项目

将使用 NDK 和 Gstreamer 的 Eclipse android 项目迁移到 Android Studio

eclipse项目迁移到android studio(图文最新版)

Android官方开发文档之从Eclipse迁移到Android Studio开发篇

eclipse JNI项目迁移android studio相关问题