# jar+res 依赖引入

---

`jar+res`是 Eclipse 等早期 IDE 和老版游戏引擎采用的依赖结构，基于此结构的接入方式称为`jar+res`方式。  
随着 Android Studio 的普及和游戏引擎的更新，已出现更便捷安全的接入方式——aar。

## aar 取代 jar+res 
基于但不限于以下原因，SDK 以 `aar` 接入方式取代`jar+res` 

- **接入成本**：`jar+res`需要很多手动操作，易导致疏漏，如拷贝错误，遗漏混淆规则、权限、Activity 注册，   
  而 `aar` 只需要确认版本即可
- **adt废弃**：Eclipse 的 Android 开发环境 adt 已不再更新（2015年底），而 as 则在不断更新增强
- **功能受限**： Android 官方依赖库和第三方库的新版本逐渐不支持`jar+res`，导致许多功能受限，  
  如`Androidx`无法在 eclipse 中使用；支付宝 SDK 无法更新
- **游戏引擎支持完善**：主流的游戏开发引擎，如Unity、Cocos、Unreal早已支持 as 构建方式
- **兼容问题**：即使使用低版本的依赖库，在高版本系统也会可能发生问题  
  如`FileProvider`对`external-files-path`的支持
- **更新困难**：更新 SDK，`aar` 只需升级版本号并确认接口，而`jar+res`要重复首次接入的大部分操作，风险大

<span style="color:purple">但两种接入方式主要是引入SDK的方式不同，之后的接口调用方式是一致的</span>

## 依赖引入
下载 [最新的jar+res](https://sdkftp.4399doc.com/external/operate/3.20.0/operate-3.20.0+726.zip) ，假设`jar+res`以`operate`目录发布，解压后的结构类似于
```
├── AndroidManifest.xml
├── assets
├── libs
├── proguard-rules.pro
└── res
```

开发者可能有两种方式使用它，一是*构建项目依赖*（如 eclipse 依赖），二是*手动整合到游戏项目*。

### 拷贝 SDK

构建依赖，需要整体拷贝`operate`目录    
需要注意的是，`assets`下的文件若放在 eclipse 依赖模块中，不会打到 apk 中；可以拷贝到主模块的对应目录

手动整合，要完整拷贝以下目录到游戏工程对应目录（建议用脚本完成）：
- `AndroidManifest.xml`：Android 清单文件
- `assets`：assets 资源
- `libs`：SDK 的 jar 包和所有 abi 类型的 so（可忽略不支持 abi 对应的so）
- `proguard-rules.pro`：在游戏的 proguard 文件里追加此文件描述的规则
- `res`：res 资源

<span style="color:red">**不管哪种方式，都要确保`operate/AndroidManifest.xml`中的所有内容，最终打包到游戏的`AndroidManifest.xml`中**</span>

### 特别注意：调整`OpeFileProvider`

`AndroidManifest.xml`中的<span style="color:red">**`android:authorities="${applicationId}.operate.FileProvider"`占位符要替换成游戏包名**</span>。  
例如包名`cn.m4399.operate.demo`，替换后将变成`android:authorities="cn.m4399.operate.demo.operate.FileProvider"`

```xml
<application>
    <!-- 游戏 Activity 配置建议
        应该使用 android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|navigation|smallestScreenSize|fontScale" 
        不应该使用 android:launchMode="singleTask" 启动模式，可以考虑 singleTop
    -->

    <!--
        4399 运营SDK：以下是FileProvider配置，以兼容7.0+文件访问权限变更

        注意其中的： 
           android:authorities="游戏包名.operate.FileProvider"
           android:resource="@xml/m4399_ope_file_paths" 是固定格式写法
     -->
    <provider
        android:name="cn.m4399.operate.OpeFileProvider"
        android:authorities="${applicationId}.operate.FileProvider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/m4399_ope_file_paths" />
    </provider>
</application>
```

## aar 与 jar+res接入方式差别总结
`aar` 与 `jar+res` 接入方式（特别是手动整合的方式）对比

接入点 |含义|aar |jar+res  
:---|:---|:---|:---  
`uses-permission` |应用权限|-|手动添加  
`queries` |应用包可见性| - |手动添加  
`android:networkSecurityConfig` |Android 9+ http请求|- |手动添加 
`OpeFileProvider` |文件访问权限配置|-|手动添加  
`org.apache.http.legacy` |apache 旧网络库|-|手动添加  
所有的`activity`|SDK 及其依赖的页面|可覆盖|手动添加  
混淆配置|SDK 及其依赖的混淆规则 |-|手动添加  
第三方依赖|volley与support依赖|在线依赖|手动拷贝

其中`aar`大都是“-”，表示引入aar后不需要额外处理，因为它们内置在aar中
