Android组件化之路记录

踩坑

组件化资源

ARouter使用

或多或少都会用到路由跳转,这里用到ARouter

基础配置
  • 官方文档
  • common 统一引入 api ‘com.alibaba:arouter-api:1.4.1’
  • 配置每个module 的build.gradle文件
defaultConfig {    
         ...
       /*2.ARouter 配置,使用到的每个module都需要配置;*/  
       /*包括common*/    
       javaCompileOptions {       
          annotationProcessorOptions {  
          arguments = [AROUTER_MODULE_NAME: project.getName() ] 
          }   
        }
 }
 
dependencies {    
            ...
            /* 每个module都需要加入*/   
            //路由跳转框架;    
            annotationProcessor  'com.alibaba:arouter-compiler:1.2.2'
}
在kotlin中的初始化配置

apply plugin: 'kotlin-kapt'

kapt {
    arguments {
        arg("AROUTER_MODULE_NAME", project.getName())
    }
}

dependencies {
    compile 'com.alibaba:arouter-api:x.x.x'
    kapt 'com.alibaba:arouter-compiler:x.x.x'
    ...
}
  • 在application初始化SDK
if (isDebug()) {           // 这两行必须写在init之前,否则这些配置在init过程中将无效
    ARouter.openLog();     // 打印日志
    ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
基础使用
  • 给Activity加上注解
   @Route(path = /groupname/name)
   public class TestActivity {
       ...
   }
  • 要调用的地方使用
ARouter.getInstance().build(RApp.RLoginActivity)        .navigation(MainApplication.get());
  • 携带参数跳转
ARouter.getInstance().build("/test/1")
            .withLong("key1", 666L)
            .withString("key3", "888")
            .withObject("key4", new Test("Jack", "Rose"))
            .navigation();
// 接收参数 自动连接:
@Autowired(name = "key")
public String recString;
// 接收参数 getIntent传统方式
// 先加入这一句
ARouter.getInstance().inject(this);

int data = getIntent().getIntExtra(“key”, 0);
...
  • 其他方式引用不同Module下的Activity : 使用完整路径名(com.example.module.testactivity)

build.gradle 配置

  • 参考一份我自己项目下的文件,详情看注释
/*1.需要根据模式修改类型*/
if (isModule.toBoolean()) { // 在gradle.properties 下定义一个isModule变量
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}
// kotlin 相关
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android { // 版本统一管理
    compileSdkVersion build_version.target_sdk 
    buildToolsVersion build_version.build_tools


    defaultConfig {
        minSdkVersion build_version.min_sdk
        targetSdkVersion build_version.target_sdk
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        consumerProguardFiles 'consumer-rules.pro'
    }

    /*2.设置模块化时编译模块等;*/
    sourceSets.main {
        if (isModule.toBoolean()) {
            //模块化时;
            manifest.srcFile 'src/moduledebug/AndroidManifest.xml'
            java.srcDirs = [
                    'src/moduledebug/java',
                    'src/main/java'
            ]
            res.srcDirs = [
                    'src/moduledebug/res',
                    'src/main/res'
            ]
            //assets.srcDirs = [] ;
        } else {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java {
                exclude 'src/moduledebug/java/**'  // 不想包含文件的路径
                exclude '**/package-info.java'
            }
            res {
                exclude 'src/moduledebug/res/**' // 不想包含的资源文件路径
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }

}

// 3、kotlin 配置ARouter
kapt {
    arguments {
        arg("AROUTER_MODULE_NAME", project.getName())
    }
    generateStubs = true
}


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    api project(':module_main')
    // ARouter
    /* 每个module都需要加入*/
    api deps.arouter_api
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    kapt deps.arouter_compiler
}

自定义输出apk名字

    //自定义apk名字    applicationVariants.all { variant ->  
    variant.outputs.all { output ->   
    def outputFile = output.outputFile 
    if (outputFile != null && outputFile.name.endsWith('.apk')) { 
     // apk_渠道名-版本号-版本名称-编译时间.apk
    def fileName = 
        "MyPlayer-${variant.buildType.name}-${defaultConfig.versionCode}-V${defaultConfig.versionName}__${buildTime()}.apk"  
outputFileName = fileName        
      }      
    }  
}


读取config.gradle的配置信息

def propertiesFile = file('../config.properties')
Properties props = new Properties()props.load(new FileInputStream(propertiesFile))
props.load(new FileInputStream(propertiesFile))

version.gradle 依赖版本配置

项目下的build.gradle
buildscript {

apply from: ‘version.gradle’ // version.gradle 存放依赖版本信息

}

Bug 记录

No module name

上面两个没有配置好,或者是Compiler的版本配置问题
1.2.0之前:设置模块名的参数:moduleName
1.2.0之后:设置模块名的参数:AROUTER_MODULE_NAME

buildOutput.apkData must not be null

AS缓存问题

  • clean、build
  • 不行就 Invalidate Cache / restart
  • 再不行 删除.gradle文件夹,检查gradle版本

Binary XML file line #24: Binary XML file line #24: Error inflating class LinearLayout

发现项目上用了autolayout,但是在androidmanifest文件配置 默认 分辨率导致崩溃,类似的场景有很多

集成模式下,通过统一的接口来初始化各个单独的模块

参考这篇文章

极光、百度等SDK移到common包 初始化失败

No implementation found for int com.baidu.platform.comjni.engine.JNIEngine.initClass
0、检查以来、jar包
1、将这几个相关的so库移到common包
2、build.gradle :

defaultConfig{
        ...
        ndk {    
             abiFilters androidVersion.abiFilters
        }
}

3、如果还报错,加上applicationId "com.xxxx"试试,因为有些appkey是绑定包名的

部分引用在androidmanifest文件的参数

使用 manifestPlaceholders 替换

manifestPlaceholders = [        UMENG_CHANNEL_VALUE: "login" //使用 debug模式下的企业环境
]

多渠道打包 替换资源文件

step1

build.gradle 文件

android{

    productFlavors {   
        product1 { 

        }    
        product2 {

        }
        productFlavors.all {flavor -> flavor.manifestPlaceholders = 
             [UMENG_CHANNEL_VALUE: name]  
        }
    }
}
step2

在main 文件夹建立同级目录,资源文件可以直接替换

不同模块使用FileProvider

重新申明,authority里用 getPackageName 代替BuildConfig.APPLICATION_ID

AndroidManifest里重新声明

<provider   
android:name="android.support.v4.content.FileProvider"    
android:authorities="${applicationId}.provider"   
android:exported="false" 
android:grantUriPermissions="true">
<meta-data        
android:name="android.support.FILE_PROVIDER_PATHS"  
android:resource="@xml/provider_paths"/>

</provider> 

解决BufferKnife在组件中的使用问题

项目下的build.gradle

buildscript {   
 
dependencies {   
    ...     
    classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0'      
}   

模块下的build.gradle

apply plugin: 'com.jakewharton.butterknife'

dependencies {  
    ...
    implementation dependen.butterknife      
    kapt dependen.butterknife_compiler
}



发布了27 篇原创文章 · 获赞 6 · 访问量 1652

猜你喜欢

转载自blog.csdn.net/weixin_41802023/article/details/102914455